From 8491e76a34e39ba9a2c7433dbe6523bfe90a7cb8 Mon Sep 17 00:00:00 2001 From: Igor Sirotin Date: Tue, 27 Aug 2024 22:42:06 +0100 Subject: [PATCH] fix_: separate commit message check (#5773) * chore_: add github action conventional commits * chore_: remove commit check from tests run * fix_: continue checking commits when breaking change found * fix_: don't run check on pr edit --- .github/workflows/commit-check.yml | 81 ++++++++++++++++++++++++++++++ Makefile | 3 +- _assets/ci/Jenkinsfile.tests | 12 ----- _assets/scripts/commit_check.sh | 13 +++-- 4 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/commit-check.yml diff --git a/.github/workflows/commit-check.yml b/.github/workflows/commit-check.yml new file mode 100644 index 000000000..beb575759 --- /dev/null +++ b/.github/workflows/commit-check.yml @@ -0,0 +1,81 @@ +name: "Conventional Commits" + +on: + pull_request: + types: + - opened + - synchronize +jobs: + main: + name: Validate format + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ env.GITHUB_HEAD_REF }} + fetch-tags: true + + - name: Fetch tags + run: | + git fetch --tags --quiet + git checkout origin/${GITHUB_HEAD_REF} + + - name: Check commit message + id: check_commit_message + run: | + set +e + + output=$(./_assets/scripts/commit_check.sh 2>&1) + exit_code=$? + echo "exit_code=$exit_code" >> $GITHUB_OUTPUT + + if [[ $exit_code -ne 0 ]]; then + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) + echo "error_message<<$EOF" >> "$GITHUB_ENV" + echo "$output" >> "$GITHUB_ENV" + echo "$EOF" >> "$GITHUB_ENV" + else + has_breaking_changes=$(echo "$output" | sed -n '2p') + echo "has_breaking_changes=$has_breaking_changes" >> $GITHUB_OUTPUT + fi + + - name: "Publish failed commit messages" + uses: marocchino/sticky-pull-request-comment@v2 + # When the previous steps fails, the workflow would stop. By adding this + # condition you can continue the execution with the populated error message. + if: always() && (steps.check_commit_message.outputs.exit_code != 0) + with: + header: commit-message-lint-error + message: | + Thank you for opening this pull request! + + We require commits to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), but with `_` for non-breaking changes. + And it looks like your PR needs to be adjusted. + + Details: + ``` + ${{ env.error_message }} + ``` + + - name: "Publish breaking changes message" + uses: marocchino/sticky-pull-request-comment@v2 + # When the previous steps fails, the workflow would stop. By adding this + # condition you can continue the execution with the populated error message. + if: always() && (steps.check_commit_message.outputs.exit_code == 0 && steps.check_commit_message.outputs.has_breaking_changes == 'true') + with: + header: commit-message-lint-error + message: | + Thank you for opening this pull request! + + Looks like you have BREAKING CHANGES in your PR. + Please make sure to update [status-desktop](https://github.com/status-im/status-desktop) and [status-mobile](https://github.com/status-im/status-mobile) clients accordingly. + + # Delete a previous comment when the issue has been resolved + - name: "Delete previous comment" + if: ${{ steps.check_commit_message.outputs.exit_code == 0 && steps.check_commit_message.outputs.has_breaking_changes == 'false' }} + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: commit-message-lint-error + delete: true diff --git a/Makefile b/Makefile index 5a7d5d247..edb8d226c 100644 --- a/Makefile +++ b/Makefile @@ -453,8 +453,9 @@ migration: migration-check: bash _assets/scripts/migration_check.sh +commit-check: SHELL := /bin/sh commit-check: - bash _assets/scripts/commit_check.sh + @bash _assets/scripts/commit_check.sh tag-version: bash _assets/scripts/tag_version.sh $(TARGET_COMMIT) diff --git a/_assets/ci/Jenkinsfile.tests b/_assets/ci/Jenkinsfile.tests index f7c22ec4d..3d59fca11 100644 --- a/_assets/ci/Jenkinsfile.tests +++ b/_assets/ci/Jenkinsfile.tests @@ -99,18 +99,6 @@ pipeline { } } } - stage('Commit') { - environment { - BASE_BRANCH = "${env.BASE_BRANCH}" - } - when { // https://github.com/status-im/status-go/issues/4993#issuecomment-2022685544 - expression { !isTestNightlyJob() } - } - steps { script { - nix.shell('make commit-check', pure: false) - } } - } - stage('Lint') { steps { script { nix.shell('make lint', pure: true) diff --git a/_assets/scripts/commit_check.sh b/_assets/scripts/commit_check.sh index 2f7364c5f..4cf3b0eb2 100755 --- a/_assets/scripts/commit_check.sh +++ b/_assets/scripts/commit_check.sh @@ -9,8 +9,9 @@ parse_commits() { start_commit=${1:-origin/${BASE_BRANCH}} end_commit=${2:-HEAD} is_breaking_change=false + exit_code=0 - echo "checking commits between: $start_commit $end_commit" >&2 + echo "checking commits between: $start_commit $end_commit" # Run the loop in the current shell using process substitution while IFS= read -r message || [ -n "$message" ]; do # Check if commit message follows conventional commits format @@ -18,15 +19,17 @@ parse_commits() { # Check for breaking changes if [[ ${BASH_REMATCH[3]} == *'!'* ]]; then is_breaking_change=true - break fi else - echo "Commit message \"$message\" is not well-formed. Aborting merge. We use https://www.conventionalcommits.org/en/v1.0.0/ but with _ for non-breaking changes" - # Uncomment the line below if you want to exit on an invalid commit message - exit 1 + echo "Commit message \"$message\" is not well-formed" + exit_code=1 fi done < <(git log --format=%s "$start_commit".."$end_commit") + if [[ $exit_code -ne 0 ]]; then + exit ${exit_code} + fi + echo "$is_breaking_change" }