name: Conventional Commits
on:
pull_request:
branches: [ "master", "main" ]
types: [opened, synchronize, reopened, edited]
permissions:
contents: read
issues: write
pull-requests: write
jobs:
commitlint:
name: Validate PR Title
runs-on: ubuntu-latest
if: github.base_ref == 'master' || github.base_ref == 'main'
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 'lts/*'
- name: Install commitlint
run: npm install --save-dev @commitlint/cli@latest @commitlint/config-conventional@latest
- name: Validate PR title
id: commitlint
continue-on-error: true
run: echo "${{ github.event.pull_request.title }}" | npx commitlint --config .commitlintrc.json --verbose
- name: Add warning label
if: steps.commitlint.outcome != 'success'
uses: actions/github-script@v7
with:
script: |
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['pr-title-warning']
});
- name: Remove warning label
if: steps.commitlint.outcome == 'success'
uses: actions/github-script@v7
with:
script: |
try {
await github.rest.issues.removeLabel({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
name: 'pr-title-warning'
});
} catch (error) {
// Label doesn't exist, ignore
}