⚙️

GitHub Repository Management as Code ありかも

に公開

普段の業務で扱うリポジトリが10個前後あるため、GitHubのリポジトリの設定をterraformで管理しちゃう選択肢もありだなと思った今日この頃です。
(組織全体では200個以上のリポジトリがあって手に負えません)

GitHubのリポジトリの設定を管理するのって大変

リポジトリの設定項目ってたくさんありますよね。

↓の記事などを見たりして、完璧な設定にしたいなーと常々思っています。
https://speakerdeck.com/dzeyelid/20230805-github-useful-hidden-repository-settings
https://zenn.dev/kuritify/articles/github-rulesets

うまく設定できれば開発生産性爆上がりですが、現実はそんなに甘くなく。

ある日のやり取り① | 👤:チームメンバー 😶:私
👤 プルリクのレビュワーに自動でGitHub Copilotが割り当てられるようにしてください!

😀 なるほど、リポジトリの設定にあるRuleSetってところで自動で割り当てられるようできるのか〜
   Copilot割り当て以外も同時に設定が必要そうだな〜
  ちなみにどのリポジトリ?

👤 普段使うリポジトリ全部なので10個お願いします!

🥺 お、多いよ、、、とりあえず最低限の設定だけしてみよ、、、
ある日のやり取り② | 👤:チームメンバー 😶:私
👤 チーム体制変わります!ブランチ戦略見直します!

🙃 リポジトリ横断してコラボレーターとかチームの権限見直さなきゃな、、、
   なんかブランチ戦略変えたからかマージがブロックされちゃう、、、

GitHubのリポジトリの設定を変える方法って何があるか気になった

安直に思いついたものたち。

  1. GitHubのWebUI ← 手作業はめんどくさいよね
  2. GitHubのAPI ← curlとかでAPI叩くのってめんどくさいし、やり方忘れるよね
  3. no-more-git-oops ← 最初の方に上げた記事の人が作ったツール
  4. 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"  # 値は引数とかで指定する想定
}

https://registry.terraform.io/providers/integrations/github/latest/docs

終わり

こんなのも見つけましたが、全然分からなかったので、またの機会にでも。
https://github.com/github/safe-settings

レバテック開発部

Discussion