GeekFactory

int128.hatenablog.com

GitLab CI/CDでtfnotifyを使う

mercari/tfnotifyがv0.3.2でGitLab CI/CDに対応したので試してみました。個人的には待望の機能追加です。tfnotifyを利用すると、GitLab CI/CDでTerraformを実行した結果をMerge Requestのコメントに反映できます。いちいちジョブの結果を見に行かなくてよいので便利です。

Getting Started

以下のステップでGitLabとtfnotifyを設定します。

  1. Personal Access Tokenの設定
  2. tfnotifyの設定
  3. GitLab CI/CDの設定

1. Personal Access Tokenの設定

tfnotifyはGitLab APIを利用してCommitにコメントを書き込みます。tfnotifyがGitLab APIにアクセスできるように、環境変数でPersonal Access Tokenを渡します。

User Settingsを開き、新しいPersonal Access Tokenを生成します。スコープはapiのみでよいです。

リポジトリのCI/CD Settingsを開き、以下の環境変数を追加します。

  • Key: GITLAB_TOKEN
  • Value: 先ほど生成したPersonal Access Tokenの文字列
  • Masked: yes

2. tfnotifyの設定

.tfnotify.yaml を作成します。ここでは、tfnotifyのREADMEに記載されている設定例をそのまま利用します。

ci: gitlabci
notifier:
  gitlab:
    token: $GITLAB_TOKEN
    base_url: https://gitlab.example.com
    repository:
      owner: OWNER
      name: NAME
terraform:
  fmt:
    template: |
      {{ .Title }}

      {{ .Message }}

      {{ .Result }}

      {{ .Body }}
  plan:
    template: |
      {{ .Title }} <sup>[CI link]( {{ .Link }} )</sup>
      {{ .Message }}
      {{if .Result}}
      <pre><code> {{ .Result }}
      </pre></code>
      {{end}}
      <details><summary>Details (Click me)</summary>
      <pre><code> {{ .Body }}
      </pre></code></details>
  apply:
    template: |
      {{ .Title }}
      {{ .Message }}
      {{if .Result}}
      <pre><code> {{ .Result }}
      </pre></code>
      {{end}}
      <details><summary>Details (Click me)</summary>
      <pre><code> {{ .Body }}
      </pre></code></details>

https://gitlab.com を利用している場合は base_url は設定しなくてもOKです。OWNER, NAMEはリポジトリのパスに合わせて修正してください。

3. GitLab CI/CDの設定

terraformと同時にtfnotifyを実行するように .gitlab-ci.yml を書き換えます。planの例を下記に示します。

stages:
  - build

terraform_plan:
  stage: build
  image:
    name: hashicorp/terraform:0.12.8
    entrypoint:
      - /usr/bin/env
  script:
    # Install tfnotify
    - apk add --upgrade curl
    - curl -fL -o /tmp/tfnotify.tar.gz https://github.com/mercari/tfnotify/releases/download/v0.3.3/tfnotify_0.3.3_linux_amd64.tar.gz
    - tar -C /usr/bin -xzf /tmp/tfnotify.tar.gz
    # Run Terraform
    - cd terraform/
    - terraform --version
    - terraform init
    - terraform fmt | tfnotify fmt
    - terraform plan -out=plan.tfplan | tfnotify plan
  artifacts:
    name: plan
    paths:
      - terraform/plan.tfplan
  cache:
    paths:
      - terraform/.terraform

tfnotifyはGitHub Releasesのバイナリを利用します。hashicorp/terraform イメージにはcurlコマンドが含まれていないため、apkコマンドでcurlをインストールする必要があります。デフォルトではカレントディレクトリにある .tfnotify.yaml を読みに行くので、カレントディレクトリに注意してください。

動作確認

上記の変更をコミットし、新しいMerge Requestを作成します。うまくいけば、Merge Requestにコメントが書き込まれます。