| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| name: Comment on PR build results |
| |
| on: |
| workflow_run: |
| workflows: ["Build cmk binaries on PR"] |
| types: |
| - completed |
| |
| permissions: |
| contents: read |
| issues: write |
| pull-requests: write |
| |
| jobs: |
| comment: |
| runs-on: ubuntu-24.04 |
| if: > |
| github.event.workflow_run.event == 'pull_request' |
| steps: |
| - name: Download artifact metadata |
| uses: actions/github-script@v7 |
| id: artifact-metadata |
| with: |
| script: | |
| const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| run_id: context.payload.workflow_run.id, |
| }); |
| |
| const prArtifact = artifacts.data.artifacts.find(a => a.name.startsWith('cmk-binaries.pr')); |
| |
| if (prArtifact) { |
| const prNumber = prArtifact.name.match(/pr(\d+)/)?.[1]; |
| return { |
| artifact_url: prArtifact.archive_download_url, |
| pr_number: prNumber, |
| conclusion: context.payload.workflow_run.conclusion |
| }; |
| } |
| |
| return { |
| pr_number: null, |
| conclusion: context.payload.workflow_run.conclusion |
| }; |
| |
| - name: Get PR number from workflow run |
| id: get-pr |
| uses: actions/github-script@v7 |
| with: |
| script: | |
| const metadata = ${{ steps.artifact-metadata.outputs.result }}; |
| |
| if (metadata.pr_number) { |
| return metadata.pr_number; |
| } |
| |
| // Fallback: get PR from workflow run |
| const pulls = await github.rest.pulls.list({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| state: 'open', |
| head: `${context.repo.owner}:${context.payload.workflow_run.head_branch}` |
| }); |
| |
| if (pulls.data.length > 0) { |
| return pulls.data[0].number; |
| } |
| |
| return null; |
| |
| - name: Comment or update build result on PR |
| uses: actions/github-script@v7 |
| with: |
| script: | |
| const { execSync } = require('child_process'); |
| const prNumber = ${{ steps.get-pr.outputs.result }}; |
| |
| if (!prNumber) { |
| core.warning('Could not determine PR number, skipping comment'); |
| return; |
| } |
| |
| const identifier = "cmk-build-artifact-comment"; |
| const owner = context.repo.owner; |
| const repo = context.repo.repo; |
| const conclusion = '${{ github.event.workflow_run.conclusion }}'; |
| const runId = '${{ github.event.workflow_run.id }}'; |
| const runUrl = `https://github.com/${owner}/${repo}/actions/runs/${runId}`; |
| |
| core.info(`Commenting on PR #${prNumber}`); |
| core.info(`Build conclusion: ${conclusion}`); |
| |
| let body = `<!-- ${identifier} -->\n`; |
| |
| if (conclusion === 'success') { |
| const expiryDate = execSync("date -d '+10 days' '+%B %d, %Y'").toString().trim(); |
| body += `✅ Build complete for PR #${prNumber}.\n\n`; |
| body += `📦 Binary artifacts are available in the [workflow run](${runUrl}) (expires on ${expiryDate}).\n\n`; |
| body += `> **Note:** Download artifacts by clicking on the workflow run link above, then scroll to the "Artifacts" section.`; |
| } else if (conclusion === 'failure') { |
| body += `❌ Build failed for PR #${prNumber}.\n\n`; |
| body += `See the [workflow run](${runUrl}) for details.`; |
| } else { |
| body += `⚠️ Build ${conclusion} for PR #${prNumber}.\n\n`; |
| body += `See the [workflow run](${runUrl}) for details.`; |
| } |
| |
| const { data: comments } = await github.rest.issues.listComments({ |
| owner, |
| repo, |
| issue_number: prNumber |
| }); |
| |
| const existing = comments.find(c => |
| c.user.login === 'github-actions[bot]' && |
| c.body.includes(identifier) |
| ); |
| |
| if (existing) { |
| core.info(`Updating existing comment id ${existing.id}`); |
| await github.rest.issues.updateComment({ |
| owner, |
| repo, |
| comment_id: existing.id, |
| body |
| }); |
| } else { |
| core.info(`Creating new comment`); |
| await github.rest.issues.createComment({ |
| owner, |
| repo, |
| issue_number: prNumber, |
| body |
| }); |
| } |