Terraform と GitHub Actions を使い、GitHub リポジトリの設定を管理します。 共通モジュールでリポジトリ、ブランチ保護、環境、Actions の権限を定義します。
mise と Git を準備してください。
セットアップスクリプトは macOS と Linux に対応しています。
mise が未導入の場合は、次のスクリプトで Homebrew と Brewfile の基本ツールを導入します。
./scripts/bootstrap.shBrewfile は環境の起動に必要な mise と Git だけを管理します。
Terraform、aws-vault、Node.js、Python、pnpm、lefthook などは mise.toml で管理します。
文書の検証、JSON の整形、LLM 向けルールの生成に使う依存は package.json と
pnpm-lock.yaml で固定します。Git フックには lefthook を使います。
mise bootstrap --only tools,taskmise の固定ツール、ロックファイルに従った Node.js 依存、LLM 向けルールの参照、
lefthook の Git フックをセットアップします。
mise run bootstrap と mise run setup も同じセットアップを実行します。
非対話環境で既存の node_modules を置き換える場合は CI=true を指定してください。
AWS 認証が必要な Terraform バックエンドの初期化は、別途実行します。
mise run check-toolsbetterleaks のコミットフックは、選択されたファイルの Git インデックスを検査します。
部分的にステージしたファイルも対象とし、秘密の値をマスクします。
外部 API による認証情報の有効性検証は行いません。
mise run lint はルールの生成結果、回帰テスト、全リントを検証します。
秘密検出の対象は、作業ツリー内の選択された追跡ファイルです。
JSON の整形には Oxfmt を使います。
Terraform の整形は terraform fmt、Markdown の検証は markdownlint、textlint、
cspell を使います。JavaScript / TypeScript のソースを持たないため、Oxlint は導入していません。
ルールごとに docs/rules/*.md を原本として管理します。
プロジェクトの構成、開発作業、
コーディング規約、
文書の規約 を個別の文書に配置します。
Markdown 文書は日本語で記述し、言語別の複製を作りません。
rulesync で原本への参照を生成します。
対象は Claude Code、Codex、GitHub Copilot、Devin です。
Codex と Devin の入口は AGENTS.md、Copilot は .github/copilot-instructions.md、
Claude Code は .claude/rules/*.md です。
Copilot と Devin にも個別ルールを生成し、各ルールから対応する原本を参照します。
ルール以外の設定は生成しません。
mise run rules:sync
mise run rules:check複数のブランチを同時に作業する場合は Git worktree を使います。 対話形式のセットアップは次のコマンドで実行します。
mise run wt:setupworktree はリポジトリ内の .worktrees/<branch-name>/ に作成されます。
手動で管理する場合は、次のように操作します。
# 新しいブランチを作成する
git worktree add .worktrees/feature-name -b feature/feature-name
# 既存ブランチを使う
git worktree add .worktrees/feature-name feature/feature-name
# 一覧を確認する
git worktree list
# 削除する
git worktree remove .worktrees/feature-name全タスクは mise tasks で確認できます。
| コマンド | 用途 |
|---|---|
mise run bootstrap / mise run setup |
ツール、依存、ルール、Git フックのセットアップ |
mise run check-tools |
必要なツールの確認 |
mise run wt:setup |
worktree の対話形式セットアップ |
mise run tf:fmt |
Terraform ファイルの整形 |
mise run tf:validate |
Terraform 設定の検証 |
mise run tf:init |
Terraform の初期化 |
mise run tf:plan |
変更計画の作成 |
mise run tf:apply |
変更の適用(対象と計画を事前に確認) |
mise run tf:clean |
Terraform の一時ファイル削除 |
mise run lint / mise run dev:lint |
回帰テストと全リント |
mise run dev:test |
回帰テスト |
mise run rules:sync / mise run rules:check |
LLM 向け参照の生成 / 更新漏れの確認 |
mise run version / mise run status |
バージョン / mise 管理ツールの確認 |
mise run install / mise run update |
mise 管理ツールの導入 / 更新 |
詳しい操作は コマンドリファレンス を参照してください。
- PR と push では、変更されたリポジトリの Terraform ルートだけを選択します。
共通モジュールや Terraform 用 Action の変更は全ルートを選択します。
手動実行ではルート名を指定し、全件対象にする場合は明示的に
allを指定します。 - set-matrix が対象ディレクトリの一覧を生成します。
- setup-terraform が Terraform を準備します。
- terraform-plan が変更計画を作成します。
- 個別ルートへの push は保存した plan を適用します。
共通モジュールや Terraform 用 Action の変更は plan のみを実行し、
各ルートの計画を確認した後で手動適用します。
手動実行の既定は plan のみです。対象と計画を確認してから
apply=trueを指定します。
ローカルの既定対象は terraform-github です。引数で対象を明示できます。
AWS_PROFILE=portfolio mise run tf:init -- terraform-github -input=false
AWS_PROFILE=portfolio mise run tf:validate -- terraform-github
AWS_PROFILE=portfolio mise run tf:plan -- terraform-github -out=tfplan
mise exec -- terraform -chdir=terraform/src/repositories/terraform-github show tfplan
AWS_PROFILE=portfolio mise run tf:apply -- terraform-github tfplan認証用の TF_VAR_github_token は既存の認証方法で設定します。
TERRAFORM_DIR で既定ルートを変更できます。
保存した plan は秘密を含む場合があるため Git に追加しません。
アーカイブ済みのルートでは脆弱性通知を管理しません。
既存の有効な通知リソースは moved で移行し、再作成を避けます。
graph TD
A[リポジトリ取得] --> B[AWS 認証]
B --> C[GitHub App トークン生成]
C --> D[変更計画を保存]
D --> E{適用が有効か}
E -- 有効 --> F[保存した plan を適用]
E -- 無効 --> G[plan のみで終了]
terraform-import ワークフローで既存の GitHub リポジトリを Terraform 管理下に取り込みます。
リポジトリやブランチ保護などを state に取り込む処理を、手動実行で開始します。
module:terraform/src/repositories/配下の対象モジュール名 (例:local-workspace-provisioning、terraform-aws、boilerplate-saas)repo: GitHub 上のリポジトリ名
- GitHub の Actions タブから
Terraform Importを選択します。 Run workflowをクリックし、moduleとrepoを入力して実行します。 例:module=terraform-aws、repo=terraform-aws。- ワークフローが AWS 認証と Terraform の初期化を行い、指定したリポジトリを state に取り込みます。
必要な secrets.TERRAFORM_GITHUB_TOKEN が設定されていることを確認してください。
Terraform root・CIの対象名・手動実行の入力は kazokubi に統一します。
terraform/src/repositories/kazokubi でdev/production Environmentと公開タグの変更・削除防止を管理します。
S3 backendは既存の terraform-github/repositories/family-schedule.tfstate を引き継ぎます。
これは保存先の互換性のためで、stateの移行・リソースの再作成は不要です。
非公開・非EnterpriseのためRequired reviewersを設定せず、mainの承認用Actionsで運用者・再実行者を検証します。
Environmentの実行元はmainに限定します。非公開EnvironmentにはGitHub Pro/Team以上が必要です。
Discordチャンネル・権限・Webhookはkazokubiの infra/discord で管理します。
そのsensitive出力を必須の TF_VAR_discord_webhook_url として渡し、Repository Secretへ保存します。CIではstateから自動取得します。
TF_VAR_release_secrets はdev/productionをキーとするJSONオブジェクトで、各環境のTURSO_AUTH_TOKEN、CLOUDFLARE_API_TOKEN、CLOUDFLARE_ACCOUNT_ID、DB_BACKUP_KEYを設定します。
DBトークンは環境専用、バックアップ鍵は環境ごとに独立した32バイトの鍵を64桁の16進数で指定します。
秘密をtfvars・ログ・PRへ記載せず、state・planも秘密として保護してください。
適用後も毎回同じSecrets変数を渡します。値を省略して既存Secretを削除しようとするplanはprevent_destroyで拒否します。
mise run tf:init kazokubi
mise run tf:validate kazokubi
mise run tf:plan kazokubi -out=release.tfplan
# planの確認後のみ実行
mise run tf:apply kazokubi release.tfplanこの設定の追加だけではDiscordの作成・通知・DB更新・公開は実行されません。 両リポジトリのTerraform適用・認証値設定後に、kazokubiの公開手順でタグ申請と手動承認を行ってください。
kazokubiのCIはDiscordのS3 stateから webhook_url を読み、DiscordのGET APIで存在を確認してからplanします。
出力が未作成・空・不正、stateの読み取り不可、Webhook削除済みの場合は失敗します。
URL・トークンはマスクし、sensitive変数へ渡します。state・planをartifactとして公開しません。
Repository Secret DISCORD_WEBHOOK_URL はこのTerraformが管理します。URLの手動転記は不要です。
CIのAWS OIDCロールにはDiscord stateのGetObjectとprefixを限定したListBucketも必要です。
初回にDiscordをapplyしてstate出力を作り、その後このPRのCIを再実行します。
kazokubiはmainへのpushで自動applyしません。PRのplanを確認・マージした後、mainの
Terraform - GitHub を repository=kazokubi・apply=true で手動実行します。
DB/CloudflareのSecretも管理する場合は、管理用リポジトリのRepository Secret
KAZOKUBI_RELEASE_SECRETS にdev/production別のJSONを初回登録します。
既存の TERRAFORM_GITHUB_TOKEN はkazokubiのSecrets・Environments・リポジトリ設定を管理できる権限が必要です。
Discord Botトークンはこのリポジトリへ渡しません。kazokubi側の初期設定は infra/discord/README.md を参照してください。