🤖

GitHub Actions で GitHub Models を使って terraform plan の実行結果を要約してもらう

に公開

GitHub Actions の GITHUB_TOKEN を使って GitHub Models を利用できるようになりました。

https://github.blog/changelog/2025-04-14-github-actions-token-integration-now-generally-available-in-github-models/
https://docs.github.com/en/github-models/integrating-ai-models-into-your-development-workflow#using-ai-models-with-github-actions

これを使って terraform plan の実行結果を要約できたら便利そうだなと思ったのでやってみました。


こういうの

https://github.com/koki-develop/terraform-plan-summarize/pull/1#issuecomment-2871373842

terraform plan の実行結果を要約してもらう GitHub Actions ワークフロー

GitHub Actions で GitHub Models を使用するためのアクションが公式から提供されているので、今回はこちらを使います。

https://github.com/actions/ai-inference

以下は Pull Request に対して terraform plan を実行し、その実行結果を AI で要約してコメントするワークフローの例です。

.github/workflows/terraform-plan.yml
name: terraform plan

on:
  pull_request:

jobs:
  plan:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      models: read # GitHub Models を利用するために必要
      pull-requests: write # Pull Request にコメントするために必要
    steps:
      # 1. セットアップ
      - uses: actions/checkout@v4
        with:
          persist-credentials: false
      - uses: hashicorp/setup-terraform@v3

      # 2. `terraform init` ~ `terraform plan` を実行
      - name: terraform plan
        id: plan
        run: |
          terraform init
          terraform plan | tee plan.txt

          # 実行結果を output に設定
          EOF=$(uuidgen)
          {
            echo "result<<$EOF"
            # ANSI エスケープシーケンスは削除しておく
            sed 's/\x1b\[[0-9;]*[m]//g' plan.txt
            echo "$EOF"
          } >> "$GITHUB_OUTPUT"

      # 3. `terraform plan` の実行結果を要約する
      - uses: actions/ai-inference@v1
        id: summary
        with:
          model: openai/gpt-4o # 使用するモデル
          max-tokens: 4000 # 生成するトークン数の上限
          prompt: ${{ steps.plan.outputs.result }}
          system-prompt: |
            あなたは `terraform plan` の実行結果を要約する AI アシスタントです。
            ユーザーから渡された `terraform plan` の実行結果をわかりやすく日本語で要約し、以下のフォーマットに従って Markdown 形式で出力してください。

            # Summary

            <terraform plan の実行結果について簡潔にまとめてください。>

            ## Create

            <作成されるリソースについてまとめてください。>

            ## Update

            <更新されるリソースについてまとめてください。>

            ## Delete

            <削除されるリソースについてまとめてください。>

      # 4. 要約を Pull Request にコメントする
      - uses: peter-evans/find-comment@v3
        id: find-comment
        with:
          issue-number: ${{ github.event.pull_request.number }}
          comment-author: 'github-actions[bot]'
          body-includes: '<!-- TERRAFORM_PLAN_SUMMARY -->'
      - uses: peter-evans/create-or-update-comment@v4
        with:
          comment-id: ${{ steps.find-comment.outputs.comment-id }}
          edit-mode: replace
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            <!-- TERRAFORM_PLAN_SUMMARY -->
            ${{ steps.summary.outputs.response }}

順を追って解説していきます。

permissions について

jobs:
  plan:
    # ...
    permissions:
      contents: read
      models: read # GitHub Models を利用するために必要
      pull-requests: write # Pull Request にコメントするために必要

GitHub Actions で GitHub Models を利用するには models: read の権限が必要なので、忘れないように注意してください。

https://docs.github.com/en/github-models/integrating-ai-models-into-your-development-workflow#setting-permissions

また、今回は Pull Request にコメントを作成するために pull-requests: write もつけています。

1. セットアップ

- uses: actions/checkout@v4
  with:
    persist-credentials: false
- uses: hashicorp/setup-terraform@v3

checkout して Terraform をインストールしているだけです。
特に細かい解説はしません。

2. terraform init ~ terraform plan を実行

- name: terraform plan
  id: plan
  run: |
    terraform init
    terraform plan | tee plan.txt

    # 実行結果を output に設定
    EOF=$(uuidgen)
    {
      echo "result<<$EOF"
      # ANSI エスケープシーケンスは削除しておく
      sed 's/\x1b\[[0-9;]*[m]//g' plan.txt
      echo "$EOF"
    } >> "$GITHUB_OUTPUT"

まずは terraform initterraform plan を実行します。
tee を使うことで、 terraform plan の実行結果を標準出力に出力しつつ plan.txt として保存します。

terraform init
terraform plan | tee plan.txt

実行結果を step の output として設定します。

# 実行結果を output に設定
EOF=$(uuidgen)
{
  echo "result<<$EOF"
  # ANSI エスケープシーケンスは削除しておく
  sed 's/\x1b\[[0-9;]*[m]//g' plan.txt
  echo "$EOF"
} >> "$GITHUB_OUTPUT"

terraform plan の実行結果には ANSI エスケープシーケンスが含まれているため、 sed を使って削除しています。
最初から terraform plan 実行時に -no-color フラグをつけてもいいのですが、それだと標準出力にも色がつかなくなってしまうのでこのようにしています。

3. terraform plan の実行結果を要約する

- uses: actions/ai-inference@v1
  id: summary
  with:
    model: openai/gpt-4o # 使用するモデル
    max-tokens: 4000 # 生成するトークン数の上限
    prompt: ${{ steps.plan.outputs.result }}
    system-prompt: |
      あなたは `terraform plan` の実行結果を要約する AI アシスタントです。
      ユーザーから渡された `terraform plan` の実行結果をわかりやすく日本語で要約し、以下のフォーマットに従って Markdown 形式で出力してください。

      # Summary

      <terraform plan の実行結果について簡潔にまとめてください。>

      ## Create

      <作成されるリソースについてまとめてください。>

      ## Update

      <更新されるリソースについてまとめてください。>

      ## Delete

      <削除されるリソースについてまとめてください。>

actions/ai-inference アクションを使用して GitHub Models を利用し、 terraform plan の実行結果を要約します。

system-prompt には terraform plan の実行結果を要約するための指示を書き、 prompt には terraform plan の実行結果をそのまま渡します。
modelmax-tokens などは適宜調整してください。

4. 要約を Pull Request にコメントする

- uses: peter-evans/find-comment@v3
  id: find-comment
  with:
    issue-number: ${{ github.event.pull_request.number }}
    comment-author: 'github-actions[bot]'
    body-includes: '<!-- TERRAFORM_PLAN_SUMMARY -->'
- uses: peter-evans/create-or-update-comment@v4
  with:
    comment-id: ${{ steps.find-comment.outputs.comment-id }}
    issue-number: ${{ github.event.pull_request.number }}
    edit-mode: replace
    body: |
      <!-- TERRAFORM_PLAN_SUMMARY -->
      ${{ steps.summary.outputs.response }}

要約した内容は actions/ai-inference アクションの outputs.response から取得できます。

https://github.com/actions/ai-inference/blob/f8ee4c952b7dca7b8a4529edd04dc5cc3d49c435/action.yml#L42-L44

これを peter-evans/create-or-update-comment アクションを使用して Pull Request にコメントします。
peter-evans/find-comment アクションと組み合わせることで、ワークフローが複数回実行された場合でも複数のコメントが追加されることはなく、単一のコメントが更新されるようになります。


実際に作成されたコメント

https://github.com/koki-develop/terraform-plan-summarize/pull/1#issuecomment-2871373842

まとめ

無料でサクッと使えて便利ですね。
tfcmt も合わせて使うとより捗りそうです。

https://zenn.dev/kou_pg_0131/articles/tfcmt-on-gh-actions

Appendix

API のレート制限について

actions/ai-inference アクションは内部的に GitHub Models の REST API を叩いています。
今のところこの API は無料ですがレート制限 ( モデルによって異なる ) があるため注意してください。
詳しくは以下の公式ドキュメントをご参照ください。

https://docs.github.com/en/github-models/prototyping-with-ai-models#rate-limits

Terraform Plan Analyzer

同じような用途のものとして、公式から Terraform Plan Analyzer という Terraform Module が公開されています。
HCP Terraform (旧 Terraform Cloud) を利用している場合はこちらを試してみてもいいかもしれません。

https://x.com/HashiCorp/status/1836798948008190088
https://github.com/aws-ia/terraform-aws-runtask-tf-plan-analyzer

Terraform Plan Analyzer については以下の記事がわかりやすいので、こちらをご参照ください。

https://dev.classmethod.jp/articles/summary-terraform-plan-using-tf-plan-analyzer/

GitHubで編集を提案
terraform-jp

Discussion