This repository is an example Buildkite pipeline that shows how to programmatically generate dynamic steps using a shell script.
👉 See this example in action: buildkite/dynamic-pipeline-example
See the full Getting Started Guide for step-by-step instructions on how to get this running, or try it yourself:

This pipeline starts with a single job that runs:
.buildkite/pipeline.sh | buildkite-agent pipeline upload
The script .buildkite/pipeline.sh does the following:
- Creates a test step for each subdirectory in specs
- Adds a deploy step if the build is on the
main
branch
For non-main branches build it generates:
steps:
- command: "specs/controllers/test.sh"
label: "controllers"
- command: "specs/features/test.sh"
label: "features"
- command: "specs/models/test.sh"
label: "models"
For a main
branch build it generates:
steps:
- command: "specs/controllers/test.sh"
label: "controllers"
- command: "specs/features/test.sh"
label: "features"
- command: "specs/models/test.sh"
label: "models"
- wait
- command: "echo Deploy!"
label: ":rocket:"
What else could you do? The possibilities are endless. You can use this technique for custom deploy workflows, QA gates, conditional rollbacks, etc.
Tools like Jobsworth use dynamic steps to manage complex deployment logic.
See LICENSE.md (MIT)