Skip to content

fix: Improve Terraform output parsing in deployment workflow #43

fix: Improve Terraform output parsing in deployment workflow

fix: Improve Terraform output parsing in deployment workflow #43

Workflow file for this run

name: Terraform CI
on:
push:
branches:
- main
- develop
paths:
- "terraform/environments/**"
- "terraform/modules**"
- ".github/workflows/**"
pull_request:
branches:
- main
- develop
paths:
- "terraform/environments/**"
- "terraform/modules**"
env:
AWS_REGION: ap-northeast-1
TF_VERSION: 1.5.0
jobs:
terraform-fmt:
name: Terraform Format Check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: ${{ env.TF_VERSION }}
- name: Terraform Format Check
run: terraform fmt -check -recursive
terraform-validate:
name: Terraform Validate
runs-on: ubuntu-latest
strategy:
matrix:
environment: [dev, prod]
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: ${{ env.TF_VERSION }}
- name: Terraform Init
working-directory: terraform/environments/${{ matrix.environment }}
run: terraform init -backend=false
- name: Set environment variables for validation
id: set-validate-vars
run: |
if [ "${{ matrix.environment }}" == "dev" ]; then
echo "domain_name=dev.note-app.kanare.dev" >> $GITHUB_OUTPUT
echo "api_domain_name=api-dev.note-app.kanare.dev" >> $GITHUB_OUTPUT
else
echo "domain_name=note-app.kanare.dev" >> $GITHUB_OUTPUT
echo "api_domain_name=api.note-app.kanare.dev" >> $GITHUB_OUTPUT
fi
- name: Terraform Validate
working-directory: terraform/environments/${{ matrix.environment }}
env:
# 必須変数(ダミー値)
TF_VAR_env: ${{ matrix.environment }}
TF_VAR_domain_name: ${{ steps.set-validate-vars.outputs.domain_name }}
TF_VAR_api_domain_name: ${{ steps.set-validate-vars.outputs.api_domain_name }}
# Cloudflare設定(オプション)
TF_VAR_enable_cloudflare_dns: "false"
TF_VAR_cloudflare_api_token: "dummy"
TF_VAR_cloudflare_zone_id: "dummy"
run: terraform validate
terraform-plan:
name: Terraform Plan
runs-on: ubuntu-latest
needs: [terraform-fmt, terraform-validate]
if: github.event_name == 'pull_request' || github.ref == 'refs/heads/main'
permissions:
contents: read
pull-requests: write
strategy:
matrix:
environment: [dev, prod]
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: ${{ env.TF_VERSION }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Terraform Init
working-directory: terraform/environments/${{ matrix.environment }}
run: terraform init
- name: Set environment variables
id: set-env-vars
run: |
if [ "${{ matrix.environment }}" == "dev" ]; then
echo "domain_name=dev.note-app.kanare.dev" >> $GITHUB_OUTPUT
echo "api_domain_name=api-dev.note-app.kanare.dev" >> $GITHUB_OUTPUT
else
echo "domain_name=note-app.kanare.dev" >> $GITHUB_OUTPUT
echo "api_domain_name=api.note-app.kanare.dev" >> $GITHUB_OUTPUT
fi
- name: Terraform Plan
id: plan
working-directory: terraform/environments/${{ matrix.environment }}
continue-on-error: true
env:
# 必須変数
TF_VAR_env: ${{ matrix.environment }}
TF_VAR_domain_name: ${{ steps.set-env-vars.outputs.domain_name }}
TF_VAR_api_domain_name: ${{ steps.set-env-vars.outputs.api_domain_name }}
# Cloudflare設定(オプション:DNS自動管理を有効にする場合)
TF_VAR_enable_cloudflare_dns: ${{ secrets.ENABLE_CLOUDFLARE_DNS || 'false' }}
TF_VAR_cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN || '' }}
TF_VAR_cloudflare_zone_id: ${{ secrets.CLOUDFLARE_ZONE_ID || '' }}
run: |
terraform plan -no-color -out=tfplan 2>&1 | tee plan_output.txt
echo "exitcode=$?" >> $GITHUB_OUTPUT
- name: Comment PR
uses: actions/github-script@v6
if: github.event_name == 'pull_request'
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const fs = require('fs');
const planOutput = fs.readFileSync('terraform/environments/${{ matrix.environment }}/plan_output.txt', 'utf8');
const truncatedPlan = planOutput.length > 65000 ? planOutput.substring(0, 65000) + '\n\n... (truncated)' : planOutput;
const output = `#### Terraform Plan - \`${{ matrix.environment }}\` environment
<details><summary>Show Plan</summary>
\`\`\`terraform
${truncatedPlan}
\`\`\`
</details>
*Environment: \`${{ matrix.environment }}\`, Pusher: @${{ github.actor }}, Workflow: \`${{ github.workflow }}\`*`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})