1515env :
1616 TF_VERSION : " 1.7.5"
1717 AWS_REGION : " us-east-1"
18- AWS_TF_ROLE_ARN : ${{ secrets.AWS_TF_ROLE_ARN }}
1918
2019jobs :
2120 # ── Plan — runs on every PR that touches terraform/ ────────────────────────
2221 plan :
2322 name : Terraform Plan (${{ matrix.env }})
2423 runs-on : ubuntu-latest
25- if : ${{ github.event_name == 'pull_request' && env.AWS_TF_ROLE_ARN != '' }}
24+ if : ${{ github.event_name == 'pull_request' }}
2625 strategy :
2726 matrix :
2827 env : [dev, prod]
@@ -38,34 +37,54 @@ jobs:
3837 steps :
3938 - uses : actions/checkout@v4
4039
40+ - name : Check Terraform AWS role
41+ id : aws_role
42+ run : |
43+ if [ -n "${{ secrets.AWS_TF_ROLE_ARN }}" ]; then
44+ echo "configured=true" >> "$GITHUB_OUTPUT"
45+ else
46+ echo "configured=false" >> "$GITHUB_OUTPUT"
47+ fi
48+
49+ - name : Skip when Terraform AWS role is not configured
50+ if : steps.aws_role.outputs.configured != 'true'
51+ run : echo "Skipping Terraform plan because AWS_TF_ROLE_ARN is not configured."
52+
4153 - name : Configure AWS credentials (OIDC)
54+ if : steps.aws_role.outputs.configured == 'true'
4255 uses : aws-actions/configure-aws-credentials@v4
4356 with :
44- role-to-assume : ${{ env .AWS_TF_ROLE_ARN }}
57+ role-to-assume : ${{ secrets .AWS_TF_ROLE_ARN }}
4558 aws-region : ${{ env.AWS_REGION }}
4659
4760 - name : Set up Terraform
61+ if : steps.aws_role.outputs.configured == 'true'
4862 uses : hashicorp/setup-terraform@v3
4963 with :
5064 terraform_version : ${{ env.TF_VERSION }}
5165
5266 - name : Terraform Init
67+ if : steps.aws_role.outputs.configured == 'true'
5368 run : terraform init -input=false
5469
5570 - name : Terraform Format check
71+ if : steps.aws_role.outputs.configured == 'true'
5672 run : terraform fmt -check -recursive ../../
5773
5874 - name : Terraform Validate
75+ if : steps.aws_role.outputs.configured == 'true'
5976 run : terraform validate
6077
6178 - name : Terraform Plan
6279 id : plan
80+ if : steps.aws_role.outputs.configured == 'true'
6381 env :
6482 TF_VAR_db_password : ${{ secrets.TF_VAR_DB_PASSWORD }}
6583 run : terraform plan -input=false -no-color -out=tfplan 2>&1 | tee plan.txt
6684 continue-on-error : true # we post the plan even if it fails
6785
6886 - name : Post plan as PR comment
87+ if : steps.aws_role.outputs.configured == 'true'
6988 uses : actions/github-script@v7
7089 with :
7190 script : |
@@ -80,14 +99,14 @@ jobs:
8099 });
81100
82101 - name : Fail if plan errored
83- if : steps.plan.outcome == 'failure'
102+ if : steps.aws_role.outputs.configured == 'true' && steps. plan.outcome == 'failure'
84103 run : exit 1
85104
86105 # ── Apply — runs only on push to master (after PR merged) ──────────────────
87106 apply :
88107 name : Terraform Apply (dev)
89108 runs-on : ubuntu-latest
90- if : ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && env.AWS_TF_ROLE_ARN != '' }}
109+ if : ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
91110 environment : dev # requires manual approval in GitHub Environments
92111 defaults :
93112 run :
@@ -100,21 +119,38 @@ jobs:
100119 steps :
101120 - uses : actions/checkout@v4
102121
122+ - name : Check Terraform AWS role
123+ id : aws_role
124+ run : |
125+ if [ -n "${{ secrets.AWS_TF_ROLE_ARN }}" ]; then
126+ echo "configured=true" >> "$GITHUB_OUTPUT"
127+ else
128+ echo "configured=false" >> "$GITHUB_OUTPUT"
129+ fi
130+
131+ - name : Skip when Terraform AWS role is not configured
132+ if : steps.aws_role.outputs.configured != 'true'
133+ run : echo "Skipping Terraform apply because AWS_TF_ROLE_ARN is not configured."
134+
103135 - name : Configure AWS credentials (OIDC)
136+ if : steps.aws_role.outputs.configured == 'true'
104137 uses : aws-actions/configure-aws-credentials@v4
105138 with :
106- role-to-assume : ${{ env .AWS_TF_ROLE_ARN }}
139+ role-to-assume : ${{ secrets .AWS_TF_ROLE_ARN }}
107140 aws-region : ${{ env.AWS_REGION }}
108141
109142 - name : Set up Terraform
143+ if : steps.aws_role.outputs.configured == 'true'
110144 uses : hashicorp/setup-terraform@v3
111145 with :
112146 terraform_version : ${{ env.TF_VERSION }}
113147
114148 - name : Terraform Init
149+ if : steps.aws_role.outputs.configured == 'true'
115150 run : terraform init -input=false
116151
117152 - name : Terraform Apply
153+ if : steps.aws_role.outputs.configured == 'true'
118154 env :
119155 TF_VAR_db_password : ${{ secrets.TF_VAR_DB_PASSWORD }}
120156 run : terraform apply -input=false -auto-approve
0 commit comments