name: "Conventional Commits" on: pull_request_target: types: - opened - reopened - synchronize - labeled - unlabeled jobs: lint_pr_commits: name: Validate commit messages runs-on: ubuntu-latest permissions: pull-requests: write steps: - uses: actions/checkout@v4 with: fetch-depth: 0 ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - name: Check commit message id: check_commit_message if: always() run: | set +e base_sha=${{ github.event.pull_request.base.sha }} head_sha=${{ github.event.pull_request.head.sha }} output=$(./_assets/scripts/commit_check.sh "${base_sha}" "${head_sha}" 2>&1) exit_code=$? echo "${output}" | sed '$d' echo "has_breaking_changes=${has_breaking_changes}" echo "exit_code=${exit_code}" >> $GITHUB_OUTPUT has_breaking_changes=$(echo "${output}" | tail -n 1) echo "has_breaking_changes=${has_breaking_changes}" >> $GITHUB_OUTPUT invalid_commit_messages=$(echo "${output}" | sed '1d;$d') invalid_commit_messages=$(echo "${output}" | sed '1d;$d') invalid_commit_messages=$(echo "${invalid_commit_messages}" | sed 's/\x1b\[[0-9;]*m//g') # Remove color codes invalid_commit_messages=$(echo "${invalid_commit_messages}" | sed 's/^Commit message is ill-formed: //') # Remove prefix 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 "${invalid_commit_messages}" >> "$GITHUB_ENV" echo "$EOF" >> "$GITHUB_ENV" 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: | We require commits to follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), but with `_` for non-breaking changes. Please fix these commit messages: ``` ${{ 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: | Looks like you have BREAKING CHANGES in your PR. Please make sure to follow [💔How to introduce breaking changes](https://www.notion.so/How-to-introduce-breaking-changes-ded9ec2d91464a46a2593c0d8de62fbe?pvs=4) guide: ### Check-list - [ ] Tried to avoid this breaking change - [ ] Updated [status-desktop](https://github.com/status-im/status-desktop) - [ ] Updated [status-mobile](https://github.com/status-im/status-mobile) # 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 - name: "Mark as failed" if: steps.check_commit_message.outputs.exit_code != 0 uses: actions/github-script@v7 with: script: | core.setFailed("Some commit messages are ill-formed") - name: "Update breaking changes label" if: always() run: | if [[ $ADD_LABEL == 'true' ]]; then command="--add-label" else command="--remove-label" fi gh issue edit "$NUMBER" $command "breaking change" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_REPO: ${{ github.repository }} NUMBER: ${{ github.event.pull_request.number }} ADD_LABEL: ${{ steps.check_commit_message.outputs.has_breaking_changes == 'true' }}