diff options
Diffstat (limited to '.github/workflows/pr_comment.yml')
-rw-r--r-- | .github/workflows/pr_comment.yml | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/.github/workflows/pr_comment.yml b/.github/workflows/pr_comment.yml new file mode 100644 index 0000000000..f0ca9b57a3 --- /dev/null +++ b/.github/workflows/pr_comment.yml @@ -0,0 +1,68 @@ +# This workflow run on the completion of the +# build workflow but only does anything if the +# triggering workflow uploaded an artifact. +# +# Do note that it is then the trigger workflow that +# determines if this will update the PR text body. All +# this workflow does is check if an uploaded artifact +# exists and there is a PR tied to the previous workflow. + +name: Comment on pull request +on: + workflow_run: + workflows: ['Build Paper'] + types: [completed] +jobs: + pr_comment: + if: github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + with: + # This snippet is public-domain, taken from + # https://github.com/oprypin/nightly.link/blob/master/.github/workflows/pr-comment.yml + # Modified extensively by Machine_Maker + script: | + async function updatePR(owner, repo, issue_number, purpose, body) { + const { data } = await github.rest.issues.get({owner, repo, issue_number}); + core.info(JSON.stringify(data, null, 2)); + + const marker = `<!-- bot: ${purpose} -->`; + + let new_body = data.body ? data.body.trim().split(marker)[0] : ""; + if (!new_body.trim()) { + new_body += `${marker}\n${body}` + } else { + new_body += `${marker}\n---\n${body}` + } + + core.info(`Updating the text body of PR #${issue_number} in ${owner}/${repo}`); + await github.rest.issues.update({owner, repo, issue_number, body: new_body}); + } + + const {owner, repo} = context.repo; + const run_id = ${{github.event.workflow_run.id}}; + const repo_id = ${{ github.event.repository.id }}; + + const pull_requests = ${{ toJSON(github.event.workflow_run.pull_requests) }}; + if (!pull_requests.length) { + return core.notice("This workflow doesn't have any pull requests!"); + } + const pull_request = pull_requests.find((pr) => pr.base.repo.id === repo_id); + if (!pull_request) { + return core.notice("This workflow doesn't match any pull request!"); + } + + const artifacts = await github.paginate(github.rest.actions.listWorkflowRunArtifacts, {owner, repo, run_id}); + if (!artifacts.length) { + return core.info("Skipping comment due to no artifact found"); + } + const artifact = artifacts.find((art) => art.name === `paper-${pull_request.number}`); + if (!artifact) { + return core.info("Skipping comment to no matching artifact found"); + } + + const link = `https://nightly.link/${owner}/${repo}/actions/artifacts/${artifact.id}.zip`; + const body = `Download the paperclip jar for this pull request: [${artifact.name}.zip](${link})`; + core.info(`Adding a link to ${link}`); + await updatePR(owner, repo, pull_request.number, "paperclip-pr-build", body); |