MAT-6378 Enforce jira ticket in git commit message #17
This file contains 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
name: validate git commit messages | |
on: | |
pull_request: | |
branches: [ main, develop ] | |
jobs: | |
commit_message_validation: | |
name: validate git commit messages | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
ref: '${{ github.event.pull_request.base.ref }}' | |
- name: Execute message validation | |
run: | | |
# Checkout branch | |
git checkout -q ${{ github.event.pull_request.head.ref }} | |
# Set variables | |
BASE_BRANCH=${{ github.event.pull_request.base.ref }} | |
msg_regex='MAT-[0-9]+\s.*' | |
# This list permits some commits | |
commit_static_permit_list="(^Merge pull request \#)|(^Merge branch)|(^Revert \")" | |
# Initialize invalidCommit as false, will be set to true by any invalid commits | |
invalidCommit=false | |
CURRENT_BRANCH=$(git branch | grep ^\* | cut -d "*" -f 2 | cut -d " " -f 2) | |
# Find hash of commit most common ancestor, e.g. where branch began | |
BRANCH_MERGE_BASE=$(git merge-base ${BASE_BRANCH} ${CURRENT_BRANCH}) | |
# Find all commits since common ancestor | |
BRANCH_COMMITS=$(git rev-list ${BRANCH_MERGE_BASE}..HEAD) | |
# Check every commit message since ancestor for regex match | |
for commit in $BRANCH_COMMITS; do | |
# Check if ticket in static permit-list for non-Jira commit_sha | |
if $(git log --max-count=1 --format=%B $commit | grep -iqE "$commit_static_permit_list"); then | |
: #If commit matches regex, commit is valid, do nothing | |
elif git log --max-count=1 --format=%B $commit | tr '[a-z]' '[A-Z]' | grep -iqE "$msg_regex"; then | |
: #If commit matches regex, commit is valid, do nothing | |
else | |
# If commit doesn't match regex, commit isn't valid, print commit info | |
echo "************" | |
printf "Invalid commit message: \"%s\" and hash: %s\n" "$(git log --max-count=1 --format=%B $commit)" "$commit" | |
echo "************" | |
# Set this variable to trigger rejection if any commit fails regex | |
invalidCommit=true | |
fi | |
done | |
# If any commit are invalid, print reject message | |
if [ "$invalidCommit" == true ]; then | |
echo "Your push was rejected because at least one commit message on this branch is invalid" | |
echo "Please fix the commit message(s) and push again." | |
echo "https://help.github.com/en/articles/changing-a-commit-message" | |
echo "************" | |
exit 1 | |
elif [ "$invalidCommit" == false ]; then | |
echo "************" | |
echo "All commits are valid" | |
echo "************" | |
exit 0 | |
fi |