複数のGitHubリポジトリをTerraformて管理する
普段の仕事で PoC やその他次々発生する実験的なプロジェクトのために"よく似た GitHub リポジトリ"を管理する必要があった。
具体的にはリポジトリ管理について次のようなモチベーションがあった。
- 命名やその他ルールに則ったリポジトリを作りたい
- 例) リポジトリ名を用途に応じて
-poc
,-competition
で終わらせる
- 例) リポジトリ名を用途に応じて
- 同じカテゴリのリポジトリには同じ Issue Label を作りたい
- 例) PoC 用なら
xxx
(赤),yyy
(緑),zzz
(青)を必ず用意する、色も統一する
- 例) PoC 用なら
- リポジトリ自体の作成やアーカイブがいつなぜ行われたのか記録を残したい
- 例) 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
provider
に github
を指定して、次のように token
と organization
を指定することで provisioning 可能になる。
token
には GitHub のPersonal Access Tokenを指定する。
GitHub Enterprise の場合はさらに base_url
に https://github.someorg.example/api/v3/
のような WebAPI のエンドポイント URL を指定することで使える。
provider "github" {
token = "${var.github_token}"
organization = "mazgi-sandbox"
}
リポジトリの管理
例えば以下のような"PoC 用のリポジトリ"を定義として作っておく。
- Issue, Wiki などの有効/無効
- Issue Label
- Team
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 へのメンバー追加はマネージャーの承認を得る」など様々なワークフローも回すことができる。
会社では GitHub Enterprise を使っていて、Organization やリポジトリを作り放題で便利な反面、増え続ける GitHub リポジトリの管理に頭を抱えることもあったが Terraform によるコード化で多くの問題を解消できそう。