name: Remove Unused Labels on: workflow_dispatch: jobs: cleanup: runs-on: ubuntu-latest permissions: issues: write pull-requests: write contents: read steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Fetch All Issues and PRs id: fetch_issues_prs uses: actions/github-script@v7.0.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const issues = await github.paginate(github.rest.issues.listForRepo, { owner: context.repo.owner, repo: context.repo.repo, state: 'all', per_page: 100 }); const labelsInUse = new Set(); issues.forEach(issue => { issue.labels.forEach(label => { labelsInUse.add(label.name); }); }); return JSON.stringify(Array.from(labelsInUse)); result-encoding: string - name: Fetch All Labels id: fetch_labels uses: actions/github-script@v7.0.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const labels = await github.paginate(github.rest.issues.listLabelsForRepo, { owner: context.repo.owner, repo: context.repo.repo, per_page: 100 }); return JSON.stringify(labels.map(label => label.name)); result-encoding: string - name: Remove Unused Labels uses: actions/github-script@v7.0.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const labelsInUse = new Set(JSON.parse(process.env.LABELS_IN_USE)); const allLabels = JSON.parse(process.env.ALL_LABELS); const unusedLabels = allLabels.filter(label => !labelsInUse.has(label)); for (const label of unusedLabels) { await github.rest.issues.deleteLabel({ owner: context.repo.owner, repo: context.repo.repo, name: label }); console.log(`Deleted label: ${label}`); } env: LABELS_IN_USE: ${{ steps.fetch_issues_prs.outputs.result }} ALL_LABELS: ${{ steps.fetch_labels.outputs.result }}