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

github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/texera.git


The following commit(s) were added to refs/heads/main by this push:
     new 931b0d4816 fix: Revert "ci: discover staged Codecov flags instead of a 
hardcoded matrix" (#6837)
931b0d4816 is described below

commit 931b0d481655738a333f7aca2078fa412aa22026
Author: Xinyuan Lin <[email protected]>
AuthorDate: Thu Jul 23 13:59:03 2026 -0700

    fix: Revert "ci: discover staged Codecov flags instead of a hardcoded 
matrix" (#6837)
    
    ### What changes were proposed in this PR?
    
    Reverts #6824 ("ci: discover staged Codecov flags instead of a hardcoded
    matrix").
    
    That change was part of the deferred `workflow_run` Codecov upload,
    which regressed coverage reporting: every PR began showing its **own**
    flag as `Carriedforward` instead of a fresh delta, because moving the
    upload out of the Required Checks run lets Codecov build the PR comment
    from carryforward before the deferred upload lands (full analysis in
    #6839). This revert is the first step of backing the deferred approach
    out.
    
    ### Any related issues, documentation, discussions?
    
    Related to #6839. This reverts #6824 only; #6730 — which introduced the
    deferred upload and removed the inline `codecov-action` steps — also
    needs reverting to fully restore fresh coverage and resolve #6839.
    
    ### How was this PR tested?
    
    Revert of a CI-only workflow change; no product code is affected, and
    `workflow_run` workflows do not run on a PR in any case. The workflow
    YAML is covered by the existing CI lint. End-to-end recovery is verified
    once the inline uploads are restored (via the #6730 revert) and a PR
    again shows a fresh, non-carryforward flag.
    
    ### Was this PR authored or co-authored using generative AI tooling?
    
    Generated-by: Claude Code (Opus 4.8 [1M context])
---
 .github/workflows/build.yml          |   5 +-
 .github/workflows/codecov-upload.yml | 148 +++++++++++++++--------------------
 2 files changed, 68 insertions(+), 85 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5084638c0e..34eeff6ae3 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -787,8 +787,9 @@ jobs:
           CC_BRANCH: ${{ github.event.pull_request.head.ref || github.ref_name 
}}
         run: bash .github/scripts/stage-codecov.sh
       - name: Upload ${{ matrix.service }} Codecov artifact
-        # codecov-upload.yml discovers codecov-* artifacts dynamically, so a 
new
-        # platform service here is picked up automatically — no matrix row to 
sync.
+        # Adding a service to the matrix above also needs a matching
+        # { flag: <service>, coverage: true } row in codecov-upload.yml, or 
this
+        # artifact is downloaded by nothing and the service's coverage is 
dropped.
         if: inputs.backport_target_branch == '' && !cancelled()
         uses: actions/upload-artifact@v4
         with:
diff --git a/.github/workflows/codecov-upload.yml 
b/.github/workflows/codecov-upload.yml
index fbe442cd38..b43e22906e 100644
--- a/.github/workflows/codecov-upload.yml
+++ b/.github/workflows/codecov-upload.yml
@@ -27,20 +27,17 @@
 #
 # Each build job stages its reports as a `codecov-<flag>` artifact with a 
uniform
 # layout — coverage/ (coverage reports) and results/ (JUnit XMLs) plus 
pr-number /
-# commit-sha / branch identifier files. The `discover` job lists which 
codecov-*
-# artifacts the source run ACTUALLY produced (a label-gated PR only builds 
some of
-# them) and drives the upload matrix from that, so we never chase a flag that 
wasn't
-# built — that avoids the spurious "artifact not found" errors and lets the 
download
-# fail loudly for a flag that should be there. Each flag re-uploads with 
`directory:`
-# scoping so Codecov's search is confined to that flag's files (this is what 
lets the
-# amber flag's ~8 same-basename module jacoco.xml reports upload without a 
fragile
-# explicit file list). Codecov requires one upload per flag (flags in a single 
upload
-# apply to all its files, and carryforward needs the flag at upload time), so 
the
-# flags cannot be collapsed into fewer calls — the win is the token, not fewer 
uploads.
+# commit-sha / branch identifier files. The matrix below re-uploads each flag 
with
+# `directory:` scoping so Codecov's search is confined to that flag's files 
(this is
+# what lets the amber flag's ~8 same-basename module jacoco.xml reports upload 
without
+# a fragile explicit file list). Codecov requires one upload per flag (flags 
in a
+# single upload apply to all its files, and carryforward needs the flag at 
upload
+# time), so the flags cannot be collapsed into fewer calls — the win here is 
the
+# token, not fewer uploads.
 #
 # NOTE: `workflow_run` only fires from the copy of this file on the default 
branch, so
-# a change here has NO effect until merged to main. After merge, exercise it 
manually
-# via the workflow_dispatch entry below, passing a finished "Required Checks" 
run id.
+# this has NO effect until merged to main. After merge, exercise it manually 
via the
+# workflow_dispatch entry below, passing a finished "Required Checks" run id.
 
 name: Codecov Upload
 
@@ -58,80 +55,66 @@ on:
 
 permissions:
   contents: read
-  actions: read # list + download artifacts from the source run
+  actions: read # download-artifact needs this to read artifacts from another 
run
 
 jobs:
-  discover:
-    # Which codecov-<flag> artifacts did the source run actually build? A 
label-gated
-    # PR only stages some of them, so we list what exists and upload exactly 
those —
-    # rather than a hardcoded flag set that throws "artifact not found" for 
the rest.
-    # Skip only a cancelled/skipped upstream; still run on failure so partial 
coverage
-    # is reported (mirrors the build's always()/!cancelled() staging).
+  upload:
+    # Skip only a cancelled/skipped upstream; still run on failure so partial
+    # coverage is reported (mirrors the build's always()/!cancelled() staging).
     if: >-
       github.event_name == 'workflow_dispatch' ||
       (github.event.workflow_run.conclusion != 'cancelled' &&
        github.event.workflow_run.conclusion != 'skipped')
     runs-on: ubuntu-latest
-    outputs:
-      flags: ${{ steps.list.outputs.flags }}
-    steps:
-      - name: List codecov-* artifacts in the source run
-        id: list
-        uses: actions/github-script@v9
-        env:
-          # Passed via env (not interpolated into the script body) so a
-          # workflow_dispatch-supplied run_id can't inject into the JS.
-          SOURCE_RUN_ID: ${{ github.event.workflow_run.id || inputs.run_id }}
-        with:
-          script: |
-            const runId = Number(process.env.SOURCE_RUN_ID);
-            if (!Number.isInteger(runId) || runId <= 0) {
-              core.setFailed(`Invalid source run id: 
'${process.env.SOURCE_RUN_ID}' (expected a positive integer)`);
-              return;
-            }
-            const arts = await 
github.paginate(github.rest.actions.listWorkflowRunArtifacts, {
-              owner: context.repo.owner, repo: context.repo.repo, run_id: 
runId, per_page: 100,
-            });
-            const flags = [...new Set(
-              arts.map(a => a.name)
-                  .filter(n => n.startsWith('codecov-'))
-                  .map(n => n.slice('codecov-'.length))
-            )].sort();
-            core.info(`Source run ${runId} staged codecov flags: 
${flags.join(', ') || '(none)'}`);
-            core.setOutput('flags', JSON.stringify(flags));
-
-  upload:
-    needs: discover
-    # Nothing to do when the source produced no codecov-* artifacts (also 
avoids an
-    # empty matrix, which is an error).
-    if: ${{ needs.discover.outputs.flags != '' && needs.discover.outputs.flags 
!= '[]' }}
-    runs-on: ubuntu-latest
-    # Job-level so the group can key on matrix.flag: one upload pass per 
source run +
-    # flag, and a re-run of the source supersedes the previous attempt.
+    # Job-level so the group can key on matrix.flag: one upload pass per source
+    # run + flag, and a re-run of the source supersedes the previous attempt.
     concurrency:
       group: codecov-upload-${{ github.event.workflow_run.id || inputs.run_id 
}}-${{ matrix.flag }}
       cancel-in-progress: false
     strategy:
       fail-fast: false
       matrix:
-        # `|| '[]'` guards matrix evaluation if the output is ever an empty 
string
-        # (discover skipped/failed); the job `if` above still skips the empty 
case.
-        flag: ${{ fromJSON(needs.discover.outputs.flags || '[]') }}
+        # flag = artifact suffix (codecov-<flag>); coverage=false for the
+        # test-results-only flag (amber-integration has no coverage report).
+        #
+        # KEEP IN SYNC with the coverage-producing jobs in build.yml: one row 
per
+        # codecov-<flag> artifact staged there — frontend, amber, 
amber-integration,
+        # pyamber, agent-service, and every service in build.yml's `platform` 
matrix.
+        # A flag staged in build.yml but missing here is downloaded by nothing 
and
+        # its coverage is silently dropped (the reverse — a row here with no 
artifact
+        # — is safe: the download continue-on-errors and the leg skips).
+        include:
+          - { flag: frontend, coverage: true }
+          - { flag: amber, coverage: true }
+          - { flag: amber-integration, coverage: false }
+          - { flag: pyamber, coverage: true }
+          - { flag: agent-service, coverage: true }
+          - { flag: config-service, coverage: true }
+          - { flag: access-control-service, coverage: true }
+          - { flag: file-service, coverage: true }
+          - { flag: computing-unit-managing-service, coverage: true }
+          - { flag: workflow-compiling-service, coverage: true }
+          - { flag: notebook-migration-service, coverage: true }
     steps:
-      - name: Download staged coverage for ${{ matrix.flag }}
-        # No continue-on-error: discover confirmed this artifact exists, so a 
download
-        # failure here is a real problem that must fail the leg and trip 
notify-failure
-        # (the old design swallowed the failure and went green with no signal).
-        # Layout: stage-codecov.sh roots the artifact at cc/ (coverage/, 
results/, and
-        # the pr-number/commit-sha/branch txt files), so downloading to path: 
cc
-        # restores cc/coverage/**, cc/results/**, and cc/pr-number.txt.
+      - name: Resolve source run id
+        id: src
+        shell: bash
+        run: echo "run_id=${{ github.event.workflow_run.id || inputs.run_id 
}}" >> "$GITHUB_OUTPUT"
+      - name: Download staged coverage
+        id: dl
+        continue-on-error: true # absent when this flag's job was label-gated 
out
+        # Layout: stage-codecov.sh roots the artifact at cc/ (coverage/, 
results/,
+        # and the pr-number/commit-sha/branch txt files), so downloading to 
path: cc
+        # restores cc/coverage/**, cc/results/**, and cc/pr-number.txt — the 
paths
+        # the steps below reference. Keep that rooting if the staging script 
changes.
         uses: actions/download-artifact@v4
         with:
           name: codecov-${{ matrix.flag }}
           path: cc
-          run-id: ${{ github.event.workflow_run.id || inputs.run_id }}
+          run-id: ${{ steps.src.outputs.run_id }}
           github-token: ${{ github.token }}
       - name: Read coverage metadata
+        if: steps.dl.outcome == 'success'
         id: meta
         shell: bash
         # Artifact content comes from a (possibly fork) PR build, so sanitize 
each
@@ -141,10 +124,12 @@ jobs:
           echo "sha=$(cat cc/commit-sha.txt 2>/dev/null | tr -cd '0-9a-fA-F')" 
>> "$GITHUB_OUTPUT"
           echo "branch=$(cat cc/branch.txt 2>/dev/null | tr -cd 
'[:alnum:]._/:-')" >> "$GITHUB_OUTPUT"
       - name: Upload ${{ matrix.flag }} coverage to Codecov
-        # Every flag has coverage except the results-only amber-integration; 
hashFiles
-        # skips it there (its artifact has no coverage/ dir). 
fail_ci_if_error: true so
-        # a genuine upload failure fails the leg and trips notify-failure.
-        if: hashFiles('cc/coverage/**') != ''
+        # fail_ci_if_error: true so a genuine upload failure fails this leg and
+        # trips the notify-failure job below (Codecov posts its own comment 
only on
+        # success, so a failed coverage upload would otherwise leave the PR 
with no
+        # report and no signal). A label-gated-absent flag is not a failure — 
the
+        # download continue-on-errors and this step is skipped via the guards 
above.
+        if: steps.dl.outcome == 'success' && matrix.coverage && 
hashFiles('cc/coverage/**') != ''
         uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f 
# v7.0.0
         with:
           token: ${{ secrets.CODECOV_TOKEN }}
@@ -155,7 +140,10 @@ jobs:
           override_branch: ${{ steps.meta.outputs.branch }}
           override_pr: ${{ steps.meta.outputs.pr }}
       - name: Upload ${{ matrix.flag }} test results to Codecov
-        if: hashFiles('cc/results/**') != ''
+        # fail_ci_if_error: true here too (per review) so a test-results 
upload error
+        # also trips notify-failure instead of being silently dropped. Still 
guarded
+        # on hashFiles, so an absent / label-gated flag simply skips.
+        if: steps.dl.outcome == 'success' && hashFiles('cc/results/**') != ''
         uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f 
# v7.0.0
         with:
           token: ${{ secrets.CODECOV_TOKEN }}
@@ -168,11 +156,11 @@ jobs:
           override_pr: ${{ steps.meta.outputs.pr }}
 
   notify-failure:
-    # If discovery or any upload above failed, comment on the PR so a human can
-    # re-dispatch it. Codecov posts its own comment on SUCCESS, so we only 
cover the
-    # failure case (per #6730 review). A delayed / queued upload posts nothing 
— the
-    # absence of a Codecov comment then signals a stuck run.
-    needs: [discover, upload]
+    # If any upload above failed (coverage or test-results), leave a comment 
on the
+    # PR so a human can re-dispatch it. Codecov posts its own comment on 
SUCCESS, so
+    # we only cover the failure case (per #6730 review). A delayed / queued 
upload
+    # posts nothing — the absence of a Codecov comment then signals a stuck 
run.
+    needs: upload
     if: ${{ failure() && github.event_name == 'workflow_run' }}
     runs-on: ubuntu-latest
     permissions:
@@ -181,13 +169,7 @@ jobs:
       pull-requests: write # comment on the PR
     steps:
       - name: Download coverage metadata
-        # Best-effort (opposite of the upload job's download, which fails 
hard): this
-        # only fetches a codecov-* artifact to read the PR number for the 
comment. If
-        # it can't (e.g. the source run produced no artifacts, so the pattern 
matches
-        # nothing and download-artifact errors), continue-on-error lets the 
job fall
-        # through to the `if: pr != ''` guard and skip commenting, rather than
-        # hard-failing notify-failure itself — which isn't a required check, 
so its
-        # failure would be invisible noise rather than a signal.
+        id: dl
         continue-on-error: true
         uses: actions/download-artifact@v4
         with:

Reply via email to