{"id":28203885,"url":"https://github.com/function61/turbobob","last_synced_at":"2025-07-27T03:33:40.695Z","repository":{"id":61303765,"uuid":"146426259","full_name":"function61/turbobob","owner":"function61","description":"Modern, minimal container-based build/development tool to make any project´s dev easy and frictionless.","archived":false,"fork":false,"pushed_at":"2025-04-12T12:51:31.000Z","size":2467,"stargazers_count":8,"open_issues_count":31,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-10T14:43:37.761Z","etag":null,"topics":["build-system","build-tool","builder-pattern","continuous-integration"],"latest_commit_sha":null,"homepage":"https://function61.com/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/function61.png","metadata":{"files":{"readme":"README.md","changelog":null,"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,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-08-28T09:48:36.000Z","updated_at":"2025-04-12T12:51:34.000Z","dependencies_parsed_at":"2023-01-31T08:31:12.518Z","dependency_job_id":"69bebb45-782f-45b8-b7c5-5a440a1010b9","html_url":"https://github.com/function61/turbobob","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/function61/turbobob","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Fturbobob","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Fturbobob/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Fturbobob/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Fturbobob/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/function61","download_url":"https://codeload.github.com/function61/turbobob/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/function61%2Fturbobob/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267294180,"owners_count":24065343,"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","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["build-system","build-tool","builder-pattern","continuous-integration"],"created_at":"2025-05-17T03:15:39.120Z","updated_at":"2025-07-27T03:33:40.672Z","avatar_url":"https://github.com/function61.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](misc/mascot/mascot.png)\r\n\r\n![Build status](https://github.com/function61/turbobob/workflows/Build/badge.svg)\r\n[![Download](https://img.shields.io/github/downloads/function61/turbobob/total.svg?style=for-the-badge)](https://github.com/function61/turbobob/releases)\r\n\r\n![](misc/readme-animated-prompt.svg)\r\n\r\nModern, minimal container-based build/development tool to make any project´s dev easy and\r\nfrictionless.\r\n\r\nThink like GitHub actions, but actually runnable locally (and also runnable from GitHub actions).\r\n\r\nNote: while Bob uses containers for builds (and dev), your programs themselves don't need to use containers!\r\n\r\n\r\nIn a nutshell\r\n-------------\r\n\r\n```mermaid\r\nflowchart TD\r\n    GitHub[GitHub actions] --\u003e Build_from_ci[Build from CI]\r\n    GitLab[GitLab CI] --\u003e Build_from_ci\r\n    OtherCI[... CI] --\u003e|In each CI: small boilerplate\\nCI-specific conf to ask\\nBob to do the build| Build_from_ci\r\n    Build_from_ci --\u003e|$ bob build in-ci-autodetect-settings| TurboBob\r\n    Build_locally[Build locally] --\u003e|$ bob build| TurboBob\r\n    Develop_locally[Develop locally] --\u003e|$ bob dev| TurboBob\r\n    TurboBob[Turbo Bob\u003csmall\u003e\\ncontainer-based\\nbuild orchestration\u003c/small\u003e] --\u003e|$ docker run ...| Docker\r\n```\r\n\r\nNotes:\r\n\r\n- Here's what the [GitHub actions boilerplate](https://github.com/function61/turbobob/blob/8ced488edb65fd99c718586a56ecdf5882307c70/.github/workflows/build.yml#L14) looks like for just passing the build to Bob\r\n    * You can think of these as CI-specific adapters for passing control to Turbo Bob\r\n- Then [here's the container image that gets run to do the build](https://github.com/function61/turbobob/blob/51e6c7f5c5b0e7b0c244d670410e6c1a383429a6/turbobob.json#L9)\r\n    * This is reusable container to build all our Go-based projects, i.e. the build environment can be shared across many projects. Ship one improvement to the build environment -\u003e many projects benefit.\r\n\r\nSmall demo screencast\r\n---------------------\r\n\r\n![](docs/demo-screencast.gif)\r\n\r\n\r\nFeatures\r\n--------\r\n\r\n- [GitHub Codespaces](misc/turbobob-codespace) support\r\n- [Log line grouping](https://user-images.githubusercontent.com/630151/194755923-d81df7cf-1e80-40b8-b1b3-886d973fdb4d.mp4) in GitHub actions\r\n- Automatically adds [OCI-compliant metadata](https://github.com/opencontainers/image-spec/blob/main/annotations.md)\r\n  to built containers. ([Example](https://hub.docker.com/r/joonas/hellohttp/tags), click \"latest\")\r\n\r\n\r\nAdditional documentation\r\n------------------------\r\n\r\n- [Using Bob in your project](docs/using-bob-in-your-project/README.md) (also covers\r\n  making your own builder images - \"buildkits\")\r\n- [ENV vars passed to build containers](docs/env-vars-passed-to-build-containers/README.md)\r\n- [Displaying pro-tips on entering the dev environment](docs/dev-pro-tips/README.md) (also covers mapping network ports)\r\n- [Development-time HTTP ingresses](docs/development-time-http-ingresses/README.md) (routing HTTP requests)\r\n- [Customizing dev container startup](docs/customizing-dev-container-startup/README.md)\r\n- [Language server support](docs/language-server-support/README.md) (code completion, analysis, refactoring support etc. for code editors)\r\n- [Quality helpers](docs/quality-helpers/README.md) (multi-project quality scalability by automatically checking standards-compliance like having README, LICENSE, security policy etc.)\r\n\r\n\r\nWhat is this?\r\n-------------\r\n\r\nTurbo Bob (the builder) is an abstraction for building and developing your software, whether it happens in your laptop or in a CI system.\r\n\r\nUsage of Turbo Bob, in every project you're developing:\r\n\r\n```console\r\n$ bob dev\r\n```\r\n\r\nThis gives you a shell inside the build environment container with the working directory mounted inside the container so that you can directly edit your code files from your host system.\r\n\r\nTo build your project:\r\n\r\n```console\r\n$ bob build\r\n```\r\n\r\nBy keeping these commands consistent across each project we'll minimize friction with\r\nmental context switching, since the commands are the same for each project whether\r\nyou're building a Docker-based image or running anything custom that produces build\r\nartefacts.\r\n\r\nThere's a [document that your project can link to](docs/external-how-to-build-and-dev.md)\r\nfor build \u0026 help instructions. This explains Bob's value proposition quite well and serves\r\nas the first introduction for new Bob users. See an\r\n[example of a project's build docs linking to Bob](https://github.com/function61/ruuvinator#how-to-build--develop).\r\n\r\n\r\nPhilosophy\r\n----------\r\n\r\n- Your project must support a simple `build` and `dev` interface. If you can't, you're\r\n  probably doing something wrong and you should simplify it. The `build` command usually just\r\n  runs your project's `bin/build.sh` (or equivalent) command inside a container. The `dev`\r\n  command usually starts Bash terminal inside the container but doesn't execute `bin/build.sh`\r\n  so you can manually invoke or debug the build process (or a subset of it).\r\n\r\n- Build environment should be stateless \u0026 immutable. No longer missing build tools or\r\n  mismatched versions within your team. Nothing to install on your CI server (except Docker).\r\n\r\n- Decouple build-time dependencies from runtime dependencies\r\n  ([build container pattern](https://medium.com/@alexeiled/docker-pattern-the-build-container-b0d0e86ad601)),\r\n  so build tools will not be shipped to production (smaller images \u0026 less attack surface).\r\n\r\n- Dev/CI/production environment parity as close as possible. Dev environment is the same as\r\n  build \u0026 CI environment. What's built on dev (`$ bob build`) is exactly the same or as\r\n  close as possible (`$ bob build --uncommitted`) as to what will end up running in production.\r\n\r\n- No vendor lock-in for a CI system. Bob can seamlessly build projects on your laptop, GitHub actions,\r\n  Jenkins, GitLab etc. CI needs to only provide the working directory and Docker - everything\r\n  else like uploading artefacts to S3, Bintray etc. should be a build container concern to\r\n  provide full independence.\r\n\r\n\r\nInstall\r\n-------\r\n\r\n### Linux\r\n\r\nRequires Docker for use, so currently only Linux is supported. Native Windows support might\r\ncome later as Windows' Linux subsystem keeps maturing.\r\n\r\n```console\r\n$ sudo curl --location --fail --output /usr/bin/bob https://function61.com/go/turbobob-latest-stable-linux-amd64 \u0026\u0026 sudo chmod +x /usr/bin/bob\r\n```\r\n\r\n### Windows\r\n\r\nI have used Turbo Bob in Windows through [Vagrant](https://www.vagrantup.com/) (= run Linux\r\nin VM) quite succesfully for years.\r\n\r\nI can edit my project files from the Windows host and those changes reflect inside the\r\ncontainer just fine, though the Linux setup is definitely simpler and has less moving parts.\r\nThe setup looks like this:\r\n\r\n![Vagrant setup diagram](docs/vagrant-setup.png)\r\n\r\n\r\n### Mac\r\n\r\nI have no experience whatsoever with Mac, but I hear Vagrant works on Mac so maybe it\r\nworks the same way I described it works on Windows.\r\n\r\n\r\nSupported build/CI platforms\r\n----------------------------\r\n\r\nBasic approach anywhere:\r\n\r\n1. Have Docker installed\r\n2. If you don't have Turbo Bob installed, download it\r\n3. Run `$ bob build` (i.e. hand off build to it)\r\n\r\n\r\n### Your own computer\r\n\r\nIf your system can run Docker locally, you can build projects on your own computer.\r\n\r\n\r\n### GitHub actions\r\n\r\nSee [example actions workflow file](.github/workflows/build.yml).\r\n\r\nGitHub actions' design is pretty similar to Turbo Bob's design (\"run stuff inside containers\").\r\nI started this project before actions was announced, so unfortunately there's currently no\r\nsynergy with these projects. I'd like to research if Bob concepts could directly be mapped\r\ninto actions' concepts (perhaps you could just generate actions' workflow file from\r\nturbobob.json).\r\n\r\n\r\n### GitLab\r\n\r\nI've built projects on GitLab's public runners with Bob. See\r\n[example configuration](https://github.com/function61/turbobob/blob/8156ab2bc400181cb74b8ea324fa98a3fb9e82d2/cmd/bob/init.go#L56).\r\n\r\n\r\n### Other CI systems, vendor lock-in\r\n\r\nBob's approach is pretty generic (as documented under the above larger heading).\r\n\r\nHere's a commit demonstrating how portable Bob is by\r\n[moving from Travis CI -\u003e GitHub actions](https://github.com/function61/buildkit-publisher/commit/62f1b71ed6a17489394ccd431763ee36c958fb92) -\r\nhow it's just from small boilerplate to small boilerplate. This prevents vendor lock-in.\r\n(NOTE: GitHub actions boilerplate has since been [updated](.github/workflows/build.yml)).\r\n\r\nIf you've added support to other public CI systems, please add links to here for instructions!\r\n\r\n\r\nExamples / how does it work?\r\n----------------------------\r\n\r\n**NOTE: The easiest way to understand is to read \"Using Bob in your project\" first!**\r\n\r\n\r\n### Examples\r\n\r\nLook for the `turbobob.json` file in each of these example repos. Most of them use multiple\r\ncontainer images (\"buildkits\") for builds:\r\n\r\n- This project itself\r\n- [function61/james](https://github.com/function61/james)\r\n  * uses [buildkit-golang](https://github.com/function61/buildkit-golang)\r\n  * uses [buildkit-publisher](https://github.com/function61/buildkit-publisher)\r\n- [function61/lambda-alertmanager](https://github.com/function61/lambda-alertmanager)\r\n  * uses [buildkit-golang](https://github.com/function61/buildkit-golang)\r\n  * uses [buildkit-js](https://github.com/function61/buildkit-js)\r\n  * uses [buildkit-publisher](https://github.com/function61/buildkit-publisher)\r\n- [function61/hautomo](https://github.com/function61/hautomo)\r\n  * uses [buildkit-golang](https://github.com/function61/buildkit-golang)\r\n  * uses [buildkit-js](https://github.com/function61/buildkit-js) (via `build-alexaconnector.Dockerfile`)\r\n  * uses [buildkit-publisher](https://github.com/function61/buildkit-publisher)\r\n\r\n\r\n### How does turbobob.json work?\r\n\r\nThe process is exactly the same whether you use a different CI system. You can even run\r\nbuilds exactly the same way on your laptop by just running `$ bob build`.\r\n\r\nThis very project is built with Bob on GitHub actions. The [workflow configuration](.github/workflows/build.yml) is\r\nminimal. Here's what happens when a new commit lands in this repo:\r\n\r\n- GitHub actions start processing the build workflow file which:\r\n  * Downloads Turbo Bob\r\n  * Hands off build process to Bob\r\n- Bob reads [turbobob.json](turbobob.json), which instructs to:\r\n  * Run container off of image `fn61/buildkit-golang`\r\n    ([repo](https://github.com/function61/buildkit-golang)) and run\r\n    [build-go-project.sh](https://github.com/function61/buildkit-golang/blob/a687e81c0c7e4ca76e759d2f521a696732d2d98e/build-go-project.sh)\r\n    (defined by the buildkit) inside it. We could of course store the build script in our own repo,\r\n    but it's advantageous to have it defined by the buildkit, so improvements can \"automatically\" ship to multiple projects.\r\n  * For publishing step, run container off of image `fn61/buildkit-publisher`\r\n    ([repo](https://github.com/function61/buildkit-publisher)) and run `publish.sh rel/`\r\n    inside it (again defined by the buildkit)\r\n\r\n\r\n### Why multiple buildkits?\r\n\r\nIf your project e.g. uses Go for backend and TypeScript for frontend, it's hygienic to\r\nkeep the build tools separate so:\r\n\r\n- They can't conflict with each other.\r\n- One buildkit doing one thing enables reusability.\r\n  * All of function61's projects use `buildkit-golang`. The decision has already\r\n    [paid itself back](https://twitter.com/joonas_fi/status/1227522075780354048).\r\n- It also allows the build environments to evolve independently (update another buildkit\r\n  without breaking others).\r\n- Increases your chances of finding community-provided buildkits so you don't have to\r\n  maintain your own.\r\n\r\np.s. \"buildkit\" is not a Turbo bob concept per se. It just means \"a container image with\r\ntooling\". You can probably use images with Turbo Bob that aren't designed with Turbo Bob in mind.\r\n\r\n\r\nAlternative software\r\n--------------------\r\n\r\nThese technologies have some overlap with Turbo Bob:\r\n\r\n- [Visual Studio Code Dev Container](https://code.visualstudio.com/docs/remote/containers) - tools inside container\r\n- [GitHub codespaces](https://github.com/features/codespaces) - Code editor in cloud + tools inside container?\r\n- [nektos/act](https://github.com/nektos/act) - Run your GitHub Actions locally\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunction61%2Fturbobob","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunction61%2Fturbobob","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunction61%2Fturbobob/lists"}