⚙️
GitHub Repository Management as Code ありかも
普段の業務で扱うリポジトリが10個前後あるため、GitHubのリポジトリの設定をterraformで管理しちゃう選択肢もありだなと思った今日この頃です。
(組織全体では200個以上のリポジトリがあって手に負えません)
GitHubのリポジトリの設定を管理するのって大変
リポジトリの設定項目ってたくさんありますよね。
↓の記事などを見たりして、完璧な設定にしたいなーと常々思っています。
うまく設定できれば開発生産性爆上がりですが、現実はそんなに甘くなく。
ある日のやり取り① | 👤:チームメンバー 😶:私
👤 プルリクのレビュワーに自動でGitHub Copilotが割り当てられるようにしてください!
😀 なるほど、リポジトリの設定にあるRuleSetってところで自動で割り当てられるようできるのか〜
Copilot割り当て以外も同時に設定が必要そうだな〜
ちなみにどのリポジトリ?
👤 普段使うリポジトリ全部なので10個お願いします!
🥺 お、多いよ、、、とりあえず最低限の設定だけしてみよ、、、
ある日のやり取り② | 👤:チームメンバー 😶:私
👤 チーム体制変わります!ブランチ戦略見直します!
🙃 リポジトリ横断してコラボレーターとかチームの権限見直さなきゃな、、、
なんかブランチ戦略変えたからかマージがブロックされちゃう、、、
GitHubのリポジトリの設定を変える方法って何があるか気になった
安直に思いついたものたち。
- GitHubのWebUI ← 手作業はめんどくさいよね
- GitHubのAPI ← curlとかでAPI叩くのってめんどくさいし、やり方忘れるよね
- no-more-git-oops ← 最初の方に上げた記事の人が作ったツール
- TerraformのGitHubリソース ← これかっ!?
Terraform普通にありじゃない?
雑に書いてみました。
実際にはファイル分割したり、モジュール化して複数リポジトリで再利用できるようにしたりすると思います。
良い点は
- リポジトリ自身でTFファイルを含めて管理しちゃっても良いし、管理用リポジトリみたいなのを1つ作って複数リポジトリの設定を集中管理や標準化することもできる。
- 設定の確認や変更の権限が無いメンバーでも、プルリクベースで設定の変更を依頼したり、現在の設定を確認したりすることができる。
微妙な点は
- Copilotをレビュワーに割り当てる設定などの比較的新しい機能は未実装だった(ISSUEにはあるのでいつか実装されそうだけど)
あたりでしょうか。
sample.tf
terraform {
required_providers {
github = {
source = "integrations/github"
version = "6.6.0"
}
}
}
# githubプロバイダーを使います
provider "github" {
owner = "my-organizasion"
}
# リポジトリの基本的な設定
resource "github_repository" "example" {
name = "example-repo-created-with-terraform"
description = "Terraformで管理中"
visibility = "internal"
auto_init = true
gitignore_template = "Node"
has_issues = true
has_projects = false
has_discussions = true
has_downloads = false
has_wiki = true
allow_merge_commit = false
allow_squash_merge = true
allow_rebase_merge = false
allow_auto_merge = false
allow_update_branch = true
delete_branch_on_merge = true
vulnerability_alerts = true
}
# RuleSetの設定
resource "github_repository_ruleset" "example" {
name = "example"
repository = github_repository.example.name
target = "branch"
enforcement = "active"
conditions {
ref_name {
# デフォルトブランチとfeatureブランチが対象
include = ["~DEFAULT_BRANCH", "refs/heads/feature/**/*"]
exclude = []
}
}
rules {
creation = true
update = true
deletion = true
required_linear_history = true
pull_request {
# レビューの必要数
required_approving_review_count = 1
dismiss_stale_reviews_on_push = true
}
}
}
# リポジトリレベルで使うシークレット
resource "github_actions_secret" "example_secret" {
repository = github_repository.example.name
secret_name = "NANKA_NO_TOKEN"
plaintext_value = "SECRET VALUE" # 値は引数とかで指定する想定
}
終わり
こんなのも見つけましたが、全然分からなかったので、またの機会にでも。
Discussion