Early Exit for CircleCI in Monorepos
7 Aug 2019
I've recently had a situation with a monorepo using CircleCI for testing and deployment. Everything was built on every push - native apps, backend deploys etc. This took a lot of time and cost a lot of $. To solve that, I wrote this short script to early exit a CircleCI job unless certain files or directories changed in that git commit.
#!/bin/bash set -e # This script makes CircleCI exit a current job if # the paths passed as an argument haven't changed. # This is eg used for preventing building native # builds unless frontend/native or frontend/shared # have changed. # # Example usage: # ./exit-if-path-not-changed.sh path/to/dir1 path/to/dir2 # # For reference: # https://gist.github.com/naesheim/18d0c0a58ee61f4674353a2f4cf71475 # https://discuss.circleci.com/t/ability-to-return-successfully-from-a-job-before-completing-all-the-next-steps/12969/4 # 1. Get all the arguments of the script # https://unix.stackexchange.com/a/197794 PATHS_TO_SEARCH="$*" # 2. Make sure the paths to search are not empty if [ -z "$PATHS_TO_SEARCH" ]; then echo "Please provide the paths to search for." echo "Example usage:" echo "./exit-if-path-not-changed.sh path/to/dir1 path/to/dir2" exit 1 fi # 3. Get the latest commit LATEST_COMMIT=$(git rev-parse HEAD) # 4. Get the latest commit in the searched paths LATEST_COMMIT_IN_PATH=$(git log -1 --format=format:%H --full-diff $PATHS_TO_SEARCH) if [ $LATEST_COMMIT != $LATEST_COMMIT_IN_PATH ]; then echo "Exiting this CircleCI job because code in the following paths have not changed:" echo $PATHS_TO_SEARCH circleci step halt fi