This is an automated email from the ASF dual-hosted git repository.

lewismc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nutch.git


The following commit(s) were added to refs/heads/master by this push:
     new 320d93bf2 NUTCH-3208 GitHub Actions JUnit and Yetus workflows do not 
reliably post PR comments (#963)
320d93bf2 is described below

commit 320d93bf20f5b76b255b1f5bee5e124a2af68862
Author: Lewis John McGibbney <[email protected]>
AuthorDate: Sun Sep 13 04:37:10 2026 -0700

    NUTCH-3208 GitHub Actions JUnit and Yetus workflows do not reliably post PR 
comments (#963)
    
    (yetus): post a sticky report from a workflow_run companion so fork PRs can 
comment. Find the existing comment with gh; generate markdown on pull_request 
only.
---
 .github/workflows/yetus-comment.yml | 110 ++++++++++++++++++++++++++++++++++++
 .github/workflows/yetus.yml         |  34 ++++++-----
 2 files changed, 129 insertions(+), 15 deletions(-)

diff --git a/.github/workflows/yetus-comment.yml 
b/.github/workflows/yetus-comment.yml
new file mode 100644
index 000000000..8bc5d0d13
--- /dev/null
+++ b/.github/workflows/yetus-comment.yml
@@ -0,0 +1,110 @@
+# 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.
+#
+# Companion to yetus.yml. Posts a sticky PR comment using the base-repo
+# GITHUB_TOKEN. Does not check out pull request head.
+
+name: yetus comment
+on:
+  workflow_run:
+    workflows: [Apache Yetus]
+    types: [completed]
+
+concurrency:
+  group: yetus-comment-${{ github.event.workflow_run.pull_requests[0].number 
|| github.event.workflow_run.head_sha }}
+  cancel-in-progress: true
+
+permissions:
+  actions: read
+  issues: write
+  pull-requests: write
+
+jobs:
+  comment:
+    if: >
+      github.event.workflow_run.event == 'pull_request' &&
+      (github.event.workflow_run.conclusion == 'success' ||
+       github.event.workflow_run.conclusion == 'failure')
+    runs-on: ubuntu-latest
+    steps:
+      - name: Download Yetus PR comment artifacts
+        continue-on-error: true
+        uses: dawidd6/action-download-artifact@v24
+        with:
+          name: yetus-pr-comment
+          workflow: yetus.yml
+          run_id: ${{ github.event.workflow_run.id }}
+          path: ./yetus-pr-comment
+      - name: Resolve and validate PR number
+        id: pr
+        run: |
+          set -euo pipefail
+          REPO="${{ github.repository }}"
+          PR_NUMBER=""
+          if [ -f ./yetus-pr-comment/pr-number ]; then
+            PR_NUMBER=$(tr -d '[:space:]' < ./yetus-pr-comment/pr-number)
+          fi
+          if ! [[ "$PR_NUMBER" =~ ^[0-9]+$ ]]; then
+            echo "::notice::No valid pr-number artifact. Skipping comment."
+            echo "has_pr=false" >> "$GITHUB_OUTPUT"
+            echo "number=" >> "$GITHUB_OUTPUT"
+            exit 0
+          fi
+          BASE=$(gh api "repos/${REPO}/pulls/${PR_NUMBER}" --jq 
'.base.repo.full_name // empty')
+          if [ "$BASE" != "$REPO" ]; then
+            echo "::notice::PR ${PR_NUMBER} is not in ${REPO} (base=${BASE}). 
Skipping comment."
+            echo "has_pr=false" >> "$GITHUB_OUTPUT"
+            echo "number=" >> "$GITHUB_OUTPUT"
+            exit 0
+          fi
+          if [ ! -f ./yetus-pr-comment/yetus-report.md ]; then
+            echo "::notice::yetus-report.md missing. Skipping comment."
+            echo "has_pr=false" >> "$GITHUB_OUTPUT"
+            echo "number=" >> "$GITHUB_OUTPUT"
+            exit 0
+          fi
+          echo "number=${PR_NUMBER}" >> "$GITHUB_OUTPUT"
+          echo "has_pr=true" >> "$GITHUB_OUTPUT"
+          echo "Resolved PR number=${PR_NUMBER} repo=${REPO}"
+        env:
+          GH_TOKEN: ${{ github.token }}
+      # peter-evans/find-comment is not on ASF approved_patterns.yml; use gh 
instead.
+      - name: Find sticky Yetus comment
+        if: steps.pr.outputs.has_pr == 'true'
+        id: find
+        run: |
+          set -euo pipefail
+          REPO="${{ github.repository }}"
+          PR_NUMBER="${{ steps.pr.outputs.number }}"
+          COMMENT_ID=""
+          while IFS= read -r line; do
+            COMMENT_ID="$line"
+            break
+          done < <(gh api --paginate 
"repos/${REPO}/issues/${PR_NUMBER}/comments" \
+            --jq '.[] | select(.user.login == "github-actions[bot]" and (.body 
| contains("<!-- nutch-yetus-report -->"))) | .id')
+          echo "comment-id=${COMMENT_ID:-}" >> "$GITHUB_OUTPUT"
+          echo "Found sticky comment id='${COMMENT_ID:-}'"
+        env:
+          GH_TOKEN: ${{ github.token }}
+      - name: Upsert sticky Yetus comment
+        if: steps.pr.outputs.has_pr == 'true'
+        uses: 
peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9
+        with:
+          token: ${{ github.token }}
+          repository: ${{ github.repository }}
+          issue-number: ${{ steps.pr.outputs.number }}
+          comment-id: ${{ steps.find.outputs.comment-id }}
+          edit-mode: replace
+          body-path: ./yetus-pr-comment/yetus-report.md
diff --git a/.github/workflows/yetus.yml b/.github/workflows/yetus.yml
index 428b53cd2..73c5b712e 100644
--- a/.github/workflows/yetus.yml
+++ b/.github/workflows/yetus.yml
@@ -17,6 +17,9 @@
 # The action runs inside ghcr.io/apache/yetus:0.15.1 — javahome must be a JDK 
path
 # inside that image (OpenJDK 11 on amd64), not actions/setup-java on the 
runner.
 # See https://yetus.apache.org/documentation/0.15.1/precommit/
+#
+# PR comments are posted by yetus-comment.yml (workflow_run). Fork pull_request
+# jobs cannot write comments with GITHUB_TOKEN; do not use pull_request_target.
 ---
 name: Apache Yetus
 on:
@@ -30,13 +33,9 @@ concurrency:
   group: yetus-${{ github.ref }}
   cancel-in-progress: true
 
-# GITHUB_TOKEN cannot comment on PRs from forks (403). Use a PAT secret
-# (e.g. YETUS_COMMENT_TOKEN) if you need comments on fork PRs.
 permissions:
   contents: read
   statuses: write
-  pull-requests: write
-  issues: write
 
 jobs:
   yetus:
@@ -72,10 +71,10 @@ jobs:
           name: apacheyetuspatchdir
           path: ${{ env.PATCH_DIR }}
       - name: Install pandoc
-        if: github.event_name == 'pull_request'
+        if: always() && github.event_name == 'pull_request'
         run: sudo apt-get update && sudo apt-get install -y pandoc
       - name: Convert HTML report to Markdown
-        if: github.event_name == 'pull_request'
+        if: always() && github.event_name == 'pull_request'
         run: |
           OUT="${{ env.PATCH_DIR }}"
           echo "## Apache Yetus test-patch report" > yetus-report.md
@@ -95,7 +94,7 @@ jobs:
             echo "No Yetus report or brief found." >> yetus-report.md
           fi
       - name: Truncate if over comment limit
-        if: github.event_name == 'pull_request'
+        if: always() && github.event_name == 'pull_request'
         run: |
           MAX=60000
           if [ $(wc -c < yetus-report.md) -gt $MAX ]; then
@@ -105,12 +104,17 @@ jobs:
             echo "_Report truncated (GitHub comment limit). Full HTML in 
apacheyetuspatchdir artifact as report.html._" >> yetus-report-trimmed.md
             mv yetus-report-trimmed.md yetus-report.md
           fi
-      - name: Comment PR with Yetus report
-        if: github.event_name == 'pull_request'
-        uses: 
peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9
-        continue-on-error: true
+      - name: Record PR number and sticky marker
+        if: always() && github.event_name == 'pull_request'
+        run: |
+          echo "" >> yetus-report.md
+          echo "<!-- nutch-yetus-report -->" >> yetus-report.md
+          echo "${{ github.event.pull_request.number }}" > pr-number
+      - name: Upload Yetus PR comment artifacts
+        if: always() && github.event_name == 'pull_request'
+        uses: actions/upload-artifact@v7
         with:
-          token: ${{ secrets.YETUS_COMMENT_TOKEN || secrets.GITHUB_TOKEN }}
-          repository: ${{ github.repository }}
-          issue-number: ${{ github.event.pull_request.number }}
-          body-path: yetus-report.md
+          name: yetus-pr-comment
+          path: |
+            yetus-report.md
+            pr-number

Reply via email to