name: Commit Message Check on: push: branches: [ main, develop ] pull_request: jobs: conventional-commits: runs-on: [self-hosted, linux] steps: - name: Validate commit messages env: EVENT_NAME: ${{ github.event_name }} BEFORE_SHA: ${{ github.event.before }} PR_BASE_SHA: ${{ github.event.pull_request.base.sha }} PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} HEAD_SHA: ${{ github.sha }} run: | set -euo pipefail BASE_SHA="" TARGET_SHA="${HEAD_SHA}" BASE_HINT_SHA="${PR_BASE_SHA:-}" if [ "${EVENT_NAME}" = "pull_request" ]; then if [ -n "${PR_HEAD_SHA:-}" ]; then TARGET_SHA="${PR_HEAD_SHA}" elif git rev-parse "${HEAD_SHA}^2" >/dev/null 2>&1; then TARGET_SHA="$(git rev-parse "${HEAD_SHA}^2")" fi if [ -z "${BASE_HINT_SHA}" ] && git rev-parse "${HEAD_SHA}^1" >/dev/null 2>&1; then BASE_HINT_SHA="$(git rev-parse "${HEAD_SHA}^1")" fi fi if [ "${EVENT_NAME}" = "pull_request" ] && [ -n "${BASE_HINT_SHA}" ] && [ -n "${TARGET_SHA:-}" ]; then BASE_SHA="$(git merge-base "${BASE_HINT_SHA}" "${TARGET_SHA}" || true)" if [ -z "${BASE_SHA}" ]; then BASE_SHA="${BASE_HINT_SHA}" fi elif [ -n "${BEFORE_SHA:-}" ] && [ "${BEFORE_SHA}" != "0000000000000000000000000000000000000000" ]; then BASE_SHA="${BEFORE_SHA}" elif git rev-parse "${TARGET_SHA}^" >/dev/null 2>&1; then BASE_SHA="$(git rev-parse "${TARGET_SHA}^")" fi if [ -n "${BASE_SHA}" ] && [ "${BASE_SHA}" != "${TARGET_SHA}" ]; then MESSAGES="$(git log --format=%s "${BASE_SHA}..${TARGET_SHA}")" else MESSAGES="$(git log -1 --format=%s "${TARGET_SHA}")" fi if [ -z "${MESSAGES}" ]; then MESSAGES="$(git log -1 --format=%s "${TARGET_SHA}")" fi PATTERN='^(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\([a-z0-9._/-]+\))?(!)?: .+' FAILED=0 while IFS= read -r SUBJECT; do [ -z "${SUBJECT}" ] && continue if [[ "${SUBJECT}" =~ ^Merge[[:space:]] ]]; then continue fi if [[ "${SUBJECT}" =~ ^Revert[[:space:]] ]]; then continue fi if [[ ! "${SUBJECT}" =~ ${PATTERN} ]]; then echo "Invalid commit message: ${SUBJECT}" FAILED=1 else echo "OK: ${SUBJECT}" fi done <<< "${MESSAGES}" if [ "${FAILED}" -ne 0 ]; then echo "Conventional Commit check failed." exit 1 fi