From baa1ce8bf56e7c9446330332f9520c442e8c6d44 Mon Sep 17 00:00:00 2001 From: yugook <150545429+yugook@users.noreply.github.com> Date: Wed, 29 Oct 2025 22:37:51 +0900 Subject: [PATCH 1/3] =?UTF-8?q?bot=E3=81=AE=E3=82=AA=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=B8=E3=82=92=E5=B0=8E=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 6 ++ .github/workflows/auto-merge-dependabot.yml | 91 +++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 .github/workflows/auto-merge-dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index adff68d..ebfb466 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,13 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + labels: + - dependencies + - safe-to-automerge - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" + labels: + - dependencies + - safe-to-automerge diff --git a/.github/workflows/auto-merge-dependabot.yml b/.github/workflows/auto-merge-dependabot.yml new file mode 100644 index 0000000..f1164c8 --- /dev/null +++ b/.github/workflows/auto-merge-dependabot.yml @@ -0,0 +1,91 @@ +name: Auto Merge Dependabot + +on: + pull_request: + types: + - opened + - reopened + - synchronize + - ready_for_review + - labeled + - unlabeled + +jobs: + enable-auto-merge: + if: > + ${{ github.event.pull_request.user.login == 'dependabot[bot]' && + github.event.pull_request.base.ref == 'main' && + github.event.pull_request.draft == false && + contains(github.event.pull_request.labels.*.name, 'safe-to-automerge') }} + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - name: Detect version update type + id: detect + env: + PR_TITLE: ${{ github.event.pull_request.title }} + PR_BODY: ${{ github.event.pull_request.body }} + run: | + node <<'NODE' + const fs = require('fs'); + + const title = process.env.PR_TITLE ?? ''; + const body = process.env.PR_BODY ?? ''; + const regex = / from ([0-9A-Za-z.+-]+) to ([0-9A-Za-z.+-]+)/; + const match = title.match(regex) || body.match(regex); + + function normalizeVersion(raw) { + if (!raw) return null; + const cleaned = raw.replace(/^v/, ''); + const core = cleaned.split(/[-+]/)[0]; + if (!/^\d+(\.\d+)*$/.test(core)) return null; + const parts = core.split('.').map((part) => Number(part)); + if (parts.some(Number.isNaN)) return null; + while (parts.length < 3) { + parts.push(0); + } + return parts.slice(0, 3); + } + + let isMajor = false; + let level = 'unknown'; + + if (match) { + const fromVersion = normalizeVersion(match[1]); + const toVersion = normalizeVersion(match[2]); + + if (fromVersion && toVersion) { + if (toVersion[0] > fromVersion[0]) { + isMajor = true; + level = 'major'; + } else if (toVersion[0] === fromVersion[0] && toVersion[1] > fromVersion[1]) { + level = 'minor'; + } else if ( + toVersion[0] === fromVersion[0] && + toVersion[1] === fromVersion[1] && + toVersion[2] >= fromVersion[2] + ) { + level = 'patch'; + } + } + } + + const outputs = [`is-major=${isMajor}`, `update-level=${level}`]; + fs.appendFileSync(process.env.GITHUB_OUTPUT, `${outputs.join('\n')}\n`); + NODE + + - name: Remove auto-merge label for major updates + if: steps.detect.outputs.is-major == 'true' + uses: peter-evans/remove-labels@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + labels: safe-to-automerge + + - name: Enable auto-merge + if: steps.detect.outputs.is-major != 'true' + uses: peter-evans/enable-pull-request-automerge@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + merge-method: squash From 7f4c8d63fbbcc917de9c714eeed73c19b6e70f89 Mon Sep 17 00:00:00 2001 From: yugook <150545429+yugook@users.noreply.github.com> Date: Sat, 1 Nov 2025 00:00:18 +0900 Subject: [PATCH 2/3] =?UTF-8?q?auto-marge=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/auto-merge-dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-merge-dependabot.yml b/.github/workflows/auto-merge-dependabot.yml index f1164c8..5d4c98c 100644 --- a/.github/workflows/auto-merge-dependabot.yml +++ b/.github/workflows/auto-merge-dependabot.yml @@ -78,7 +78,7 @@ jobs: - name: Remove auto-merge label for major updates if: steps.detect.outputs.is-major == 'true' - uses: peter-evans/remove-labels@v3 + uses: peter-evans/remove-labels@v2 with: token: ${{ secrets.GITHUB_TOKEN }} labels: safe-to-automerge From d48f802f75be886650fc3bac1fefd3d87ad5ad07 Mon Sep 17 00:00:00 2001 From: yugook <150545429+yugook@users.noreply.github.com> Date: Mon, 3 Nov 2025 15:50:33 +0900 Subject: [PATCH 3/3] =?UTF-8?q?GitHub=20=E3=82=B9=E3=82=AF=E3=83=AA?= =?UTF-8?q?=E3=83=97=E3=83=88=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=83=A1=E3=82=B8=E3=83=A3=E3=83=BC=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=83=88=E3=81=AE=E8=87=AA=E5=8B=95=E3=83=9E?= =?UTF-8?q?=E3=83=BC=E3=82=B8=E3=83=A9=E3=83=99=E3=83=AB=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/auto-merge-dependabot.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/auto-merge-dependabot.yml b/.github/workflows/auto-merge-dependabot.yml index 5d4c98c..3052ca5 100644 --- a/.github/workflows/auto-merge-dependabot.yml +++ b/.github/workflows/auto-merge-dependabot.yml @@ -78,14 +78,23 @@ jobs: - name: Remove auto-merge label for major updates if: steps.detect.outputs.is-major == 'true' - uses: peter-evans/remove-labels@v2 + uses: actions/github-script@v7 with: - token: ${{ secrets.GITHUB_TOKEN }} - labels: safe-to-automerge + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const labelName = 'safe-to-automerge'; + const { owner, repo } = context.repo; + const issue_number = context.payload.pull_request.number; + try { + await github.rest.issues.removeLabel({ owner, repo, issue_number, name: labelName }); + } catch (error) { + if (error.status !== 404) throw error; + } - name: Enable auto-merge if: steps.detect.outputs.is-major != 'true' uses: peter-evans/enable-pull-request-automerge@v3 with: token: ${{ secrets.GITHUB_TOKEN }} + pull-request-number: ${{ github.event.pull_request.number }} merge-method: squash