blob: f69757430d0a7eb60cf140c928469ad6dde38aa4 [file] [log] [blame]
# 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
});
}