name: PR-labels on: pull_request_target: branches: - 'main' types: - 'opened' - 'edited' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number }} cancel-in-progress: true jobs: update-labels: runs-on: ubuntu-latest steps: - name: Update PR labels id: update-pr-labels uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const { owner, repo } = context.repo; const prNumber = context.payload.pull_request.number; const description = context.payload.pull_request.body; const mapping = [ ['* New feature', 'new-feature'], ['* Experimental feature', 'experimental-feature'], ['* Improvement', 'improvement'], ['* Performance improvement', 'performance'], ['* Bugfix', 'bugfix'], ['* Backward incompatible change', 'backward-incompatible'], ['* Documentation', 'documentation'], ['* Not for changelog', 'not-for-changelog'] ]; // remove all labels owned by current script for (let pair of mapping) { try { const result = await github.rest.issues.removeLabel({ owner, repo, issue_number: prNumber, name: pair[1] }); console.log('Removed label', pair[1]); } catch(e) { console.log(e); } } // add first encountered label if (!description) return; for (let pair of mapping) { if (!description.includes(pair[0])) continue; // add label try { const result = await github.rest.issues.addLabels({ owner, repo, issue_number: prNumber, labels: [pair[1]] }); console.log('Added label', pair[1]); } catch(e) { console.log(e); } break; }