From 00c60606cce38eec0a90445fadf5f276df77f4d5 Mon Sep 17 00:00:00 2001 From: Masakuni Kato <7091+mackato@users.noreply.github.com> Date: Wed, 3 Jun 2026 15:47:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BE=9D=E5=AD=98=E3=81=AE=E5=AE=9A?= =?UTF-8?q?=E6=9C=9F=E6=9B=B4=E6=96=B0=E3=82=92=20Dependabot/Renovate=20?= =?UTF-8?q?=E3=81=A7=E5=B0=8E=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit github-actions と nix(flake.lock) を Dependabot、devbox を Renovate に分担し、 いずれも公開直後の汚染版を避けるため 3 日の cooldown を設ける。Dependabot は devbox 未対応のため devbox のみ Renovate を使い、両 bot の対象が重複しないよう Renovate は enabledManagers を devbox に限定する。 Renovate は devbox バイナリを実行プロセスに渡す必要があり hosted App では回せない ため self-hosted とする。runner に devbox を入れて Renovate を直接実行し binarySource=global で host の devbox を使う。実行は週次(月曜 9am JST)の cron で 制御し、専用 GitHub App トークンで PR を作成して CI を自動起動させる。 Co-Authored-By: Claude Opus 4.8 --- .github/dependabot.yml | 28 ++++++++++++++++++++++++++ .github/workflows/renovate.yml | 36 ++++++++++++++++++++++++++++++++++ renovate.json | 9 +++++++++ 3 files changed, 73 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/renovate.yml create mode 100644 renovate.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..979cd75 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,28 @@ +# Dependabot 設定。github-actions と nix(flake.lock)の version updates を担う。 +# devbox は Dependabot 未対応のため Renovate (renovate.json) に分担。 +# cooldown を設ける理由: 公開直後の汚染版を 3 日寝かせて弾くため +# (security updates は cooldown 対象外なので遅延しない)。 +version: 2 +updates: + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + day: monday + time: "09:00" + timezone: Asia/Tokyo + cooldown: + default-days: 3 + groups: + github-actions: + patterns: + - "*" + - package-ecosystem: nix + directory: "/" + schedule: + interval: weekly + day: monday + time: "09:00" + timezone: Asia/Tokyo + cooldown: + default-days: 3 diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml new file mode 100644 index 0000000..a1ebfe8 --- /dev/null +++ b/.github/workflows/renovate.yml @@ -0,0 +1,36 @@ +name: renovate + +# devbox を Renovate の実行プロセスに渡すため、Mend hosted App ではなく self-hosted で運用する。 +# Docker で動く renovatebot/github-action では host の devbox が見えないため、runner 上で +# devbox を入れたうえで Renovate を直接実行し binarySource=global で host の devbox を使う。 +# 対象は devbox のみ(役割分担は renovate.json / dependabot.yml を参照)。 +on: + schedule: + - cron: "0 0 * * 1" # 毎週月曜 00:00 UTC = 09:00 JST(dependabot.yml と同 cadence) + workflow_dispatch: + +permissions: + contents: read + +jobs: + renovate: + runs-on: ubuntu-latest + steps: + - name: Generate app token + id: app-token + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 + with: + app-id: ${{ secrets.RENOVATE_APP_ID }} + private-key: ${{ secrets.RENOVATE_APP_PRIVATE_KEY }} + - name: Checkout + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + - name: Install devbox + uses: jetify-com/devbox-install-action@8c6a66ed6273138b1915457069de78cb52fe3bd7 # v0.15.0 + - name: Run Renovate + # メジャー固定で破壊的変更を避けつつ patch/minor は取り込む。メジャー更新は手動で上げる。 + run: npx --yes renovate@43 + env: + RENOVATE_TOKEN: ${{ steps.app-token.outputs.token }} + RENOVATE_REPOSITORIES: ${{ github.repository }} + RENOVATE_BINARY_SOURCE: global # host にインストールした devbox を使う + LOG_LEVEL: info diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..64d383c --- /dev/null +++ b/renovate.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended"], + "enabledManagers": ["devbox"], + "minimumReleaseAge": "3 days", + "lockFileMaintenance": { + "enabled": true + } +} From 9cf2ceb7497048b3a8b20ea34f2ddb71a81c6fc0 Mon Sep 17 00:00:00 2001 From: Masakuni Kato <7091+mackato@users.noreply.github.com> Date: Wed, 3 Jun 2026 15:47:51 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E3=83=AA=E3=83=AA=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=81=A7=E3=83=A1=E3=82=B8=E3=83=A3=E3=83=BC=E7=A7=BB=E5=8B=95?= =?UTF-8?q?=E3=82=BF=E3=82=B0=20vX=20=E3=82=92=E4=BD=B5=E5=AD=98=E3=81=95?= =?UTF-8?q?=E3=81=9B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不変タグ vX.Y.Z に加え同メジャーの移動タグ vX を最新へ force 更新し、利用側が 厳密 pin とメジャー追従を選べるようにする。Nix flake の ref はセムバー範囲を 取れないため、メジャー追従はサーバ側の移動タグで実現する。release のトリガは vX.Y.Z に限定し、vX 移動による二重発火を防ぐ。 Co-Authored-By: Claude Opus 4.8 --- .github/workflows/release.yml | 13 ++++++++++--- README.md | 18 +++++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9cc3a37..b80f087 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,11 +1,12 @@ name: release -# SemVer タグ (vX.Y.Z) を push すると、check を通したうえで -# GitHub Release を自動生成ノート付きで作成する。 +# SemVer タグ (vX.Y.Z) を push すると、check を通したうえで GitHub Release を +# 自動生成ノート付きで作成し、同メジャーの移動タグ vX を最新へ force 更新する。 +# トリガは vX.Y.Z に限定し、vX 移動による二重発火を防ぐ。 on: push: tags: - - "v*" + - "v[0-9]+.[0-9]+.[0-9]+" permissions: contents: write @@ -24,3 +25,9 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: gh release create "$GITHUB_REF_NAME" --generate-notes --verify-tag + - name: Move major tag + # vX.Y.Z -> vX の移動タグを最新コミットへ force 更新(lightweight タグ)。 + run: | + major="${GITHUB_REF_NAME%%.*}" + git tag -f "$major" "$GITHUB_SHA" + git push -f origin "$major" diff --git a/README.md b/README.md index 9081493..9506019 100644 --- a/README.md +++ b/README.md @@ -36,12 +36,20 @@ devbox run fmt # nix fmt(nixfmt-tree でツリー全体を整形) 安定版は [GitHub Releases](https://github.com/airs/devtools/releases) の最新(Latest)を参照し、その `vX.Y.Z` を `` に pin する。 +各リリースでは不変タグ `vX.Y.Z` に加え、同メジャーの移動タグ `vX` を最新へ追従させる。利用側は厳密 pin(`vX.Y.Z`)と +メジャー追従(`vX`)を `` で選べる。Nix flake の `` はワイルドカード/セムバー範囲を取れないため、メジャー追従は +このサーバ側の移動タグで実現する。 + SemVer は各ツールの CLI 契約(引数・出力・終了コード)で判断する。 - **MAJOR**: 破壊的変更(フラグ改名・出力フォーマット変更・終了コード変更・ツール削除) - **MINOR**: 後方互換の追加(新ツール追加・新しい任意フラグ) - **PATCH**: 挙動を変えないバグ修正 +配布物(env-init 等)は実行時ツール(bash・git・gawk・gnused・coreutils)を `flake.lock` の nixpkgs から同梱する。 +このため `flake.lock` の更新は同梱ツールの版を変え、利用側へ届けるには release が必要になる。`flake.lock` を更新したら +SemVer を上げて release する。CLI 契約を変えない依存更新は **PATCH**、挙動が変わる場合は上の基準で MINOR / MAJOR に上げる。 + ## ツール ### env-init @@ -61,9 +69,13 @@ SemVer は各ツールの CLI 契約(引数・出力・終了コード)で } ``` - `` は tag / commit でピンする。本リポジトリ自身の `devbox.json` は、ローカル flake を dogfood するため - `path:.#env-init` を使う点だけが利用側と異なる。Nix を使わない環境では `pkgs/env-init/env-init` を直接実行できる - (生スクリプトは単体実行可能なまま)。 + `` は次の 2 パターンから選ぶ。 + + - 低摩擦(メジャー追従): `github:airs/devtools/v1#env-init` — 移動タグ。`devbox update` で最新の 1.x を取得する。 + - 厳密 pin: `github:airs/devtools/v1.2.0#env-init` — 不変タグ。版を固定し、利用側 Renovate でメジャー更新を抑止できる。 + + 本リポジトリ自身の `devbox.json` は、ローカル flake を dogfood するため `path:.#env-init` を使う点だけが利用側と + 異なる。Nix を使わない環境では `pkgs/env-init/env-init` を直接実行できる(生スクリプトは単体実行可能なまま)。 2. **利用側 repo がルートに `.env.template` を用意する**(中央には持ち込まない repo 固有ファイル)。各 worktree で `N` を参照し、ポートを `$((BASE + N))` でずらし、secret を `openssl rand` / `op read` 等で書く。書式は本リポジトリ