Skip to content

Commit

Permalink
buildkite: Add dynamic pipeline generator for conditional skipping
Browse files Browse the repository at this point in the history
Use Buildkite's dynamic pipelines feature to dynamically choose between
Code/Code-skip pipelines depending on whether the build was triggered
for a pull request and the list of changes files.
  • Loading branch information
tjanez committed Feb 21, 2020
1 parent 5afa3e6 commit 4a66973
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 3 deletions.
10 changes: 10 additions & 0 deletions .buildkite/code-skip.pipeline.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
##
# Code-skip pipeline
##
#
# Buildkite pipeline for skipping running code-related linters and tests.
#

steps:
- label: No code-related changes detected, skipping Code pipeline
command: exit 0
10 changes: 7 additions & 3 deletions .buildkite/pipeline.yml → .buildkite/code.pipeline.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
################
# Build pipeline
################
##
# Code pipeline
##
#
# Main Buildkite pipeline for running code-related linters and tests.
#

docker_plugin_default_config: &docker_plugin_default_config
image: "oasislabs/testing:0.3.0"
always_pull: true
Expand Down
45 changes: 45 additions & 0 deletions .buildkite/pipeline.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/bin/bash
##
# Dynamic Buildkite pipeline generator.
##
#
# It outputs valid Buildkite pipeline in YAML format.
#
# To use it, define the following Steps under your Buildkite's Pipeline Settings:
#
# steps:
# - command: .buildkite/pipeline.sh | buildkite-agent pipeline upload
# label: ":pipeline: Upload"
#
# For more details, see:
# https://buildkite.com/docs/pipelines/defining-steps#dynamic-pipelines.
#

set -eux

# Helper that ensures the build is triggered for a pull request and that there
# are no code-related changes compared to the pull request's base branch.
pr_and_no_code_related_changes() {
# Check if the build was triggered for a pull request.
if [[ -z $BUILDKITE_PULL_REQUEST_BASE_BRANCH ]]; then
return 1
fi
# Get the list of changes files, excluding changes unrelated to code.
# NOTE: The exclude patterns below use git's pathspec syntax:
# https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec.
git diff --name-only --exit-code "refs/remotes/origin/$BUILDKITE_PULL_REQUEST_BASE_BRANCH.." 1>&2 -- \
':(exclude)*.md' \
':(exclude).changelog/' \
':(exclude).github/' \
':(exclude).gitlint' \
':(exclude).markdownlint.yml' \
':(exclude).punch_config.py' \
':(exclude)docs/' \
':(exclude)towncrier.toml'
}

if pr_and_no_code_related_changes; then
cat .buildkite/code-skip.pipeline.yml
else
cat .buildkite/code.pipeline.yml
fi
6 changes: 6 additions & 0 deletions .changelog/2702.internal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ci: Skip some steps for non-code changes

When one makes a pull request that e.g. only adds documentation or
assembles the Change Log from fragments, all the *heavy* Buildkite
pipeline steps (e.g. Go/Rust building, Go tests, E2E tests) should be
skipped.

0 comments on commit 4a66973

Please sign in to comment.