build/github-tf-shared-pull-request.yaml (104 lines of code) (raw):
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: "tf-pull-request"
on:
pull_request:
branches:
- "shared"
env:
PROJECT_ID: ${{ secrets.PROJECT_ID }}
TF_BACKEND: ${{ secrets.TF_BACKEND }}
TF_VAR_gh_token: ${{ secrets.TF_VAR_gh_token }}
TF_IN_AUTOMATION: "true"
TF_VAR_github_app_infra_token: ${{ secrets.TF_VAR_github_app_infra_token }}
jobs:
run:
runs-on: "ubuntu-latest"
permissions:
contents: "read"
id-token: "write"
issues: "write"
pull-requests: "write"
steps:
- uses: "actions/checkout@v3"
- id: "auth"
uses: "google-github-actions/auth@v1"
with:
token_format: "access_token"
workload_identity_provider: ${{ secrets.WIF_PROVIDER_NAME }}
service_account: ${{ secrets.SERVICE_ACCOUNT_EMAIL }}
- uses: "google-github-actions/setup-gcloud@v1"
with:
install_components: "beta,terraform-tools"
- uses: "hashicorp/setup-terraform@v2"
with:
terraform_version: "1.5.7"
- id: setup
shell: bash
run: |
echo "Adding bucket information to backends"
for i in `find . -name 'backend.tf'`
do
sed -i'' -e "s/UPDATE_ME/${TF_BACKEND}/" $i
sed -i'' -e "s/UPDATE_PROJECTS_BACKEND/${TF_BACKEND}/" $i
done
for i in `find . -name 'remote_bucket.tf'`
do
sed -i'' -e "s/UPDATE_ME/${TF_BACKEND}/" $i
done
- id: init
run: |
${GITHUB_WORKSPACE}/tf-wrapper.sh init shared
- id: plan
run: |
${GITHUB_WORKSPACE}/tf-wrapper.sh plan shared
- id: validate
run: |
${GITHUB_WORKSPACE}/tf-wrapper.sh validate shared "${GITHUB_WORKSPACE}/policy-library" "${PROJECT_ID}" "FILESYSTEM" "GITHUB"
- uses: actions/github-script@v6
if: github.event_name == 'pull_request'
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
})
const botComment = comments.find(comment => {
return comment.user.type === 'Bot' && comment.body.includes('Terraform Initialization')
})
const run_url = process.env.GITHUB_SERVER_URL + '/' + process.env.GITHUB_REPOSITORY + '/actions/runs/' + process.env.GITHUB_RUN_ID
const run_link = '<a href="' + run_url + '">Actions</a>.'
const fs = require('fs')
const plan_dir = 'tmp_plan'
const plan_dir_files = fs.readdirSync('tmp_plan')
const plan_files = plan_dir_files.filter(file => file.match(new RegExp(`.*\.(.txt)$`, 'ig')))
for (const file in plan_files) {
const plan_file_path = plan_dir.concat('/', plan_files[file])
const plan_file = fs.readFileSync(plan_file_path, 'utf8')
const plan = plan_file.length > 65000 ? plan_file.toString().substring(0, 65000) + " ..." : plan_file
const truncated_message = plan_file.length > 65000 ? "Output is too long and was truncated. You can read full Plan in " + run_link + "<br /><br />" : ""
const output = `
#### Terraform Plan Validate All 📖: \`${{ steps.plan-validate-all.outcome }}\`
Plan File: \`${plan_file_path.replace('.txt', '.plan')}\`
<details><summary>Show Plan</summary>
\`\`\`\n
${plan}
\`\`\`
</details>
${truncated_message}
`;
if (botComment) {
github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: output
})
} else {
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})
}
}