Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

enforce jira ticket in git commit message #68

Closed
wants to merge 11 commits into from
Closed
68 changes: 68 additions & 0 deletions .github/workflows/commit_message_validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: validate git commit messages

on:
push:
branches: [ main, develop ]
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
echo $BASE_BRANCH
echo $CURRENT_BRANCH
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
Loading