かまたま日記3

プログラミングメイン、たまに日常

Travis CIの設定用のTerraform providerを作った話

この記事はTerraform Advent Calendar 2019 の9日目の記事です。

私の所属しているSEQSENSEではTravis CIを主に利用しています。 CIサービスを使うにあたって、ビルドで使う環境変数SSH鍵などの管理は課題の一つです。

一つ一つ手動で設定していってもいいのですが、リポジトリ数が多くなると

  • リポジトリを横断して一括で設定を変更するのが大変
  • どのリポジトリに何のクレデンシャルが使われているのかがわからないので、うかつにRevokeすると変なところでビルドが落ちる

などの問題が発生したりします。 それを解決するためにTravis CIの設定をコードナイズして一括管理するためのTerraform providerを作成しました。

github.com

よかったら、使ってみてください! *1

使い方

これはオレオレprovider (正式名称はThird-party plugin) のため、バイナリをGitHubのReleasesから落として来る必要があります。

curlなんかを使ってCLIでインストールする場合はこんな感じでしょうか。

$ latest=$(curl -s https://api.github.com/repos/kamatama41/terraform-provider-unofficial-travis/releases/latest | jq -r ".name")
$ os=$(uname | tr '[:upper:]' '[:lower:]')
$ curl -LO https://github.com/kamatama41/terraform-provider-unofficial-travis/releases/download/${latest}/terraform-provider-utravis_${latest}_${os}_amd64.zip
$ unzip terraform-provider-utravis_${latest}_${os}_amd64.zip && rm terraform-provider-utravis_${latest}_${os}_amd64.zip

インストール後、実際のTFファイルの書き方はこんな感じになっています。

# Configure the unofficial Travis Provider (utravis)
provider "utravis" {
  base_url = "https://api.travis-ci.com/"
  token = "${var.travis_api_token}"
}

# Add an environment variable to the repository
resource "utravis_env_var" "my-repo" {
  slug = "myuser/my-repository"
  name = "FOO"
  value = "bar"
  public = true
}

# Add a private key to the repository
resource "utravis_key_pair" "my-repo" {
  slug = "myuser/my-repository"
  value = "${file("~/.ssh/id_travis_rsa")}"
}
  • プロバイダ名は utravis
    • base_url でアクセスするAPIを指定する (travis-ci.com or travis-ci.org)
    • tokenTravis CIのコンソールで取得する
  • utravis_env_var環境変数を設定するためのリソースです
    • public フラグでTravisのコンソール上で表示するかどうかを指定できます (デフォルトはfalse)
  • utravis_key_pairSSH Keyを登録するためのリソースです。 value秘密鍵の中身を指定します

注意

  • 両リソースのValueはSHA-256でハッシュ化された値をstateファイルに保存して生のデータではどこにも保存しませんが、valueを渡すまでののクレデンシャルの管理には十分注意してください *2
  • Travis CIにはブランチごとに環境変数を出し分けるEnvironment variables per branch という機能が少し前に追加されましたが未対応です

*1:そもそもTravisを会社で使ってるというのを(ry

*2:無いとは思いますが、直接tfファイルに書くなどは当然NG