複数のGitHubリポジトリをTerraformて管理する

普段の仕事で PoC やその他次々発生する実験的なプロジェクトのために"よく似た GitHub リポジトリ"を管理する必要があった。
具体的にはリポジトリ管理について次のようなモチベーションがあった。

  • 命名やその他ルールに則ったリポジトリを作りたい
    • 例) リポジトリ名を用途に応じて -poc, -competition で終わらせる
  • 同じカテゴリのリポジトリには同じ Issue Label を作りたい
    • 例) PoC 用なら xxx (赤), yyy (緑), zzz (青)を必ず用意する、色も統一する
  • リポジトリ自体の作成やアーカイブがいつなぜ行われたのか記録を残したい
    • 例) Organization 内にリポジトリを作る前に目的や名称を相談する

これらを Terraform のGitHub Providerを使って「GitHub リポジトリを Provisioning する」ことで実現できそうだったので試してみた。

Terraform は Infrastructure as Code(IaC)でよく使われるツールで、今回も IaC の応用と言える。
“DevEnv as Code"とでもいうのだろうか?

How to provisioning

今回のサンプルコードはこちら:
https://github.com/mazgi-showcase/2019.07.manage-repos-with-terraform

providergithub を指定して、次のように tokenorganization を指定することで provisioning 可能になる。
token には GitHub のPersonal Access Tokenを指定する。

/terraform.tf

GitHub Enterprise の場合はさらに base_urlhttps://github.someorg.example/api/v3/ のような WebAPI のエンドポイント URL を指定することで使える。

provider "github" {
  token        = "${var.github_token}"
  organization = "mazgi-sandbox"
}

リポジトリの管理

例えば以下のような"PoC 用のリポジトリ"を定義として作っておく。

  • Issue, Wiki などの有効/無効
  • Issue Label
  • Team

/github_repository.poc.tf

resource "github_repository" "poc" {
  count = length(var.repositories_poc)

  name        = format("201907.tf-gh.%s-poc", element(keys(var.repositories_poc), count.index))
  description = element(values(var.repositories_poc), count.index)
  has_issues  = true
}

そしてリポジトリ名などの各リポジトリ固有の情報を List や Map で外出ししておく。

variable "repositories_poc" {
  type = map(string)
  default = {
    "first" = "First PoC"
    "2nd"   = "PoC #2"
    "03"    = "PoC 03"
  }
}

同じような PoC 用リポジトリを増やす時は List や Map の要素を増やすことで対応できる。

Examples

Provisioning 結果のサンプル

実際に Provisioning されたリポジトリはこちら:
https://github.com/mazgi-sandbox?utf8=%E2%9C%93&q=201907.tf-gh.

PoC 用とコンペ用に見立てた 2 パターンのリポジトリが各 3 つ、計 6 つ出来ている。
(prefix として 201907.tf-gh. をつけている)

PoC 用リポジトリにはコードで定義した ginza, hibiya, marunouchi の 3 つの Issue Label が作られている。

コンペ用リポジトリにも定義した Issue Label が同じ名前/同じ色で作られている。
もちろん同じカテゴリのリポジトリには同じラベルが作られている。

Issue Label をコードで管理することで「X リポジトリの xxx Label だけ赤ではなくピンク」とか「Y リポジトリと Z リポジトリで yyy Label と zzz Label の色が入れ替わっている」なんて事態を防げる。

Team も管理できるので新しく参画した方の権限付与漏れなども防ぎやすくなる。

/github_team.poc-owners.tf,
/github_team.competition-owners.tf

That’s all

このように GitHub リポジトリの管理自体を GitHub 上のコードで行い、さらに Terraform の適用も CI/CD で行えば GitHub リポジトリ自体の品質や履歴を GitHub 上で Meta に管理できるようになる。

さらに /.github/CODEOWNERS を書いて特定のコードの code owner を指定することで「リポジトリは各エンジニアが作るが、Team へのメンバー追加はマネージャーの承認を得る」など様々なワークフローも回すことができる。

About code owners

会社では GitHub Enterprise を使っていて、Organization やリポジトリを作り放題で便利な反面、増え続ける GitHub リポジトリの管理に頭を抱えることもあったが Terraform によるコード化で多くの問題を解消できそう。