Add comment workflow
diff --git a/.github/workflows/comment-pr-build.yml b/.github/workflows/comment-pr-build.yml
new file mode 100644
index 0000000..f697574
--- /dev/null
+++ b/.github/workflows/comment-pr-build.yml
@@ -0,0 +1,153 @@
+# 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
+ });
+ }