From 617d0315e55b5105669216f7cc782c0d4982a713 Mon Sep 17 00:00:00 2001 From: adongare Date: Tue, 13 Feb 2024 16:51:15 -0500 Subject: [PATCH] enforce jira ticketin git commit message --- .../workflows/commit_message_validation.yml | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/workflows/commit_message_validation.yml diff --git a/.github/workflows/commit_message_validation.yml b/.github/workflows/commit_message_validation.yml new file mode 100644 index 0000000..a529e9a --- /dev/null +++ b/.github/workflows/commit_message_validation.yml @@ -0,0 +1,61 @@ +name: Release + +on: [push] + +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 + # 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 \ No newline at end of file