Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .github/dependabot.yml
Original file line numberDiff line numberDiff line change
@@ -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:
Comment on lines +20 to +22

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘ありがとうございます。確認しましたが、package-ecosystem: nix は現在サポートされています。

Dependabot の Nix エコシステム対応は 2026-04-07 に GA となり、package-ecosystem: nix を指定すると flake.lock の入力(GitHub / GitLab / Sourcehut / 素の git)を監視し、上流に新しいコミットがあれば PR を作成します(version updates のみ。security updates は対象外)。公式の supported ecosystems 一覧にも YAML 値 nix が version updates 対応として掲載されています。

本リポジトリの方針として、devbox は Dependabot 未対応のため Renovate、それ以外(github-actions / nix=flake.lock)を Dependabot に分担しています。したがって現状維持とします。

参考:

interval: weekly
day: monday
time: "09:00"
timezone: Asia/Tokyo
cooldown:
default-days: 3
13 changes: 10 additions & 3 deletions .github/workflows/release.yml
Original file line numberDiff line numberDiff line change
@@ -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]+"

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご指摘ありがとうございます。確認しましたが、この glob は正しく v1.2.3 にマッチします。

GitHub Actions の filter pattern では + は「直前の文字(ここでは文字クラス [0-9])の 1 回以上」を表す特殊文字で、. はリテラルです。公式 cheat sheet にも v[12].[0-9]+.[0-9]+v1.10.1 / v2.0.0 にマッチする例が明記されています。

したがって v[0-9]+.[0-9]+.[0-9]+v1.2.3 にマッチし、ドットを含まない移動タグ v1 にはマッチしない(=二重発火しない)想定どおりの挙動です。現状維持とします。

参考: https://docs.github.com/actions/using-workflows/workflow-syntax-for-github-actions (filter pattern cheat sheet)


permissions:
contents: write
Expand All@@ -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"
36 changes: 36 additions & 0 deletions .github/workflows/renovate.yml
Original file line numberDiff line numberDiff line change
@@ -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
18 changes: 15 additions & 3 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,12 +36,20 @@ devbox run fmt # nix fmt(nixfmt-tree でツリー全体を整形)

安定版は [GitHub Releases](https://github.com/airs/devtools/releases) の最新(Latest)を参照し、その `vX.Y.Z` を `<ref>` に pin する。

各リリースでは不変タグ `vX.Y.Z` に加え、同メジャーの移動タグ `vX` を最新へ追従させる。利用側は厳密 pin(`vX.Y.Z`)と
メジャー追従(`vX`)を `<ref>` で選べる。Nix flake の `<ref>` はワイルドカード/セムバー範囲を取れないため、メジャー追従は
このサーバ側の移動タグで実現する。

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
Expand All@@ -61,9 +69,13 @@ SemVer は各ツールの CLI 契約(引数・出力・終了コード)で
}
```

`<ref>` は tag / commit でピンする。本リポジトリ自身の `devbox.json` は、ローカル flake を dogfood するため
`path:.#env-init` を使う点だけが利用側と異なる。Nix を使わない環境では `pkgs/env-init/env-init` を直接実行できる
(生スクリプトは単体実行可能なまま)。
`<ref>` は次の 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` 等で書く。書式は本リポジトリ
Expand Down
9 changes: 9 additions & 0 deletions renovate.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"],
"enabledManagers": ["devbox"],
"minimumReleaseAge": "3 days",
"lockFileMaintenance": {
"enabled": true
}
}