A platform for packaging and launching ephemeral backend stacks with a focus on approachability for the average developer.
Key metrics and engagement data
Repository has been active for 2 years, 5 months
⭐100
Want deeper insights? Explore GitObs.com
Have you ever tried to build on top of a colleague's work, or contribute to an open source project, just to get stuck on the first steps of spinning up a stack to play with? Kurtosis handles the complexity of spinning up ephemeral dev or test stacks so you can focus on developing, not configuring.
Kurtosis is formed of:
Kurtosis is best for:
Kurtosis operates at a level higher than Docker Compose or Helm, and produces stacks running on either of the underlying engines (the Docker engine, or Kubernetes). Because of this additional layer of abstraction, we are able to introduce several features to improve the experience of spinning up ephemeral stacks:
NOTE: we do NOT recommend using Kurtosis to deploy long term production environments at this moment. Any issues/Discords related to production usage will be closed.
To see Kurtosis in action, first install it using the instructions here.
Then, run the Redis voting app Kurtosis package:
bash1kurtosis run github.com/kurtosis-tech/awesome-kurtosis/redis-voting-app
Finally, open the http
link printed in the last line in your browser.
If you have an issue or feature request, we'd love to hear about it through one of the following:
kurtosis feedback --bug
or kurtosis feedback --feature
)To try more Kurtosis packages just like this one, check out the awesome-kurtosis
repo!
To learn about how to write Kurtosis packages, check out our quickstart.
To read about how Kurtosis works, see our documentation.
To see where we're going with the product, check out the roadmap here.
Got more questions? Drop them in our Github Discussions where we, or other community members, can help answer.
See our CONTRIBUTING file.
This repository is structured as a monorepo, containing the following projects:
container-engine-lib
: Library used to abstract away container engine being used by the enclave.core
: Container launched inside an enclave to coordinate its stateengine
: Container launched to coordinate enclavesapi
: Defines the API of the Kurtosis platform (engine
and core
)cli
: Produces CLI binary, allowing interaction with the Kurtosis systemdocs
: Documentation that is published to docs.kurtosis.cominternal_testsuites
: End to end testsInstall the Nix package manager.
bash1sh <(curl -L https://nixos.org/nix/install)
And enable some Nix flags (alternatively you can add --extra-experimental-features 'nix-command flakes'
every time calling the nix
command):
bash1mkdir -p ~/.config/nix2echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
And to bring the environment up, just open a new shell terminal, go to the root folder of the repo and run:
bash1nix develop
This will download all dev deps and setup the environment accordingly.
You can also use the direnv
to automatically load the environment when entering the main folder or using a plugin in your preferred IDE:
vscode
: mkhl.direnvjet brains
: Direnv integrationDirenv can also be easily installed with Nix (or HomeBrew if you prefer):
bash1nix-env -f '<nixpkgs>' -iA direnv
Now you just to add the direnv hook to your shell:
bash1echo 'eval "$(direnv hook bash)"' >> ~/.bashrc2# or for ZSH3echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
Now next time you open a new shell terminal and go to repo's folder you environment will update and load automatically.
The commands below assume that the env variable BREW_PREFIX contains the brew prefix.
bash1BREW_PREFIX="$(brew --prefix)"
On MacOS:
bash1# Install modern version of bash, the one that ships on MacOS is too old2brew install bash3# Allow bash as shell4echo "${BREW_PREFIX}/bin/bash" | sudo tee -a /etc/shells5# Optional: make bash your default shell6chsh -s "${BREW_PREFIX}/bin/bash"
On MacOS:
bash1# Install modern version of git, the one that ships on MacOS can be too old2brew install git
On MacOS:
bash1brew install docker
On MacOS:
bash1brew install [email protected]2# Add the Go binary dir to your PATH3PATH="${BREW_PREFIX}/opt/[email protected]/bin:$PATH"4# Add the GOPATH bin dir to your PATH5PATH="${HOME}/go/bin:$PATH"
On Ubuntu:
bash1wget https://go.dev/dl/go1.23.7.linux-amd64.tar.gz2tar -C /usr/local -zxf go1.23.7.linux-amd64.tar.gz3# Add the following to your bashrc or equivalent.4export PATH=$PATH:/usr/local/go/bin
On MacOS:
bash1brew install goreleaser/tap/goreleaser
On Ubuntu:
bash1echo 'deb [trusted=yes] https://repo.goreleaser.com/apt/ /' | sudo tee /etc/apt/sources.list.d/goreleaser.list2sudo apt update3sudo apt install goreleaser
On MacOS, using NVM
:
bash1brew install nvm2mkdir ~/.nvm3nvm install 20.11.04npm install -g yarn
On Ubuntu, using NVM
:
bash1curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash2source ~/.bashrc3nvm install 20.11.04npm install -g yarn
On MacOS, Ubuntu:
bash1curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
On MacOS:
bash1brew install protoc-gen-go2brew install protoc-gen-go-grpc3go install connectrpc.com/connect/cmd/protoc-gen-connect-go@latest4yarn global add ts-protoc-gen5yarn global add grpc-tools
On Ubuntu:
bash1go install google.golang.org/grpc/cmd/protoc-gen-go@latest2go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest3go install connectrpc.com/connect/cmd/protoc-gen-connect-go@latest4yarn global add ts-protoc-gen5yarn global add grpc-tools
On MacOS:
bash1go install github.com/deepmap/oapi-codegen/cmd/[email protected]2yarn global add [email protected]
On Ubuntu:
bash1go install github.com/deepmap/oapi-codegen/cmd/[email protected]2yarn global add [email protected]
To build the entire project, run:
bash1./scripts/build.sh
Note: If you encounter module import errors related to github.com/kurtosis-tech/kurtosis/kurtosis_version
, you may need to generate the version constants first:
bash1./scripts/generate-kurtosis-version.sh
This script generates the required kurtosis_version.go
file that contains version constants used throughout the codebase. The file is automatically generated during the build process, but may need to be run manually in some development scenarios.
To only build a specific project, run the script on ./PROJECT/PATH/script/build.sh
, for example:
bash1./container-engine-lib/scripts/build.sh2./core/scripts/build.sh3./api/scripts/build.sh4./engine/scripts/build.sh5./cli/scripts/build.sh
If there are any changes to the Protobuf files in the api
subdirectory, the Protobuf bindings must be regenerated:
bash1./api/scripts/regenerate-protobuf-bindings.sh
If you are developing Kurtosis over a Podman cluster, run:
bash1./scripts/build.sh false true # no debug image, use podman
This will use the Podman image builder for building images. See documentation in scripts for more details on build options.
After building the project, run ./cli/cli/scripts/launch-cli.sh
just like you would the kurtosis command. This will launch the latest locally built version of the CLI, which will also start the engine and core containers using their latest built images.
You can verify this by running ./cli/cli/launch-cli.sh engine status
and
1A Kurtosis engine is running with the following info:2Version: 53d823 <-- or `-dirty` depending on the commit
The version will be identical to the version on the latest dev versions of the engine image created - (can verify with docker images
). Enclaves started by the engine will be started with the same version as the engine.
If you'd like to specify a different core image version than that of the engine, you can do so with the --api-container-version
flag on enclave add
(e.g. ./cli/cli/scripts/build.sh enclave add --api-container-version <image tag>
).
If you are working on multiple dev versions of the engine at a time, you can use engine restart --version <image tag>
to specify exactly what version of the engine to use.
For frequent contributors, we recommend attaching an alias to kurtosis
and ./cli/cli/scripts/launch-cli.sh
.
bash1alias kt="kurtosis"2alias dkt="$(pwd)/cli/cli/scripts/launch-cli.sh"
If you want tab completion on the recently built CLI, you can alias it to kurtosis
:
bash1alias kurtosis="$(pwd)/cli/cli/scripts/launch-cli.sh"2kurtosis enclave add
Build scripts also run unit tests as part of the build process.
For all Go modules, run go test ./...
on the module folder. For example:
bash1cd cli/cli/2go test ./...
Each project's build script also runs the unit tests inside the project. Running ./script/build.sh
will guarantee that all unit tests in the monorepo pass.
To run the end-to-end tests:
console1$ docker --version2Docker version X.Y.Z
console1$ kurtosis engine status2A Kurtosis engine is running with the following info:3Version: 0.X.Y
test.sh
scriptconsole1$ ./internal_testsuites/scripts/test.sh
If you are developing the Typescript test, make sure that you have first built api/typescript
. Any
changes made to the Typescript package within api/typescript
aren't hot loaded as of 2022-09-29.
For running CLI with Golang remote debug:
bash1cli/cli/scripts/build.sh2source ./scripts/set_kt_alias.sh3ktdebug version
For running CLI with Delve debug client:
bash1cli/cli/scripts/build.sh2source ./scripts/set_kt_alias.sh3ktdebug dlv-terminal version
break
commandbash1(dlv) break version.run:1
continue
commandbash1(dlv) continue
For running Kurtosis engine with Golang remote debug:
debug_mode
as true. This will generate a new Kurtosis engine container image which will contain the debug
suffix in the name.bash1scripts/build.sh true
ktdev engine start --debug-mode
or the ktdev engine restart --debug-mode
commandsbash1source ./scripts/set_kt_alias.sh2ktdev engine start --debug-mode
ktdebug
instead of ktdev
mentioned in a previous step, remember to run both remote debug configurations in the Goland IDE.bash1source ./scripts/set_kt_alias.sh2ktdebug engine start
Additional steps if you are debugging Kurtosis engine in K8s:
bash1# for example:2k3d image load kurtosistech/engine:5ec6eb-dirty-debug
bash1scripts/port-forward-engine-debug.sh
bash1ktdev gateway
For running Kurtosis APIC with Golang remote debug:
debug_mode
as true. This will generate a new Kurtosis APIC container image which will contain the debug
suffix in the name.bash1scripts/build.sh true
bash1source ./scripts/set_kt_alias.sh2ktdev engine start --debug-mode34OR56ktdev engine start # you will have to build the engine in the regular way `engine/scripts/build.sh` if you choose this version
enclave add
command and passing the debug-mode
flag. This will create a new APIC container with the debug server port bounded and waiting for a connection.
IMPORTANT: You can only run one enclave in debug mode so far, if you want to run another one it will fail due the debug port is already in use,bash1ktdev enclave add --debug-mode
ktdebug
instead of ktdev
mentioned in a previous step, remember to run the three remote debug configurations in the Goland IDE.bash1source ./scripts/set_kt_alias.sh2ktdev engine start --debug-mode3ktdebug enclave add
Additional steps if you are debugging Kurtosis engine in K8s:
bash1# for example:2k3d image load kurtosistech/core:5ec6eb-dirty-debug
bash1scripts/port-forward-apic-debug.sh enclave-name
bash1ktdev gateway
Kurtosis is an open source tool maintained by MAINTAINERS. If you find Kurtosis useful or use it for work, please consider supporting the continued development of Kurtosis. Thank you 🙏