From 0d0d7c6f5383f5df3e8aebccccbd3a50bddd607b Mon Sep 17 00:00:00 2001 From: Suhong Qin <51539171+sqin2019@users.noreply.github.com> Date: Fri, 21 Jul 2023 12:48:54 -0700 Subject: [PATCH] feat: add tool cleanup pr comments (#77) --- .github/workflows/cleanup.yml | 91 ----------------- .github/workflows/tool_cleanup.yml | 158 +++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 91 deletions(-) delete mode 100644 .github/workflows/cleanup.yml create mode 100644 .github/workflows/tool_cleanup.yml diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml deleted file mode 100644 index d334513..0000000 --- a/.github/workflows/cleanup.yml +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright 2023 The Authors (see AUTHORS file) - -# 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 - -# http://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. - -# Reusable workflow that handles CLI request cleanup. -name: 'aod-cleanup' - -# Support below trigger: -# pull_request: -# types: 'closed' -# paths: 'tool.yaml' -on: - workflow_call: - inputs: - aod_cli_version: - description: 'The version of AOD CLI.' - type: 'string' - default: 'latest' - required: false - go_version: - description: 'The version of Golang.' - type: 'string' - default: '1.20' - required: false - -jobs: - # Check the current status of this pull request with respect to code review. - review_status: - runs-on: 'ubuntu-latest' - permissions: - pull-requests: 'read' - outputs: - REVIEW_DECISION: '${{ steps.get_review_decision.outputs.REVIEW_DECISION }}' - steps: - - id: 'repo_name' - env: - REPO: '${{ github.repository }}' - run: 'echo "REPO_NAME=${REPO##*/}" >> $GITHUB_OUTPUT' - - id: 'get_review_decision' - env: - OWNER: '${{ github.repository_owner }}' - REPO_NAME: '${{ steps.repo_name.outputs.REPO_NAME }}' - PR_NUMBER: '${{ github.event.number }}' - GH_TOKEN: '${{ github.token }}' - run: | - reviewDecision="$(gh api graphql -F owner=$OWNER -F name=$REPO_NAME -F pr_number=$PR_NUMBER -f query=' - query($name: String!, $owner: String!, $pr_number: Int!) { - repository(owner: $owner, name: $name) { - pullRequest(number: $pr_number) { - reviewDecision - } - } - } - ' --jq '.data.repository.pullRequest.reviewDecision')" - - echo REVIEW_DECISION=$reviewDecision >> $GITHUB_OUTPUT - - # Only run Tool request cleanup when the pull request is approved. - cleanup: - needs: 'review_status' - if: '${{ needs.review_status.outputs.REVIEW_DECISION == ''APPROVED'' }}' - runs-on: 'ubuntu-latest' - permissions: - contents: 'read' - id-token: 'write' - name: 'Handle Tool Request Cleanup' - steps: - - name: 'Checkout Triggering Branch' - uses: 'actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab' # ratchet:actions/checkout@v3 - with: - ref: '${{ github.event.pull_request.head.ref }}' - - name: 'Setup Go' - uses: 'actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568' # ratchet:actions/setup-go@v3 - with: - go-version: '${{ inputs.go_version }}' - - name: 'Install AOD CLI' - run: 'go install github.com/abcxyz/access-on-demand/cmd/aod@${{ inputs.aod_cli_version }}' - - name: 'Handle cleanup' - env: - FILE_PATH: '${{ github.workspace }}/tool.yaml' - run: 'aod tool cleanup -path $FILE_PATH' diff --git a/.github/workflows/tool_cleanup.yml b/.github/workflows/tool_cleanup.yml new file mode 100644 index 0000000..69cd2e4 --- /dev/null +++ b/.github/workflows/tool_cleanup.yml @@ -0,0 +1,158 @@ +# Copyright 2023 The Authors (see AUTHORS file) + +# 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 + +# http://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. + +# Reusable workflow that handles tool request cleanup. +name: 'aod-tool-cleanup' + +on: + workflow_call: + inputs: + aod_cli_version: + description: 'The version of AOD CLI.' + type: 'string' + default: 'latest' + required: false + go_version: + description: 'The version of Golang.' + type: 'string' + default: '1.20' + required: false + +env: + TOOL_ERROR_FILENAME: '/tmp/tool_error.txt' + +jobs: + # Check the current status of this pull request with respect to code review. + review_status: + runs-on: 'ubuntu-latest' + permissions: + pull-requests: 'read' + outputs: + REVIEW_DECISION: '${{ steps.get_review_decision.outputs.REVIEW_DECISION }}' + steps: + - id: 'get_review_decision' + env: + # Set the GH_TOKEN environment variable to use GitHub CLI in a GitHub Actions workflow. + # See ref: https://docs.github.com/en/actions/using-workflows/using-github-cli-in-workflows + GH_TOKEN: '${{ github.token }}' + run: | + repo=${{ github.repository }} + reviewDecision="$(gh api graphql -F owner=${{ github.repository_owner }} -F name=${repo##*/} -F pr_number=${{ github.event.pull_request.number }} -f query=' + query($name: String!, $owner: String!, $pr_number: Int!) { + repository(owner: $owner, name: $name) { + pullRequest(number: $pr_number) { + reviewDecision + } + } + } + ' --jq '.data.repository.pullRequest.reviewDecision')" + + echo REVIEW_DECISION=$reviewDecision >> $GITHUB_OUTPUT + + # Only run Tool request cleanup when the pull request is approved. + cleanup: + needs: 'review_status' + if: '${{ needs.review_status.outputs.REVIEW_DECISION == ''APPROVED'' }}' + runs-on: 'ubuntu-latest' + permissions: + contents: 'read' + id-token: 'write' + pull-requests: 'write' + name: 'Handle Tool Request Cleanup' + steps: + - name: 'Checkout Triggering Branch' + uses: 'actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab' # ratchet:actions/checkout@v3 + with: + ref: '${{ github.event.pull_request.head.ref }}' + - name: 'Setup Go' + uses: 'actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568' # ratchet:actions/setup-go@v3 + with: + go-version: '${{ inputs.go_version }}' + - name: 'Install AOD CLI' + run: 'go install github.com/abcxyz/access-on-demand/cmd/aod@${{ inputs.aod_cli_version }}' + - name: 'Handle cleanup' + id: 'cleanup_tool' + env: + FILE_PATH: '${{ github.workspace }}/tool.yaml' + run: | + touch ${{ env.TOOL_ERROR_FILENAME }} + aod tool cleanup -path ${{ env.FILE_PATH }} 2> ${{ env.TOOL_ERROR_FILENAME }} + # TODO (#79): Output only executed commands. + - name: 'Tool Request Cleanup Comment' + if: '${{ always() }}' + uses: 'actions/github-script@98814c53be79b1d30f795b907e553d8679345975' # ratchet:actions/github-script@v6 + with: + github-token: '${{ github.token }}' + retries: '3' + script: |+ + var body, req; + const fs = require("fs"); + const outcome = '${{ steps.cleanup_tool.outcome }}'; + switch (outcome) { + case 'success': + req = fs.readFileSync( + `tool.yaml`, + { encoding: "utf8" } + ); + + body = `**\`Access on Demand\`** - 🟩 **\`Tool\`** request succeeded. + +
+ Details + Executed "cleanup" commands in the request below, or skipped if "cleanup" commands not found. + + \`\`\` + ${req} + \`\`\` +
`; + break; + case 'failure': + req = fs.readFileSync( + `tool.yaml`, + { encoding: "utf8" } + ); + const error = fs.readFileSync( + `${{ env.TOOL_ERROR_FILENAME }}`, + { encoding: "utf8" } + ); + body = `**\`Access on Demand\`** - 🟥 **\`Tool\`** request failed. + +
+ Details + Failed to execute "cleanup" commands in the request below. + + \`\`\` + ${req} + \`\`\` + + Error: + \`\`\` + ${error} + \`\`\` +
`; + break; + // step cancelled/skipped, should not happen if the triggering event is correct. + default: + // Do nothing. + break; + } + + if (typeof body !== "undefined") { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ github.event.pull_request.number }}, + body: body, + }); + }