Buildkite is very awesome. However, I think it has one key area that it is quite limited compared to some alternatives like GitHub actions.
GitHub Actions has a wealth configuration options that determine when a pipeline will run. See https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#on
- Pull Request vs push
- Branch wildcard matching
- Branch wildcard ignoring
- Changed path wildcard matching
- Changed path wildcard ignoring
- Tag wildcard matching
- Tag wildcard ignoring
In particular the path aspect is extremely useful. For example, I only want to push an updated buildkite agent docker image in the case that
dockerfiles/Buildkite has changed. Or I only want to redeploy my project infrastructure if
terraform/project/** has changed.
Buildkite works perfectly when you have lots of small microservice repos, however these days there is a continual movement towards monorepos which buildkite seems less geared towards.
What about plugins? Currently the most stared plugin (showing this is a common issue) is https://github.com/chronotc/monorepo-diff-buildkite-plugin .
It has the following limitations compared to GitHub actions first party support.
- Only supports simple path matching.
- It is tricky to compare all the commits pushed / merged. It has some solutions though https://github.com/chronotc/monorepo-diff-buildkite-plugin#diff-optional
- Similarly, ideally you probably want to run a build if the path has changed since the last successful build, not just in the current push. The above link has a solution, but it is clunky and manual. Actually I’m not sure if github actions supports this.
- It requires having a ‘Triggering pipelines’ build.
- It is very boilerplatey.
What would buildkite support look like?
I would suggest adding a section to
triggers: push: paths: - '**.js' branches-ignore: - 'releases/**-alpha' tags-ignore: - v1.* # Push events to tags v1.0, v1.1, and v1.9
The agent would evaluate and apply this on every webhook event before deciding to initiate a run.
Thanks for listening