{"id":13564256,"url":"https://github.com/jumppad-labs/jumppad","last_synced_at":"2026-04-10T08:15:54.648Z","repository":{"id":38012111,"uuid":"224637580","full_name":"jumppad-labs/jumppad","owner":"jumppad-labs","description":"Modern cloud native development environments","archived":false,"fork":false,"pushed_at":"2024-04-12T09:44:12.000Z","size":44297,"stargazers_count":235,"open_issues_count":9,"forks_count":24,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-04-12T16:35:44.125Z","etag":null,"topics":["developer-tools","docker","go","kubernetes"],"latest_commit_sha":null,"homepage":"https://jumppad.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jumppad-labs.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-11-28T11:23:32.000Z","updated_at":"2024-08-07T17:20:32.985Z","dependencies_parsed_at":"2023-10-23T15:56:58.490Z","dependency_job_id":"9fae6d2f-2666-4f5e-b696-955b91877aec","html_url":"https://github.com/jumppad-labs/jumppad","commit_stats":null,"previous_names":["shipyard-run/shipyard","shipyard-run/cli"],"tags_count":242,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumppad-labs%2Fjumppad","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumppad-labs%2Fjumppad/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumppad-labs%2Fjumppad/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumppad-labs%2Fjumppad/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jumppad-labs","download_url":"https://codeload.github.com/jumppad-labs/jumppad/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247082884,"owners_count":20880735,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["developer-tools","docker","go","kubernetes"],"created_at":"2024-08-01T13:01:28.730Z","updated_at":"2026-04-10T08:15:54.642Z","avatar_url":"https://github.com/jumppad-labs.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# jumppad\n\n![build](https://github.com/jumppad-labs/jumppad/actions/workflows/build_and_deploy.yaml/badge.svg)  \n\n![release](https://img.shields.io/github/v/release/jumppad-labs/jumppad.svg?style=flat)  \n\n[![codecov](https://codecov.io/gh/jumppad-labs/jumppad/branch/master/graph/badge.svg)](https://codecov.io/gh/jumppad-labs/jumppad)\n\nJumppad is a tool for building modern cloud native development environments. Using the Jumppad configuration language you can create OCI containers, Nomad/Kubernetes clusters and more.\n\n## Community\n\nJoin our community on Discord: [https://discord.gg/ZuEFPJU69D](https://discord.gg/ZuEFPJU69D)\n\n## Questions\n\n### Is Jumppad like Terraform?\n\nKind of, but more about local environments rather than infrastructure\n\n### Why not use Docker Compose?\n\nDocker Compose is one of our favourite tools but we found it does not manage dependencies particulary well. Compose also works on a really low level of abstraction. Jumppad addresses these missing features.\n\n### Is Jumppad just for Docker?\n\nNo, Jumppad is designed to work with Docker, Podman, Raw binaries, etc. At present we only have a Driver for Docker and Podman, but others are on our Roadmap.\n\n### Can I use Jumppad for anything other than Dev environments?\n\nYes, Jumppad can be used to create interactive documentation for your applications and redistributable demo environments to show off your tool or product.\n\n## Example Jumppad Config\n\nThe following snippets are examples of things you can build with Jumppad, for more detailed examples please see the Blueprints repo [https://github.com/shipyard-run/blueprints](https://github.com/shipyard-run/blueprints)\n\n### Kubernetes Cluster\n\n```hcl\nresource \"network\" \"cloud\" {\n  subnet = \"10.5.0.0/24\"\n}\n\nresource \"k8s_cluster\" \"k3s\" {\n  driver = \"k3s\" // default\n\n  nodes = 1 // default\n\n  network {\n    id = resource.network.cloud.id\n  }\n\n  copy_image {\n    name = \"ghcr.io/jumppad-labs/connector:v0.4.0\"\n  }\n}\n\nresource \"k8s_config\" \"fake_service\" {\n  cluster = resource.k8s_cluster.k3s\n\n  paths = [\"./fake_service.yaml\"]\n\n  health_check {\n    timeout = \"240s\"\n    pods    = [\"app.kubernetes.io/name=fake-service\"]\n  }\n}\n\nresource \"helm\" \"vault\" {\n  cluster = resource.k8s_cluster.k3s\n\n  repository {\n    name = \"hashicorp\"\n    url  = \"https://helm.releases.hashicorp.com\"\n  }\n\n  chart   = \"hashicorp/vault\"\n  version = \"v0.18.0\"\n\n  values = \"./helm/vault-values.yaml\"\n\n  health_check {\n    timeout = \"240s\"\n    pods    = [\"app.kubernetes.io/name=vault\"]\n  }\n}\n\nresource \"ingress\" \"vault_http\" {\n  port = 18200\n\n  target {\n    resource = resource.k8s_cluster.k3s\n    port = 8200\n\n    config = {\n      service   = \"vault\"\n      namespace = \"default\"\n    }\n  }\n}\n\nresource \"ingress\" \"fake_service\" {\n  port = 19090\n\n  target {\n    resource = resource.k8s_cluster.k3s\n    port = 9090\n\n    config = {\n      service   = \"fake-service\"\n      namespace = \"default\"\n    }\n  }\n}\n\noutput \"VAULT_ADDR\" {\n  value = resource.ingress.vault_http.address\n}\n\noutput \"KUBECONFIG\" {\n  value = resource.k8s_cluster.k3s.kubeconfig\n}\n\n```\n\n### Nomad Cluster\n\n```hcl\nresource \"network\" \"cloud\" {\n  subnet = \"10.10.0.0/16\"\n}\n\nresource \"nomad_cluster\" \"dev\" {\n  client_nodes=3\n\n  network {\n    id = resource.network.cloud.id\n  }\n}\n\nresource \"nomad_job\" \"example_1\" {\n  cluster = resource.nomad_cluster.dev\n\n  paths = [\"./app_config/example1.nomad\"]\n\n  health_check {\n    timeout    = \"60s\"\n    nomad_jobs = [\"example_1\"]\n  }\n}\n\nresource \"ingress\" \"fake_service_1\" {\n  port = 19090\n\n  target {\n    resource   = resource.nomad_cluster.dev\n    named_port = \"http\"\n\n    config = {\n      job   = \"example_1\"\n      group = \"fake_service\"\n      task  = \"fake_service\"\n    }\n  }\n}\n```\n\n### Docker Container\n\n```hcl\nresource \"container\" \"unique_name\" {\n    depends_on = [\"resource.container.another\"]\n\n    network {\n        id         = resource.network.cloud.id\n        ip_address = \"10.16.0.200\"\n        aliases    = [\"my_unique_name_ip_address\"]\n    }\n\n    image {\n        name     = \"consul:1.6.1\"\n        username = \"repo_username\"\n        password = \"repo_password\"\n    }\n\n    command = [\n        \"consul\",\n        \"agent\"\n    ]\n\n    environment = {\n        CONSUL_HTTP_ADDR = \"http://localhost:8500\"\n    }\n\n    volume {\n        source      = \"./config\"\n        destination = \"/config\"\n    }\n\n    port {\n        local  = 8500\n        remote = 8500\n        host   = 18500\n    }\n    \n    port_range {\n        range       = \"9000-9002\"\n        enable_host = true\n    }\n\n    privileged = false\n}\n```\n\n## Podman support\n\nPodman support is experimental and at present many features such as Kubernetes clusters do not work with rootless podman and require root access.\n\n### Enable the podman socket\n\nJumppad uses podman's API, which is compatible with the Docker Enginer API. To enable this, you need to run the podman socket as a group that your user has access to. The following example uses the `docker` group:\n\n```shell\nsudo sed '/^SocketMode=.*/a SocketGroup=docker' -i /lib/systemd/system/podman.socket\n```\n\nThen emable the podman socket service\n\n```shell\nsudo systemctl daemon-reload\n\nsudo systemctl enable podman.socket\nsudo systemctl enable podman.service\nsudo systemctl start podman.socket\nsudo systemctl start podman.service\n```\n\nFor sockets to be writable they also require execute permission on the parent folder\n\n```shell\nsudo chmod +x /run/podman\n```\n\nPoint your DOCKER_HOST environment variable at the socket\n\n```shell\nexport DOCKER_HOST=unix:///run/podman/podman.sock\n```\n\nIf you have the Docker CLI installed you should be able to contact the podman daemon using the standard Docker commands\n\n```shell\ndocker ps\n```\n\n### Default network\n\n```shell\n➜ sudo podman network ls\nNETWORK ID    NAME    VERSION  PLUGINS\n2f259bab93aa  podman  0.4.0    bridge,portmap,firewall,tuning\n```\n\n### Registries\n\nImage pull silently fails if there are no registries defined in podmans /etc/containers/registries.conf\n\n```shell\necho -e \"[registries.search]\\nregistries = ['docker.io']\" | sudo tee /etc/containers/registries.conf\n```\n\n### DNS\n\nMultiple network cause DNS resolution problems\nhttps://github.com/containers/podman/issues/8399\n\nEnabling name resolution\n\n#### Install dnsmasq\n\nFirst ensure systemd is not using port 53\nhttps://www.linuxuprising.com/2020/07/ubuntu-how-to-free-up-port-53-used-by.html\n\nInstall dnsmasq\n\n```shell\nsudo apt install dnsmasq\n```\n\nConfigure dnsmasq for external name server resolution or external network connections will not work\n\n![Install the podman dns plugin](https://github.com/containers/dnsname/blob/main/README_PODMAN.md).\n\n## Contributing\n\nWe love contributions to the project, to contribute, first ensure that there is an issue and that it has been acknowledged by one of the maintainers of the project. Ensuring an issue exists and has been acknowledged ensures that the work you are about to submit will not be rejected due to specifications or duplicate work.\nOnce an issue exists, you can modify the code and raise a PR against this repo. We are working on increasing code coverage, please ensure that your work has at least 80% test coverage before submitting.\n\n## Testing\n\nThe project has two types of tests, pure code Unit tests and Functional tests, which apply real blueprints to a locally-running Docker engine and test output.\n\n### Unit tests\n\nTo run the unit tests you can use the make recipe `make test_unit` this runs the `go test` and excludes the functional tests.\n\n```shell\njumppad on  master via 🐹 v1.13.5 on 🐳 v19.03.5 ()\n➜ make test_unit\ngo test -v -race github.com/jumppad-labs/jumppad github.com/jumppad-labs/jumppad/cmd github.com/jumppad-labs/jumppad/pkg/clients github.com/jumppad-labs/jumppad/pkg/clients/mocks github.com/jumppad-labs/jumppad/pkg/config github.com/jumppad-labs/jumppad/pkg/providers github.com/jumppad-labs/jumppad/pkg/jumppad github.com/jumppad-labs/jumppad/pkg/utils\ntesting: warning: no tests to run\nPASS\nok      github.com/jumppad-labs/jumppad        (cached) [no tests to run]\n=== RUN   TestSetsEnvVar\n--- PASS: TestSetsEnvVar (0.00s)\n=== RUN   TestArgIsLocalRelativeFolder\n--- PASS: TestArgIsLocalRelativeFolder (0.00s)\n=== RUN   TestArgIsLocalAbsFolder\n--- PASS: TestArgIsLocalAbsFolder (0.00s)\n=== RUN   TestArgIsFolderNotExists\n--- PASS: TestArgIsFolderNotExists (0.00s)\n=== RUN   TestArgIsNotFolder\n--- PASS: TestArgIsNotFolder (0.00s)\n=== RUN   TestArgIsBlueprintFolder\n--- PASS: TestArgIsBlueprintFolder (0.00s)\n=== RUN   TestArgIsNotBlueprintFolder\n```\n\n### Functional tests\n\nTo run the functional tests ensure that Docker is running in your environment then run `make test_functional`. functional tests are executed with GoDog cucumber test runner for Go. Note: These tests execute real blueprints and can a few minutes to run.\n\n```shell\n➜ make test_functional\ncd ./functional_tests \u0026\u0026 go test -v ./...\nFeature: Docmentation\n  In order to test the documentation feature\n  something\n  something\n\n  Scenario: Documentation                                              # features/documentaion.feature:6\n    Given the config \"./test_fixtures/docs\"                            # main_test.go:77 -\u003e theConfig\n2020-02-08T17:03:25.269Z [INFO]  Creating Network: ref=wan\n2020-02-08T17:03:40.312Z [INFO]  Creating Documentation: ref=docs\n2020-02-08T17:03:40.312Z [INFO]  Creating Container: ref=docs\n2020-02-08T17:03:40.490Z [DEBUG] Attaching container to network: ref=docs network=wan\n2020-02-08T17:03:41.187Z [INFO]  Creating Container: ref=terminal\n2020-02-08T17:03:41.271Z [DEBUG] Attaching container to network: ref=terminal network=wan\n    When I run apply                                                   # main_test.go:111 -\u003e iRunApply\n    Then there should be 1 network called \"wan\"                        # main_test.go:149 -\u003e thereShouldBe1NetworkCalled\n    And there should be 1 container running called \"docs.docs.jumppad.dev\" # main_test.go:115 -\u003e thereShouldBeContainerRunningCalled\n    And a call to \"http://localhost:8080/\" should result in status 200 #\n\n# ...\n\n3 scenarios (3 passed)\n16 steps (16 passed)\n3m6.79621s\ntesting: warning: no tests to run\nPASS\n```\n\n## Creating a release\n\nTo create a release creae a PR and ensure that the major/minor/patch tags have been added to the PR so that the semver is automatically updated.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjumppad-labs%2Fjumppad","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjumppad-labs%2Fjumppad","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjumppad-labs%2Fjumppad/lists"}