Created
August 12, 2017 21:02
-
-
Save clayallsopp/88d76d60062155d47ac243a4a62ee04e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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