name: Terraform PR on: pull_request: branches: - dev paths: - "terraform/**" - ".gitea/workflows/terraform-*.yml" env: TF_WORKING_DIR: terraform/prod AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} TF_VAR_proxmox_url: ${{ secrets.PROXMOX_URL }} TF_VAR_proxmox_api_token: ${{ secrets.PROXMOX_API_TOKEN }} TF_VAR_proxmox_ssh_private_key: ${{ secrets.PROXMOX_SSH_PRIVATE_KEY }} TF_VAR_admin_ssh_public_key: ${{ secrets.ADMIN_SSH_PUBLIC_KEY }} TF_VAR_tailscale_auth_key: ${{ secrets.TAILSCALE_AUTH_KEY }} GIT_TOKEN: ${{ secrets.GIT_TOKEN }} jobs: validate: name: Validate runs-on: self-hosted container: image: gitea.arnodo.fr/damien/terraform-ci:latest steps: - name: Checkout run: | git clone --depth 1 --branch "${{ gitea.head_ref }}" https://${GIT_TOKEN}@gitea.arnodo.fr/${{ gitea.repository }}.git . - name: Terraform Format Check id: fmt run: terraform fmt -check -recursive -diff working-directory: ${{ env.TF_WORKING_DIR }} continue-on-error: true - name: TFLint id: lint run: tflint --recursive --format compact working-directory: ${{ env.TF_WORKING_DIR }} continue-on-error: true - name: Terraform Init id: init run: terraform init -input=false working-directory: ${{ env.TF_WORKING_DIR }} - name: Terraform Validate id: validate run: terraform validate -no-color working-directory: ${{ env.TF_WORKING_DIR }} - name: Validation Summary if: always() run: | echo "## Validation Results" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Check | Status |" >> $GITHUB_STEP_SUMMARY echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY echo "| Format | ${{ steps.fmt.outcome == 'success' && '✅' || '❌' }} |" >> $GITHUB_STEP_SUMMARY echo "| TFLint | ${{ steps.lint.outcome == 'success' && '✅' || '⚠️' }} |" >> $GITHUB_STEP_SUMMARY echo "| Init | ${{ steps.init.outcome == 'success' && '✅' || '❌' }} |" >> $GITHUB_STEP_SUMMARY echo "| Validate | ${{ steps.validate.outcome == 'success' && '✅' || '❌' }} |" >> $GITHUB_STEP_SUMMARY - name: Check Validation Status if: steps.fmt.outcome == 'failure' || steps.init.outcome == 'failure' || steps.validate.outcome == 'failure' run: exit 1 plan: name: Plan runs-on: self-hosted container: image: gitea.arnodo.fr/damien/terraform-ci:latest needs: validate steps: - name: Checkout run: | git clone --depth 1 --branch "${{ gitea.head_ref }}" https://${GIT_TOKEN}@gitea.arnodo.fr/${{ gitea.repository }}.git . - name: Terraform Init run: terraform init -input=false working-directory: ${{ env.TF_WORKING_DIR }} - name: Terraform Plan id: plan shell: sh {0} run: | terraform plan -input=false -no-color -detailed-exitcode -out=tfplan > plan_output.txt 2>&1 EXITCODE=$? cat plan_output.txt echo "exitcode=${EXITCODE}" >> $GITHUB_OUTPUT if [ $EXITCODE -eq 1 ]; then exit 1 fi exit 0 working-directory: ${{ env.TF_WORKING_DIR }} - name: Plan Summary if: always() run: | echo "## Terraform Plan" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Exit code:** \`${{ steps.plan.outputs.exitcode }}\`" >> $GITHUB_STEP_SUMMARY echo "- \`0\` = No changes" >> $GITHUB_STEP_SUMMARY echo "- \`2\` = Changes detected" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY cat plan_output.txt >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY working-directory: ${{ env.TF_WORKING_DIR }} - name: Comment PR with Plan if: always() run: | PLAN_OUTPUT=$(cat plan_output.txt | head -c 60000) COMMENT_BODY=$(cat < Click to expand plan output \`\`\`hcl ${PLAN_OUTPUT} \`\`\` EOF ) curl -s -X POST \ -H "Authorization: token ${GIT_TOKEN}" \ -H "Content-Type: application/json" \ -d "$(jq -n --arg body "$COMMENT_BODY" '{body: $body}')" \ "https://gitea.arnodo.fr/api/v1/repos/${{ gitea.repository }}/issues/${{ gitea.event.pull_request.number }}/comments" working-directory: ${{ env.TF_WORKING_DIR }}