kakakakakku blog

Weekly Tech Blog: Keep on Learning!

tfcmt: GitHub Actions から terraform plan / apply の出力結果をプルリクエストにコメントしよう

GitHub Actions で terraform plan / terraform apply を実行するときに出力結果をイイ感じにプルリクエストにコメントしたいという場面があった💬 自前でゴニョゴニョと実装するのではなく tfcmt を試してみたらとても便利だったので,検証ログも兼ねてまとめておこうと思う❗️

suzuki-shunsuke.github.io

動作確認

イイ感じ \( 'ω')/

plan 結果

apply 結果

GitHub Actions ワークフロー

👾 .github/workflows/terraform-plan.yml

terraform plan を実行するときに tfcmt plan --patch -- terraform plan のように tfcmt plan コマンドを組み合わせれば OK👌 あと --patch オプションを指定すると既存のコメントを更新できて,プルリクエストのコメントが無駄に増えないように制御できるのも良かった.

suzuki-shunsuke.github.io

name: Terraform Plan

on:
  pull_request:
    branches:
      - main

permissions:
  id-token: write
  contents: read
  pull-requests: write
  issues: write

jobs:
  plan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::000000000000:role/xxxxx
          aws-region: ap-northeast-1
      - uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: 1.10.3
      - name: Setup tfcmt
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          gh release download -R suzuki-shunsuke/tfcmt v4.14.4 -p tfcmt_linux_amd64.tar.gz
          tar -xzf tfcmt_linux_amd64.tar.gz
          sudo mv tfcmt /usr/local/bin/
          tfcmt --version
      - name: Terraform Init
        run: terraform init
      - name: Terraform Plan
        env:
          GITHUB_TOKEN: ${{ github.token }}
        run: tfcmt plan --patch -- terraform plan

👾 .github/workflows/terraform-apply.yml

terraform apply を実行するときに tfcmt apply -- terraform apply -auto-approve のように tfcmt apply コマンドを組み合わせれば OK👌

name: Terraform Apply

on:
  pull_request:
    types:
      - closed
    branches:
      - main

permissions:
  id-token: write
  contents: read
  pull-requests: write
  issues: write

jobs:
  apply:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::000000000000:role/xxx
          aws-region: ap-northeast-1
      - uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: 1.10.3
      - name: Setup tfcmt
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          gh release download -R suzuki-shunsuke/tfcmt v4.14.4 -p tfcmt_linux_amd64.tar.gz
          tar -xzf tfcmt_linux_amd64.tar.gz
          sudo mv tfcmt /usr/local/bin/
          tfcmt --version
      - name: Terraform Init
        run: terraform init
      - name: Terraform Apply
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: tfcmt apply -- terraform apply -auto-approve

ポイント

issues: write

tfcmt では自動的に add-or-update / no-changes などのラベル作ってプルリクエストに紐付けてくれる🏷️ 最初に実行したときに You do not have permission to create labels on this repository. というエラーが出て,issues: write 権限を追加したら解決した👌

add a label add-or-update: POST https://api.github.com/repos/kakakakakku/sandbox-terraform-github-actions/issues/1/labels: 403 You do not have permission to create labels on this repository. [{Resource:Repository Field:label Code:unauthorized Message:}]

tfcmt のセットアップ

tfcmt をシュッとセットアップするアクションがあったら使いたいな〜と思ったけど,公式ではなさそうだった(actions-setup-tfcmt というのはあるようだった).よって,今回は gh release download コマンドを使って tar.gz から展開することにした.

gh release download -R suzuki-shunsuke/tfcmt v4.14.4 -p tfcmt_linux_amd64.tar.gz
tar -xzf tfcmt_linux_amd64.tar.gz
sudo mv tfcmt /usr/local/bin/

ドキュメントを読むと YAML で CLI ツールセットを管理する aqua を使う案もあったけど今回は見送った.

suzuki-shunsuke.github.io