From df356871fa52fdc08add78b065e0ecc180bb5cc9 Mon Sep 17 00:00:00 2001 From: Till Frankenbach <81414045+merydian@users.noreply.github.com> Date: Tue, 28 May 2024 05:49:39 -0400 Subject: [PATCH] Print link to test-version zip in PR discussions (#70) --- .github/workflows/build.yml | 13 ++- .github/workflows/build_artifact_comment.yml | 104 +++++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/build_artifact_comment.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4751f0c..74659d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,8 @@ name: Build -on: push +on: + push: + pull_request: jobs: build: @@ -41,7 +43,14 @@ jobs: mkdir tmp unzip felt.${{ env.VERSION }}.zip -d tmp + - name: Save PR number to zips + run: | + cd tmp + echo ${{ github.event.number }} | tee pr_number + echo ${{ github.event.pull_request.head.sha }} | tee git_commit + echo ${{ github.event.number }} + - uses: actions/upload-artifact@v2 with: - name: felt_plugin.${{ env.VERSION }}.${{ env.SHA_SHORT }} + name: felt_plugin.${{ env.VERSION }} path: tmp diff --git a/.github/workflows/build_artifact_comment.yml b/.github/workflows/build_artifact_comment.yml new file mode 100644 index 0000000..b438708 --- /dev/null +++ b/.github/workflows/build_artifact_comment.yml @@ -0,0 +1,104 @@ +name: Write build artifact comments + +on: + workflow_run: + workflows: ["Build"] + types: + - completed + +permissions: + contents: read + +jobs: + on-success: + + permissions: + pull-requests: write + + runs-on: ubuntu-latest + steps: + - name: Get source code + uses: actions/checkout@v4 + with: + # To fetch tags + fetch-depth: 0 + + - name: 'Set plugin version environment variables' + run: | + TAG=$(git describe --tags $(git rev-list --tags --max-count=1)) + echo "VERSION=$(echo ${TAG} | awk -F. -v OFS=. 'NF==1{print ++$NF}; NF>1{if(length($NF+1)>length($NF))$(NF-1)++; $NF=sprintf("%0*d", length($NF), ($NF+1)%(10^length($NF))); print}')-alpha" >> $GITHUB_ENV + echo "SHA_SHORT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV + - name: 'Download artifact' + id: download_artifact + uses: actions/github-script@v7 + with: + script: | + let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => { + return artifact.name == 'felt_plugin.${{ env.VERSION }}' + }); + matchArtifacts.forEach((artifact) => { + }); + if (matchArtifacts.length>0) + { + let download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifacts[0].id, + archive_format: 'zip', + }); + let fs = require('fs'); + fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/felt_plugin.${{ env.VERSION }}.zip`, Buffer.from(download.data)); + core.setOutput('artifact_id', matchArtifacts[0].id); + } + else + { + core.setOutput('artifact_id', 0); + } + + - name: 'Unzip artifact' + if: fromJSON(steps.download_artifact.outputs.artifact_id) > 0 + run: | + unzip -n felt_plugin.${{ env.VERSION }} + + - name: 'Post artifact download link as comment on PR' + if: fromJSON(steps.download_artifact.outputs.artifact_id) > 0 + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + let fs = require('fs'); + let issue_number = Number(fs.readFileSync('./pr_number')); + let git_sha = String(fs.readFileSync('./git_commit')).trim(); + const prComments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue_number, + }); + const PREFIX = "## Plugin ready!"; + let body = PREFIX + "\n\n" + + "A test version of this PR is available for testing [here](https://github.com/" + context.repo.owner + "/" + context.repo.repo + "/suites/" + context.payload.workflow_run.check_suite_id + "/artifacts/${{steps.download_artifact.outputs.artifact_id}})."; + body += "\n\n*(Built from commit " + git_sha + ")*"; + + const winBuildComment = prComments.data?.find(c => c.body.startsWith(PREFIX)); + if (!!winBuildComment) { + // update the existing comment + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: winBuildComment.id, + body: body + }); + } else { + // submit a new comment + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue_number, + body: body + }); + }