fix: Improve Terraform output parsing in deployment workflow #43
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | |
| }) |