From 7693a3f7cebd8d585b2cf2241d654f50a3a3ba13 Mon Sep 17 00:00:00 2001 From: Guillaume Fraux Date: Tue, 19 Nov 2024 14:33:22 +0100 Subject: [PATCH] Update code for linking to wheels in PR --- .github/workflows/comment-download.yml | 100 ++++++++++++++++++++++++ .github/workflows/comment-wheels-pr.yml | 62 --------------- .github/workflows/coverage.yml | 2 - 3 files changed, 100 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/comment-download.yml delete mode 100644 .github/workflows/comment-wheels-pr.yml diff --git a/.github/workflows/comment-download.yml b/.github/workflows/comment-download.yml new file mode 100644 index 000000000..d380c847f --- /dev/null +++ b/.github/workflows/comment-download.yml @@ -0,0 +1,100 @@ +name: Comment on pull request +on: + workflow_run: + workflows: ['Build Python wheels'] + types: [completed] + +permissions: + pull-requests: write + +jobs: + pr_comment: + if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v7 + with: + script: | + async function getArtifactLink(artifactName, owner, repo, run_id) { + // get the list of artifacts + 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 == artifactName) { + return `https://nightly.link/${owner}/${repo}/actions/artifacts/${artifact.id}.zip`; + } + } + return core.error(`failed to find ${artifactName} artifact`); + } + let link; + let body_message; + + const {owner, repo} = context.repo; + const run_id = ${{github.event.workflow_run.id}}; + const workflow_name = "${{github.event.workflow_run.name}}"; + + console.info(`${workflow_name} triggered this run`) + + // Find the PR with the right sha, see https://github.com/orgs/community/discussions/25220 + 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 pull_number = items[0].number; + console.info("Pull request number is", pull_number) + + if (workflow_name == 'Documentation') { // currently unused, this is done by readthedocs + link = await getArtifactLink('docs', owner, repo, run_id); + // Add horizontal line for docs only because assuming this is one + // triggered first. The wheels building should take much longer... + body_message = `\n----\n 📚 [Download documentation preview for this pull-request](${link})\n`; + } else { // wheels + link = await getArtifactLink('wheels', owner, repo, run_id); + body_message = `⚙️ [Download Python wheels for this pull-request (you can install these with pip)](${link})\n`; + } + + const MESSAGE_SEPARATOR_START = `\r\n\r\n\r\n`; + const MESSAGE_SEPARATOR_END = `\r\n`; + + const { data: pull } = await github.rest.pulls.get({ + owner: owner, + repo: repo, + pull_number: pull_number, + }); + + let body = ""; + if (pull.body) { + if (pull.body.indexOf(MESSAGE_SEPARATOR_START) === -1) { + // First time updating this description + body = pull.body + MESSAGE_SEPARATOR_START + body_message + MESSAGE_SEPARATOR_END; + } + else { + // we already updated this description before + body = pull.body.slice(0, pull.body.indexOf(MESSAGE_SEPARATOR_START)); + body = body + MESSAGE_SEPARATOR_START + body_message + MESSAGE_SEPARATOR_END; + body = body + pull.body.slice(pull.body.indexOf(MESSAGE_SEPARATOR_END) + MESSAGE_SEPARATOR_END.length); + } + } + else { + // Pull Request description is empty + body = MESSAGE_SEPARATOR_START + body_message + MESSAGE_SEPARATOR_END; + } + + github.rest.pulls.update({ + owner: owner, + repo: repo, + pull_number: pull_number, + body: body, + }); diff --git a/.github/workflows/comment-wheels-pr.yml b/.github/workflows/comment-wheels-pr.yml deleted file mode 100644 index 78f240c70..000000000 --- a/.github/workflows/comment-wheels-pr.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Comment on pull request -on: - workflow_run: - workflows: ['Build Python wheels'] - types: [completed] - -jobs: - pr_comment: - if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v6 - 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 = ``; - 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 pull_requests = ${{ toJSON(github.event.workflow_run.pull_requests) }}; - if (!pull_requests.length) { - return core.error("This workflow doesn't match any pull requests!"); - } - - const artifacts = await github.paginate( - github.rest.actions.listWorkflowRunArtifacts, {owner, repo, run_id} - ); - - if (!artifacts.length) { - return core.error(`No artifacts found`); - } - - if (artifacts.length !== 1) { - return core.error(`more than one artifact found`); - } - const link = `https://nightly.link/${owner}/${repo}/actions/artifacts/${artifacts[0].id}.zip` - - let body = `Here is a pre-built version of the code in this pull request: [wheels.zip](${link}), `; - body += 'you can install it locally by unzipping `wheels.zip` and using `pip` to install the file matching your system'; - - core.info("Review thread message body:", body); - for (const pr of pull_requests) { - await insertUpdateComment(owner, repo, pr.number, "link-to-wheels", body); - } diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index a56be1e71..00634237c 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -56,8 +56,6 @@ jobs: echo "CMAKE_CXX_COMPILER_LAUNCHER=sccache" >> $GITHUB_ENV - name: collect rust and C/C++ coverage - # env: - # FEATOMIC_TEST_WITH_STATIC_LIB: "1" run: | cargo tarpaulin --all-features --workspace --engine=llvm --out=xml --output-dir=target/tarpaulin --objects target/debug/libfeatomic.so # cleanup C/C++ coverage