name: Checks / Changelog on: pull_request_target: types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] permissions: contents: read pull-requests: write issues: write jobs: check-changelog: name: Check changelog is added runs-on: ubuntu-latest steps: - name: Check for changelog entry id: check_files run: | AUTH=$(echo -n "x-access-token:${{ secrets.GITHUB_TOKEN }}" | base64 -w 0) git config --global http.${{ github.server_url }}/.extraheader "Authorization: basic $AUTH" git clone "${{ github.event.repository.clone_url }}" repo.git --bare git -C repo.git fetch origin pull/${{ github.event.pull_request.number }}/head # Check for Added (A) or Modified (M) files in changelog.d CHANGELOG_CHANGES=$(git -C repo.git diff --name-status ${{ github.event.pull_request.base.sha }}...${{ github.event.pull_request.head.sha }} -- changelog.d/) SRC_CHANGES=$(git -C repo.git diff --name-status ${{ github.event.pull_request.base.sha }}...${{ github.event.pull_request.head.sha }} -- src/) echo "Changes in changelog.d/:" echo "$CHANGELOG_CHANGES" echo "Changes in src/:" echo "$SRC_CHANGES" if echo "$CHANGELOG_CHANGES" | grep -q "^[AM]"; then echo "has_changelog=true" >> $GITHUB_OUTPUT else echo "has_changelog=false" >> $GITHUB_OUTPUT fi if [ -n "$SRC_CHANGES" ]; then echo "src_changed=true" >> $GITHUB_OUTPUT else echo "src_changed=false" >> $GITHUB_OUTPUT fi - name: Manage PR Labels uses: https://github.com/actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 env: HAS_CHANGELOG: ${{ steps.check_files.outputs.has_changelog }} SRC_CHANGED: ${{ steps.check_files.outputs.src_changed }} with: script: | const hasChangelog = process.env.HAS_CHANGELOG === 'true'; const srcChanged = process.env.SRC_CHANGED === 'true'; const { data: pullRequest } = await github.rest.pulls.get({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.issue.number, }); const currentLabels = pullRequest.labels.map(l => l.name); if (hasChangelog) { console.log('PR has changelog'); await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, labels: ['Changelog/Added'], }); } else if (currentLabels.includes('Changelog/None')) { console.log('PR has Changelog/None label, skipping.'); } else if (srcChanged) { console.log('PR is missing changelog'); await github.rest.issues.addLabels({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, labels: ['Changelog/Missing'], }); core.setFailed("Missing changelog entry (detected)"); } else if (currentLabels.includes('Changelog/Missing')) { core.setFailed("Missing changelog entry (label)"); } else { console.log('Changelog not needed'); // Changelog is probably not needed }