Skip to content

Commit

Permalink
ci: EXPOSED-725 Enforce commit message rules
Browse files Browse the repository at this point in the history
Added `commit-message-validation.yml` to ensure that all commit messages in a pull request, including the pull request's title, adhere to the Conventional Commits specification.
  • Loading branch information
joc-a committed Feb 5, 2025
1 parent 753ba39 commit c9c269f
Showing 1 changed file with 98 additions and 0 deletions.
98 changes: 98 additions & 0 deletions .github/workflows/commit-message-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# This workflow ensures that all commit messages in a pull request adhere to the Conventional Commits specification.

name: Commit Message Validation

on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# Triggers the workflow on pull request events targeting the main branch
pull_request:
branches:
- main
types:
- opened
- synchronize
- edited
- reopened

jobs:
validate-commits:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action == 'opened') }}

steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Validate commit messages
run: |
# Regex for Conventional Commits specification
COMMIT_REGEX="^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([^\)]*\))?:\s?(EXPOSED-[0-9]+\s?)?.+$"
# Get all commits in the pull request (from base to head)
COMMITS=$(git log --format=%s --no-merges origin/main..${{ github.sha }})
# Initialize counters and store invalid commits
INVALID_COMMITS=()
VALID_COMMITS=()
echo "ℹ️ Checking if commit messages are following the Conventional Commits specification..."
# Loop through each commit message
IFS=$'\n'
for COMMIT_MSG in $COMMITS; do
# Check if commit message matches the regex
if [[ ! "$COMMIT_MSG" =~ $COMMIT_REGEX ]]; then
INVALID_COMMITS+=("$COMMIT_MSG")
echo -e "❌ $COMMIT_MSG"
else
VALID_COMMITS+=("$COMMIT_MSG")
echo -e "✅ $COMMIT_MSG"
fi
done
# If there are invalid commits, print the summary
if [ ${#INVALID_COMMITS[@]} -gt 0 ]; then
echo ""
echo "🛑 Some commit messages are not following the Conventional Commits specification."
echo ""
echo "Valid commit message format: <type>(<optional scope>): <subject>"
echo "Example: fix: Bug in insert"
echo "Please check https://www.conventionalcommits.org/en/v1.0.0/#summary"
exit 1
fi
echo "🎉 All commit messages are following the Conventional Commits specification."
validate-PR-title:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'pull_request' &&
(github.event.action == 'opened' ||
(github.event.action == 'edited' && github.event.changes.title)) }}

steps:
- name: Checkout code
- uses: actions/checkout@v3

- name: Validate PR title
run: |
# Regex for Conventional Commits specification
PR_TITLE_REGEX="^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([^\)]*\))?:\s?(EXPOSED-[0-9]+\s?)?.+$"
# Get the PR title
PR_TITLE="${{ github.event.pull_request.title }}"
# Check if PR title matches the regex
if [[ ! "$PR_TITLE" =~ $PR_TITLE_REGEX ]]; then
echo "❌ The PR title does not follow the Conventional Commits specification."
echo "PR Title -> $PR_TITLE"
echo "Valid PR title format: <type>(<optional scope>): <optional EXPOSED-<number>> <subject>"
echo "Example: fix: Bug in insert"
echo "Please check https://www.conventionalcommits.org/en/v1.0.0/#summary"
exit 1
else
echo "🎉 The PR title is following the Conventional Commits specification."
fi

0 comments on commit c9c269f

Please sign in to comment.