From 32673bedea1b708d324e1b0da231b599df698ebc Mon Sep 17 00:00:00 2001 From: jspijker Date: Mon, 21 Nov 2022 13:23:04 +0100 Subject: [PATCH] Add PR review workflows Using the pull-request-comments-from-clang-tidy-reports GH action https://github.com/marketplace/actions/pull-request-comments-from-clang-tidy-reports Which is possible because the printer-linter auto puts the suggested fixes in the same format as clang-tidy. It consists of two workflows, to ensure safe handling of forks PR's. The first workflows is the analysis and the suggested fixes, these are then upload to the second workflow which will use the suggested fixes to past comments on the PR --- .../workflows/printer-linter-pr-diagnose.yml | 59 ++++++++++++++ .github/workflows/printer-linter-pr-post.yml | 80 +++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 .github/workflows/printer-linter-pr-diagnose.yml create mode 100644 .github/workflows/printer-linter-pr-post.yml diff --git a/.github/workflows/printer-linter-pr-diagnose.yml b/.github/workflows/printer-linter-pr-diagnose.yml new file mode 100644 index 0000000000..b218ebe623 --- /dev/null +++ b/.github/workflows/printer-linter-pr-diagnose.yml @@ -0,0 +1,59 @@ +name: printer-linter-pr-diagnose + +on: + pull_request: + path: + - 'resources/**' + +jobs: + printer-linter-diagnose: + name: Printer linter PR diagnose + + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: 3.11.x + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-printer-linter.txt + + - uses: technote-space/get-diff-action@v6 + with: + PATTERNS: | + resources/+(extruders|definitions)/*.def.json + resources/+(intent|quality|variants)/**/*.inst.cfg + + - name: Install Python requirements for runner + if: env.GIT_DIFF && !env.MATCHED_FILES + run: pip install -r .github/workflows/requirements-printer-linter.txt + + - name: Create results directory + run: mkdir printer-linter-result + + - name: Diagnose file(s) + if: env.GIT_DIFF && !env.MATCHED_FILES + run: python printer-linter/src/terminal.py --diagnose --report printer-linter-result/fixes.yml ${{ env.GIT_DIFF_FILTERED }} + + - name: Save PR metadata + run: | + echo ${{ github.event.number }} > printer-linter-result/pr-id.txt + echo ${{ github.event.pull_request.head.repo.full_name }} > printer-linter-result/pr-head-repo.txt + echo ${{ github.event.pull_request.head.ref }} > printer-linter-result/pr-head-ref.txt + + - uses: actions/upload-artifact@v2 + with: + name: printer-linter-result + path: printer-linter-result/ + + - name: Run clang-tidy-pr-comments action + uses: platisd/clang-tidy-pr-comments@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + clang_tidy_fixes: result.yml + request_changes: true diff --git a/.github/workflows/printer-linter-pr-post.yml b/.github/workflows/printer-linter-pr-post.yml new file mode 100644 index 0000000000..f47e22c5c5 --- /dev/null +++ b/.github/workflows/printer-linter-pr-post.yml @@ -0,0 +1,80 @@ +name: printer-linter-pr-post + +on: + workflow_run: + workflows: [ "printer-linter-pr-diagnose" ] + types: [ completed ] + +jobs: + clang-tidy-results: + # Trigger the job only if the previous (insecure) workflow completed successfully + if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + steps: + - name: Download analysis results + uses: actions/github-script@v3.1.0 + with: + script: | + let artifacts = await github.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: ${{github.event.workflow_run.id }}, + }); + let matchArtifact = artifacts.data.artifacts.filter((artifact) => { + return artifact.name == "printer-linter-result" + })[0]; + let download = await github.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: "zip", + }); + let fs = require("fs"); + fs.writeFileSync("${{github.workspace}}/printer-linter-result.zip", Buffer.from(download.data)); + + - name: Set environment variables + run: | + mkdir printer-linter-result + unzip printer-linter-result.zip -d printer-linter-result + echo "pr_id=$(cat printer-linter-result/pr-id.txt)" >> $GITHUB_ENV + echo "pr_head_repo=$(cat printer-linter-result/pr-head-repo.txt)" >> $GITHUB_ENV + echo "pr_head_ref=$(cat printer-linter-result/pr-head-ref.txt)" >> $GITHUB_ENV + + - uses: actions/checkout@v2 + with: + repository: ${{ env.pr_head_repo }} + ref: ${{ env.pr_head_ref }} + persist-credentials: false + + - name: Redownload analysis results + uses: actions/github-script@v3.1.0 + with: + script: | + let artifacts = await github.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: ${{github.event.workflow_run.id }}, + }); + let matchArtifact = artifacts.data.artifacts.filter((artifact) => { + return artifact.name == "printer-linter-result" + })[0]; + let download = await github.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: "zip", + }); + let fs = require("fs"); + fs.writeFileSync("${{github.workspace}}/printer-linter-result.zip", Buffer.from(download.data)); + + - name: Extract analysis results + run: | + mkdir printer-linter-result + unzip printer-linter-result.zip -d printer-linter-result + + - name: Run clang-tidy-pr-comments action + uses: platisd/clang-tidy-pr-comments@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + clang_tidy_fixes: printer-linter-result/fixes.yml + pull_request_id: ${{ env.pr_id }}