From f12b97c38381a2473890a069406ff200e0b0c6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Gj=C3=B8by=20Thom?= <34199185+havardthom@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:21:41 +0100 Subject: [PATCH] Add autolabeler github workflow (#247) --- .github/autolabeler-config.json | 71 +++++++++++++++++++++++++++++++ .github/workflows/autolabeler.yml | 65 ++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 .github/autolabeler-config.json create mode 100644 .github/workflows/autolabeler.yml diff --git a/.github/autolabeler-config.json b/.github/autolabeler-config.json new file mode 100644 index 00000000..a1439171 --- /dev/null +++ b/.github/autolabeler-config.json @@ -0,0 +1,71 @@ + +{ + "breaking change": [ + { + "fileStatus": "renamed", + "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"], + "excludeGlobs": [] + }, + { + "fileStatus": "removed", + "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"], + "excludeGlobs": [] + } + ], + "new script": [ + { + "fileStatus": "added", + "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"], + "excludeGlobs": [] + } + ], + "update script": [ + { + "fileStatus": "modified", + "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"], + "excludeGlobs": ["misc/build.func", "misc/install.func"] + } + ], + "delete script": [ + { + "fileStatus": "removed", + "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"], + "excludeGlobs": [] + } + ], + "rename script": [ + { + "fileStatus": "renamed", + "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"], + "excludeGlobs": [] + } + ], + "frontend": [ + { + "fileStatus": null, + "includeGlobs": ["frontend/**"], + "excludeGlobs": [] + } + ], + "documentation": [ + { + "fileStatus": null, + "includeGlobs": ["json/**"], + "excludeGlobs": [] + } + ], + "maintenance": [ + { + "fileStatus": null, + "includeGlobs": ["*.md", ".github/**"], + "excludeGlobs": [] + } + ], + "high risk": [ + { + "fileStatus": null, + "includeGlobs": ["misc/build.func", "misc/install.func"], + "excludeGlobs": [] + } + ] +} \ No newline at end of file diff --git a/.github/workflows/autolabeler.yml b/.github/workflows/autolabeler.yml new file mode 100644 index 00000000..9ad49c6f --- /dev/null +++ b/.github/workflows/autolabeler.yml @@ -0,0 +1,65 @@ +name: Auto Label Pull Requests + +on: + pull_request_target: + branches: ["main"] + types: [opened, synchronize, reopened, edited] + +jobs: + autolabeler: + runs-on: ubuntu-latest + permissions: + pull-requests: write + env: + CONFIG_PATH: .github/autolabeler-config.json + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install minimatch + run: npm install minimatch + + - name: Label PR based on config rules + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs').promises; + const path = require('path'); + const { minimatch } = require('minimatch'); + + const configPath = path.resolve(process.env.CONFIG_PATH); + const fileContent = await fs.readFile(configPath, 'utf-8'); + const autolabelerConfig = JSON.parse(fileContent); + + const prNumber = context.payload.pull_request.number; + const prListFilesResponse = await github.rest.pulls.listFiles({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + }); + const prFiles = prListFilesResponse.data; + + for (const [label, rules] of Object.entries(autolabelerConfig)) { + const shouldAddLabel = prFiles.some((prFile) => { + return rules.some((rule) => { + const isFileStatusMatch = rule.fileStatus ? rule.fileStatus === prFile.status : true; + const isIncludeGlobMatch = rule.includeGlobs.some((glob) => minimatch(prFile.filename, glob)); + const isExcludeGlobMatch = rule.excludeGlobs.some((glob) => minimatch(prFile.filename, glob)); + + return isFileStatusMatch && isIncludeGlobMatch && !isExcludeGlobMatch; + }); + }); + + if (shouldAddLabel) { + console.log(`Adding label ${label} to PR ${prNumber}`); + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: [label], + }); + } + } + + +