Skip to content

Instantly share code, notes, and snippets.

@clayallsopp
Created August 12, 2017 21:02
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save clayallsopp/88d76d60062155d47ac243a4a62ee04e to your computer and use it in GitHub Desktop.
Save clayallsopp/88d76d60062155d47ac243a4a62ee04e to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -o xtrace -o errexit -o pipefail -o nounset
########################################################################################
# CircleCI's current recommendation for roughly serializing a subset
# of build commands for a given branch
#
# circle discussion thread - https://discuss.circleci.com/t/serializing-deployments/153
# Code from - https://github.com/bellkev/circle-lock-test
########################################################################################
# sets $branch, $job_name, $tag, $rest
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
-b|--branch) branch="$2" ;;
-j|--job-name) job_name="$2" ;;
-t|--tag) tag="$2" ;;
*) break ;;
esac
shift 2
done
rest=("$@")
}
# reads $branch, $tag, $commit_message
should_skip() {
if [[ "$branch" && "$CIRCLE_BRANCH" != "$branch" ]]; then
echo "Not on branch $branch. Skipping..."
return 0
fi
if [[ "$job_name" && "$CIRCLE_JOB" != "$job_name" ]]; then
echo "Not running $job_name. Skipping..."
return 0
fi
if [[ "$tag" && "$commit_message" != *\[$tag\]* ]]; then
echo "No [$tag] commit tag found. Skipping..."
return 0
fi
return 1
}
# reads $branch, $job_name, $tag
# sets $jq_prog
make_jq_prog() {
local jq_filters=""
if [[ $branch ]]; then
jq_filters+=" and .branch == \"$branch\""
fi
if [[ $job_name ]]; then
jq_filters+=" and .workflows?.job_name? == \"$job_name\""
fi
if [[ $tag ]]; then
jq_filters+=" and (.subject | contains(\"[$tag]\"))"
fi
jq_prog=".[] | select(.build_num < $CIRCLE_BUILD_NUM and (.status | test(\"running|pending|queued\")) $jq_filters) | .build_num"
jq_later_builds_prog=".[] | select(.build_num > $CIRCLE_BUILD_NUM and (.status | test(\"running|pending|queued\")) $jq_filters) | .build_num"
}
if [[ "$0" != *bats* ]]; then
set -e
set -u
set -o pipefail
branch=""
tag=""
job_name=""
rest=()
api_url="https://circleci.com/api/v1/project/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME?circle-token=$CIRCLE_TOKEN&limit=100"
if [[ $branch ]]; then
api_url="https://circleci.com/api/v1/project/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/tree/$branch?circle-token=$CIRCLE_TOKEN&limit=100"
fi
parse_args "$@"
commit_message=$(git log -1 --pretty=%B)
if should_skip; then exit 0; fi
make_jq_prog
echo "Checking for running builds..."
while true; do
builds=$(curl -s -H "Accept: application/json" "$api_url" | jq "$jq_prog")
later_builds=$(curl -s -H "Accept: application/json" "$api_url" | jq "$jq_later_builds_prog")
if [[ $later_builds ]]; then
echo "Later builds detected, bailing"
echo "$later_builds"
exit 0
fi
if [[ $builds ]]; then
echo "Waiting on builds:"
echo "$builds"
else
break
fi
echo "Retrying in 10 seconds..."
sleep 10
done
echo "Acquired lock"
if [[ "${#rest[@]}" -ne 0 ]]; then
"${rest[@]}"
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment