Comment docs download on PR #19
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # PR sticky comment with nightly.link to the "documentation" artifact | |
| # (same pattern as atomistic-cookbook comment-docs-download.yml). | |
| name: Comment docs download on PR | |
| on: | |
| workflow_run: | |
| workflows: ["Documentation"] | |
| types: [completed] | |
| jobs: | |
| pr_comment: | |
| if: >- | |
| github.event.workflow_run.event == 'pull_request' && | |
| github.event.workflow_run.conclusion == 'success' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| actions: read | |
| issues: write | |
| pull-requests: write | |
| steps: | |
| - uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| async function insertUpdateComment(owner, repo, issue_number, purpose, body) { | |
| const {data: comments} = await github.rest.issues.listComments( | |
| {owner, repo, issue_number} | |
| ); | |
| const marker = `<!-- bot: ${purpose} -->`; | |
| body = marker + "\n" + body; | |
| const existing = comments.filter((c) => c.body.includes(marker)); | |
| if (existing.length > 0) { | |
| const last = existing[existing.length - 1]; | |
| core.info(`Updating comment ${last.id}`); | |
| await github.rest.issues.updateComment({ | |
| owner, repo, | |
| body, | |
| comment_id: last.id, | |
| }); | |
| } else { | |
| core.info(`Creating a comment in issue / PR #${issue_number}`); | |
| await github.rest.issues.createComment({issue_number, body, owner, repo}); | |
| } | |
| } | |
| const {owner, repo} = context.repo; | |
| const run_id = ${{ github.event.workflow_run.id }}; | |
| const response = await github.rest.search.issuesAndPullRequests({ | |
| q: `repo:${{ github.repository }} is:pr sha:${{ github.event.workflow_run.head_sha }}`, | |
| per_page: 1, | |
| }); | |
| const items = response.data.items; | |
| if (items.length < 1) { | |
| return core.error("No matching pull requests found"); | |
| } | |
| const pullRequestNumber = items[0].number; | |
| core.info(`Pull request number is ${pullRequestNumber}`); | |
| const artifacts = await github.paginate( | |
| github.rest.actions.listWorkflowRunArtifacts, | |
| {owner, repo, run_id} | |
| ); | |
| if (!artifacts.length) { | |
| return core.error("No artifacts found"); | |
| } | |
| for (const artifact of artifacts) { | |
| if (artifact.name === "documentation") { | |
| const link = `https://nightly.link/${owner}/${repo}/actions/artifacts/${artifact.id}.zip`; | |
| let body = `**Documentation preview** for this PR: [documentation.zip](${link}). `; | |
| body += "Unzip and open `index.html` in a browser (Sphinx HTML under the zip root)."; | |
| await insertUpdateComment(owner, repo, pullRequestNumber, "link-to-documentation", body); | |
| return; | |
| } | |
| } | |
| return core.error('failed to find "documentation" artifact'); |