From 811c19986abf74bf3a964f4592fcb9d302797b24 Mon Sep 17 00:00:00 2001 From: Renato Silva Fagundes Date: Sat, 9 May 2026 23:26:32 -0300 Subject: [PATCH 1/3] ci(vv): aggregate Pages publish into one workflow to avoid concurrency cancellations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each of the five module V&V workflows used to deploy its own HTML reports to gh-pages via a `publish-pages` job. With five workflows triggered in parallel on every push to development/main, three publish jobs were cancelled by GitHub Actions' "1 running + 1 queued" concurrency limit (group `gh-pages-deploy`). Net effect: 2-3 of the five module reports never updated on Pages despite the gates passing. Replace with a single aggregator (`publish-vv-reports.yml`) triggered by `workflow_run` on completion of any of the five V&V workflows. Each invocation polls the GitHub API to check whether all five sibling workflows for the same SHA have completed successfully; if not, exits silently. Whichever invocation runs last performs a single deploy that includes every module's artefacts. With one job per push contending for the concurrency group, no cancellations. Removes the `publish-pages` job from: - vv-can.yml - vv-decision.yml - vv-perception.yml - vv-pid-alert.yml - vv-uds.yml The publish-index.yml workflow is unchanged — it continues to deploy the docs/index.html landing page; this aggregator deploys the per-module subdirectories under it. Both share the `gh-pages-deploy` concurrency group, but with at most 2 contenders (index + reports) instead of 6, neither gets cancelled. Tested locally: all five trimmed workflows pass YAML lint, and the aggregator matches the existing artefact-naming convention (`vv--reports-run`). --- .github/workflows/publish-vv-reports.yml | 151 +++++++++++++++++++++++ .github/workflows/vv-can.yml | 27 ---- .github/workflows/vv-decision.yml | 30 ----- .github/workflows/vv-perception.yml | 35 ------ .github/workflows/vv-pid-alert.yml | 30 ----- .github/workflows/vv-uds.yml | 35 ------ 6 files changed, 151 insertions(+), 157 deletions(-) create mode 100644 .github/workflows/publish-vv-reports.yml diff --git a/.github/workflows/publish-vv-reports.yml b/.github/workflows/publish-vv-reports.yml new file mode 100644 index 0000000..99a4bb6 --- /dev/null +++ b/.github/workflows/publish-vv-reports.yml @@ -0,0 +1,151 @@ +name: Publish V&V reports + +# Aggregator that publishes the per-module HTML reports to GitHub Pages +# in a single deploy after ALL five module V&V workflows have completed +# for the same commit. Prior design ran a publish-pages job inside each +# of the V&V workflows; with five concurrent push triggers, GitHub +# Actions' "1 running + 1 queued in concurrency group" rule cancelled +# 3 of 5 publish jobs, leaving stale reports on Pages. +# +# This workflow listens for completion of any of the five V&V workflows. +# Each invocation checks whether all five sibling workflows have +# completed successfully on the same SHA. The last one to complete +# performs the deploy; earlier invocations exit silently. Net result: +# exactly one Pages deploy per push, with all five module artefacts. +# +# The publish-index.yml workflow continues to deploy the root +# docs/index.html landing page; this aggregator deploys the per-module +# subdirectories under it. + +on: + workflow_run: + workflows: + - "CAN V&V" + - "Decision V&V" + - "Perception V&V" + - "PID + Alert V&V" + - "UDS V&V" + types: [completed] + +permissions: + contents: write + actions: read + +concurrency: + group: gh-pages-deploy + cancel-in-progress: false + +jobs: + publish: + name: Aggregate and publish to gh-pages + runs-on: ubuntu-24.04 + if: | + github.event.workflow_run.conclusion == 'success' && + (github.event.workflow_run.head_branch == 'development' || + github.event.workflow_run.head_branch == 'main') + steps: + - name: Gate — wait until all 5 V&V workflows complete for this SHA + id: gate + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SHA: ${{ github.event.workflow_run.head_sha }} + run: | + set -e + workflows=("CAN V&V" "Decision V&V" "Perception V&V" "PID + Alert V&V" "UDS V&V") + all_done=true + all_success=true + for wf in "${workflows[@]}"; do + row=$(gh run list \ + --workflow "$wf" \ + --commit "$SHA" \ + --limit 1 \ + --json status,conclusion,databaseId \ + --jq '.[0] // {}') + status=$(echo "$row" | jq -r '.status // "unknown"') + concl=$(echo "$row" | jq -r '.conclusion // ""') + id=$(echo "$row" | jq -r '.databaseId // 0') + echo " $wf: status=$status, conclusion=$concl, run=$id" + if [ "$status" != "completed" ]; then + all_done=false + elif [ "$concl" != "success" ]; then + # Completed but not successful — don't deploy, but don't keep waiting either. + all_success=false + fi + done + + if [ "$all_done" != "true" ]; then + echo "Not all sibling workflows have completed yet. Exiting silently." + echo "go=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + if [ "$all_success" != "true" ]; then + echo "All workflows completed but at least one failed. Skipping deploy so reports stay aligned." + echo "go=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "All 5 V&V workflows complete & successful for SHA $SHA — proceeding with deploy." + echo "go=true" >> "$GITHUB_OUTPUT" + + - name: Stage site directory + if: steps.gate.outputs.go == 'true' + run: mkdir -p site + + - name: Download artefacts from each V&V run + if: steps.gate.outputs.go == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SHA: ${{ github.event.workflow_run.head_sha }} + run: | + set -e + # Map: workflow name → site subdirectory + artefact-name prefix + declare -A site_dir=( + ["CAN V&V"]="vv_can" + ["Decision V&V"]="vv_decision" + ["Perception V&V"]="vv_perception" + ["PID + Alert V&V"]="vv_pid_alert" + ["UDS V&V"]="vv_uds" + ) + declare -A art_prefix=( + ["CAN V&V"]="vv-can-reports-run" + ["Decision V&V"]="vv-decision-reports-run" + ["Perception V&V"]="vv-perception-reports-run" + ["PID + Alert V&V"]="vv-pid-alert-reports-run" + ["UDS V&V"]="vv-uds-reports-run" + ) + + for wf in "${!site_dir[@]}"; do + module="${site_dir[$wf]}" + prefix="${art_prefix[$wf]}" + + row=$(gh run list \ + --workflow "$wf" \ + --commit "$SHA" \ + --limit 1 \ + --json databaseId,number \ + --jq '.[0]') + run_id=$(echo "$row" | jq -r '.databaseId') + run_number=$(echo "$row" | jq -r '.number') + + artefact_name="${prefix}${run_number}" + target="site/${module}" + mkdir -p "$target" + + echo "=== $wf (run #$run_number, id=$run_id) → ${target} ===" + if ! gh run download "$run_id" -n "$artefact_name" -D "$target"; then + echo " ! gh run download failed for ${artefact_name}; report missing for this push." + fi + done + + echo "--- Final site/ tree ---" + ls -lR site/ | head -60 + + - name: Deploy aggregated reports to gh-pages + if: steps.gate.outputs.go == 'true' + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site + keep_files: true + user_name: 'github-actions[bot]' + user_email: '41898282+github-actions[bot]@users.noreply.github.com' + commit_message: 'docs(vv): publish all V&V reports for ${{ github.event.workflow_run.head_branch }}@${{ github.event.workflow_run.head_sha }}' diff --git a/.github/workflows/vv-can.yml b/.github/workflows/vv-can.yml index e56f959..9d7b22d 100644 --- a/.github/workflows/vv-can.yml +++ b/.github/workflows/vv-can.yml @@ -190,30 +190,3 @@ jobs: name: vv-can-reports-run${{ github.run_number }} path: reports/vv_can/ retention-days: 30 - - publish-pages: - needs: vv-can - if: github.event_name == 'push' && (github.ref == 'refs/heads/development' || github.ref == 'refs/heads/main') - runs-on: ubuntu-24.04 - permissions: - contents: write - concurrency: - group: gh-pages-deploy - cancel-in-progress: false - steps: - - name: Download reports - uses: actions/download-artifact@v4 - with: - name: vv-can-reports-run${{ github.run_number }} - path: site/ - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./site - destination_dir: vv_can/${{ github.ref_name }} - keep_files: true - user_name: 'github-actions[bot]' - user_email: '41898282+github-actions[bot]@users.noreply.github.com' - commit_message: 'docs(vv-can): publish reports from run #${{ github.run_number }} (${{ github.ref_name }})' \ No newline at end of file diff --git a/.github/workflows/vv-decision.yml b/.github/workflows/vv-decision.yml index 84bc1f7..7f8cef2 100644 --- a/.github/workflows/vv-decision.yml +++ b/.github/workflows/vv-decision.yml @@ -239,33 +239,3 @@ jobs: name: vv-decision-reports-run${{ github.run_number }} path: reports/vv_decision/ retention-days: 30 - - # Per-module workflows publish their own subdirectory under vv_/ - # on gh-pages; keep_files: true preserves the others. - publish-pages: - needs: vv-decision - if: github.event_name == 'push' && (github.ref == 'refs/heads/development' || github.ref == 'refs/heads/main') - runs-on: ubuntu-24.04 - permissions: - contents: write - # Shared group across all gh-pages deploys to avoid non-fast-forward races. - concurrency: - group: gh-pages-deploy - cancel-in-progress: false - steps: - - name: Download reports - uses: actions/download-artifact@v4 - with: - name: vv-decision-reports-run${{ github.run_number }} - path: site/ - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./site - destination_dir: vv_decision/${{ github.ref_name }} - keep_files: true - user_name: 'github-actions[bot]' - user_email: '41898282+github-actions[bot]@users.noreply.github.com' - commit_message: 'docs(vv-decision): publish reports from run #${{ github.run_number }} (${{ github.ref_name }})' diff --git a/.github/workflows/vv-perception.yml b/.github/workflows/vv-perception.yml index 2e11764..3e5c344 100644 --- a/.github/workflows/vv-perception.yml +++ b/.github/workflows/vv-perception.yml @@ -230,38 +230,3 @@ jobs: name: vv-perception-reports-run${{ github.run_number }} path: reports/vv_perception/ retention-days: 30 - - # ─────────────────────────────────────────────────────────────────────── - # Publish HTML reports to GitHub Pages on push to development/main only. - # Each module workflow publishes its own subdirectory under vv_/ - # on the gh-pages branch; keep_files: true preserves the others. - # ─────────────────────────────────────────────────────────────────────── - publish-pages: - needs: vv-perception - if: github.event_name == 'push' && (github.ref == 'refs/heads/development' || github.ref == 'refs/heads/main') - runs-on: ubuntu-24.04 - permissions: - contents: write - # Serialise every gh-pages push across ALL workflows in the repo - # (vv-uds, vv-perception, vv-, publish-index, ...) to avoid - # non-fast-forward races. Shared string, no ref suffix. - concurrency: - group: gh-pages-deploy - cancel-in-progress: false - steps: - - name: Download reports - uses: actions/download-artifact@v4 - with: - name: vv-perception-reports-run${{ github.run_number }} - path: site/ - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./site - destination_dir: vv_perception/${{ github.ref_name }} - keep_files: true - user_name: 'github-actions[bot]' - user_email: '41898282+github-actions[bot]@users.noreply.github.com' - commit_message: 'docs(vv-perception): publish reports from run #${{ github.run_number }} (${{ github.ref_name }})' diff --git a/.github/workflows/vv-pid-alert.yml b/.github/workflows/vv-pid-alert.yml index 5ee790b..3465161 100644 --- a/.github/workflows/vv-pid-alert.yml +++ b/.github/workflows/vv-pid-alert.yml @@ -268,33 +268,3 @@ jobs: name: vv-pid-alert-reports-run${{ github.run_number }} path: reports/vv_pid_alert/ retention-days: 30 - - # Per-module workflows publish their own subdirectory under vv_/ - # on gh-pages; keep_files: true preserves the others. - publish-pages: - needs: vv-pid-alert - if: github.event_name == 'push' && (github.ref == 'refs/heads/development' || github.ref == 'refs/heads/main') - runs-on: ubuntu-24.04 - permissions: - contents: write - # Shared group across all gh-pages deploys to avoid non-fast-forward races. - concurrency: - group: gh-pages-deploy - cancel-in-progress: false - steps: - - name: Download reports - uses: actions/download-artifact@v4 - with: - name: vv-pid-alert-reports-run${{ github.run_number }} - path: site/ - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./site - destination_dir: vv_pid_alert/${{ github.ref_name }} - keep_files: true - user_name: 'github-actions[bot]' - user_email: '41898282+github-actions[bot]@users.noreply.github.com' - commit_message: 'docs(vv-pid-alert): publish reports from run #${{ github.run_number }} (${{ github.ref_name }})' \ No newline at end of file diff --git a/.github/workflows/vv-uds.yml b/.github/workflows/vv-uds.yml index efa2ddd..07983f0 100644 --- a/.github/workflows/vv-uds.yml +++ b/.github/workflows/vv-uds.yml @@ -202,38 +202,3 @@ jobs: name: vv-uds-reports-run${{ github.run_number }} path: reports/vv_uds/ retention-days: 30 - - # ─────────────────────────────────────────────────────────────────────── - # Publish HTML reports to GitHub Pages on push to development/main only. - # Each module workflow publishes its own subdirectory under vv_/ - # on the gh-pages branch; keep_files: true preserves the others. - # ─────────────────────────────────────────────────────────────────────── - publish-pages: - needs: vv-uds - if: github.event_name == 'push' && (github.ref == 'refs/heads/development' || github.ref == 'refs/heads/main') - runs-on: ubuntu-24.04 - permissions: - contents: write - # Serialise every gh-pages push across ALL workflows in the repo - # (vv-uds, vv-, publish-index, ...) to avoid non-fast-forward - # races. Shared string, no ref suffix. - concurrency: - group: gh-pages-deploy - cancel-in-progress: false - steps: - - name: Download reports - uses: actions/download-artifact@v4 - with: - name: vv-uds-reports-run${{ github.run_number }} - path: site/ - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./site - destination_dir: vv_uds/${{ github.ref_name }} - keep_files: true - user_name: 'github-actions[bot]' - user_email: '41898282+github-actions[bot]@users.noreply.github.com' - commit_message: 'docs(vv-uds): publish reports from run #${{ github.run_number }} (${{ github.ref_name }})' From b6b77adeb83305a5bfe5d53b544a253b4488510f Mon Sep 17 00:00:00 2001 From: Renato Silva Fagundes Date: Thu, 14 May 2026 08:05:46 -0300 Subject: [PATCH 2/3] ci(vv): handle partial-trigger pushes and restore branch-namespaced report URLs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses Rian's review of PR #126: 1. Gate deadlock on single-module pushes (HIGH) The aggregator's `paths:` filters mean a commit touching one module's files only triggers that workflow. Previously the gate waited for all 5 workflows to show completed-success for the SHA; the 4 that never ran returned [] from `gh run list`, the gate parsed that as status=unknown, set all_done=false, and exited silently forever — Pages never updated. Now the gate and the download loop treat "no run for this SHA" as "not applicable" and deploy once every triggered workflow has completed successfully. Modules that did not run keep their previous gh-pages content untouched via keep_files: true. 2. URL drift on step-summary browse-links (MEDIUM) The previous per-module publish-pages jobs used destination_dir: vv_//, so the live URL was vv_/development/ (or /main/). The aggregator now restores that namespacing by downloading into site/// — the five step summaries (Browse reports: …/vv_/${ref_name}/) resolve again, and dev/main snapshots stay isolated instead of overwriting each other. 3. Stale header comments (LOW) Refreshed the "Reports are published" blurb in all 5 vv-*.yml files and the matching paragraph in publish-index.yml to point readers at publish-vv-reports.yml as the canonical deployer. 4. Workflow-name sync hazard Added inline comments at the workflow_run trigger list and the bash arrays warning that the five names must stay in lockstep. Validation: - yaml.safe_load passes for all 7 touched workflow files. - Dry-runs of the new gate against `main` SHA 5cf8eba6f4 (the broken release, 3-of-5 publish-pages cancelled) and `development` SHA b89ba86d02 (real partial trigger — Perception did not run) both evaluate to DEPLOY and would publish the live artefacts. --- .github/workflows/publish-index.yml | 8 +-- .github/workflows/publish-vv-reports.yml | 72 ++++++++++++++++-------- .github/workflows/vv-can.yml | 6 +- .github/workflows/vv-decision.yml | 5 +- .github/workflows/vv-perception.yml | 6 +- .github/workflows/vv-pid-alert.yml | 5 +- .github/workflows/vv-uds.yml | 6 +- 7 files changed, 69 insertions(+), 39 deletions(-) diff --git a/.github/workflows/publish-index.yml b/.github/workflows/publish-index.yml index 01fc5d7..19fbcd0 100644 --- a/.github/workflows/publish-index.yml +++ b/.github/workflows/publish-index.yml @@ -1,10 +1,10 @@ name: Publish V&V index page # Deploys docs/index.html to the root of the gh-pages branch whenever it -# changes on development or main. Per-module workflows (vv-uds.yml, -# vv-pid.yml, etc.) deploy their HTML reports to subdirectories of the -# same gh-pages branch using keep_files: true, so this index page sits -# at the root and links into them. +# changes on development or main. The per-module HTML reports are +# published by publish-vv-reports.yml into subdirectories of the same +# gh-pages branch (vv_//), using keep_files: true so +# this index page sits at the root and links into them. on: push: diff --git a/.github/workflows/publish-vv-reports.yml b/.github/workflows/publish-vv-reports.yml index 99a4bb6..5c6991d 100644 --- a/.github/workflows/publish-vv-reports.yml +++ b/.github/workflows/publish-vv-reports.yml @@ -1,24 +1,31 @@ name: Publish V&V reports # Aggregator that publishes the per-module HTML reports to GitHub Pages -# in a single deploy after ALL five module V&V workflows have completed +# in a single deploy after every triggered V&V workflow has completed # for the same commit. Prior design ran a publish-pages job inside each # of the V&V workflows; with five concurrent push triggers, GitHub # Actions' "1 running + 1 queued in concurrency group" rule cancelled # 3 of 5 publish jobs, leaving stale reports on Pages. # -# This workflow listens for completion of any of the five V&V workflows. -# Each invocation checks whether all five sibling workflows have -# completed successfully on the same SHA. The last one to complete -# performs the deploy; earlier invocations exit silently. Net result: -# exactly one Pages deploy per push, with all five module artefacts. +# This workflow listens for completion of any of the five V&V workflows +# and fans them in here. Each V&V workflow has narrow `paths:` filters, +# so a given push may trigger only a subset of them; the gate treats +# workflows that did not run for the SHA as "not applicable" and +# deploys once every workflow that DID run has completed successfully. +# Modules that did not run keep their previous gh-pages content +# untouched via `keep_files: true`. # # The publish-index.yml workflow continues to deploy the root # docs/index.html landing page; this aggregator deploys the per-module -# subdirectories under it. +# subdirectories under it, branch-namespaced as vv_// +# so dev and main snapshots remain isolated. on: workflow_run: + # NOTE: the names below must stay in sync with each vv-*.yml's + # `name:` field, the bash arrays in the steps further down, and + # `art_prefix`. Renaming a workflow without updating all four + # places silently drops that module from the aggregator. workflows: - "CAN V&V" - "Decision V&V" @@ -44,7 +51,7 @@ jobs: (github.event.workflow_run.head_branch == 'development' || github.event.workflow_run.head_branch == 'main') steps: - - name: Gate — wait until all 5 V&V workflows complete for this SHA + - name: Gate — wait until every triggered V&V workflow has completed for this SHA id: gate env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -54,6 +61,7 @@ jobs: workflows=("CAN V&V" "Decision V&V" "Perception V&V" "PID + Alert V&V" "UDS V&V") all_done=true all_success=true + ran_count=0 for wf in "${workflows[@]}"; do row=$(gh run list \ --workflow "$wf" \ @@ -61,43 +69,55 @@ jobs: --limit 1 \ --json status,conclusion,databaseId \ --jq '.[0] // {}') - status=$(echo "$row" | jq -r '.status // "unknown"') - concl=$(echo "$row" | jq -r '.conclusion // ""') - id=$(echo "$row" | jq -r '.databaseId // 0') + status=$(echo "$row" | jq -r '.status // "unknown"') + concl=$( echo "$row" | jq -r '.conclusion // ""') + id=$( echo "$row" | jq -r '.databaseId // 0') + if [ "$id" = "0" ] || [ "$id" = "null" ] || [ -z "$id" ]; then + echo " $wf: no run for this SHA (path filter did not match) — skipping" + continue + fi echo " $wf: status=$status, conclusion=$concl, run=$id" + ran_count=$((ran_count + 1)) if [ "$status" != "completed" ]; then all_done=false elif [ "$concl" != "success" ]; then - # Completed but not successful — don't deploy, but don't keep waiting either. all_success=false fi done + if [ "$ran_count" -eq 0 ]; then + echo "No V&V workflow ran for SHA $SHA. Nothing to publish." + echo "go=false" >> "$GITHUB_OUTPUT" + exit 0 + fi if [ "$all_done" != "true" ]; then - echo "Not all sibling workflows have completed yet. Exiting silently." + echo "Not all triggered V&V workflows have completed yet. Exiting silently." echo "go=false" >> "$GITHUB_OUTPUT" exit 0 fi if [ "$all_success" != "true" ]; then - echo "All workflows completed but at least one failed. Skipping deploy so reports stay aligned." + echo "All triggered workflows completed but at least one failed. Skipping deploy so reports stay aligned." echo "go=false" >> "$GITHUB_OUTPUT" exit 0 fi - echo "All 5 V&V workflows complete & successful for SHA $SHA — proceeding with deploy." + echo "$ran_count triggered V&V workflow(s) complete & successful for SHA $SHA — proceeding with deploy." echo "go=true" >> "$GITHUB_OUTPUT" - name: Stage site directory if: steps.gate.outputs.go == 'true' run: mkdir -p site - - name: Download artefacts from each V&V run + - name: Download artefacts from each triggered V&V run if: steps.gate.outputs.go == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} SHA: ${{ github.event.workflow_run.head_sha }} + BRANCH: ${{ github.event.workflow_run.head_branch }} run: | set -e - # Map: workflow name → site subdirectory + artefact-name prefix + # Map: workflow name → site subdirectory + artefact-name prefix. + # Keep in sync with the `on.workflow_run.workflows` list above + # and each vv-*.yml's `Upload artefacts` step name. declare -A site_dir=( ["CAN V&V"]="vv_can" ["Decision V&V"]="vv_decision" @@ -122,12 +142,20 @@ jobs: --commit "$SHA" \ --limit 1 \ --json databaseId,number \ - --jq '.[0]') - run_id=$(echo "$row" | jq -r '.databaseId') - run_number=$(echo "$row" | jq -r '.number') + --jq '.[0] // {}') + run_id=$(echo "$row" | jq -r '.databaseId // 0') + run_number=$(echo "$row" | jq -r '.number // 0') + + if [ "$run_id" = "0" ] || [ "$run_id" = "null" ] || [ -z "$run_id" ]; then + echo " $wf: no run for this SHA — leaving previous gh-pages content untouched" + continue + fi artefact_name="${prefix}${run_number}" - target="site/${module}" + # Branch-namespaced destination matches the step summary links + # (https://erycaaf.github.io/AEB-stellantis-project/vv_//) + # and keeps `main` and `development` deploys isolated. + target="site/${module}/${BRANCH}" mkdir -p "$target" echo "=== $wf (run #$run_number, id=$run_id) → ${target} ===" @@ -148,4 +176,4 @@ jobs: keep_files: true user_name: 'github-actions[bot]' user_email: '41898282+github-actions[bot]@users.noreply.github.com' - commit_message: 'docs(vv): publish all V&V reports for ${{ github.event.workflow_run.head_branch }}@${{ github.event.workflow_run.head_sha }}' + commit_message: 'docs(vv): publish V&V reports for ${{ github.event.workflow_run.head_branch }}@${{ github.event.workflow_run.head_sha }}' diff --git a/.github/workflows/vv-can.yml b/.github/workflows/vv-can.yml index 9d7b22d..baac3e8 100644 --- a/.github/workflows/vv-can.yml +++ b/.github/workflows/vv-can.yml @@ -8,9 +8,9 @@ name: CAN V&V # # Reports are published in two layers: # 1. Workflow Artifacts on every run (PR or push), retention 30 days. -# 2. GitHub Pages (gh-pages branch) on push to development/main — -# navigable HTML reports under -# https://erycaaf.github.io/AEB-stellantis-project/vv_can//. +# 2. GitHub Pages — published by publish-vv-reports.yml after every +# triggered V&V workflow on the SHA completes successfully. +# Live URL: https://erycaaf.github.io/AEB-stellantis-project/vv_can//. on: pull_request: diff --git a/.github/workflows/vv-decision.yml b/.github/workflows/vv-decision.yml index 7f8cef2..c2dd9f0 100644 --- a/.github/workflows/vv-decision.yml +++ b/.github/workflows/vv-decision.yml @@ -8,8 +8,9 @@ name: Decision V&V # (fix/decision-review-followup) closed all V&V findings; any new # regression is now treated as a CI failure, mirroring vv-uds. # -# Reports are published as workflow artefacts on every run and to -# GitHub Pages on push to development/main under +# Reports are published as workflow artefacts on every run, and to +# GitHub Pages by publish-vv-reports.yml after every triggered V&V +# workflow on the SHA completes successfully. Live URL: # https://erycaaf.github.io/AEB-stellantis-project/vv_decision//. on: diff --git a/.github/workflows/vv-perception.yml b/.github/workflows/vv-perception.yml index 3e5c344..31ae5d0 100644 --- a/.github/workflows/vv-perception.yml +++ b/.github/workflows/vv-perception.yml @@ -12,9 +12,9 @@ name: Perception V&V # # Reports are published in two layers: # 1. Workflow Artifacts on every run (PR or push), retention 30 days. -# 2. GitHub Pages (gh-pages branch) on push to development/main — -# navigable HTML reports under -# https://erycaaf.github.io/AEB-stellantis-project/vv_perception//. +# 2. GitHub Pages — published by publish-vv-reports.yml after every +# triggered V&V workflow on the SHA completes successfully. +# Live URL: https://erycaaf.github.io/AEB-stellantis-project/vv_perception//. on: pull_request: diff --git a/.github/workflows/vv-pid-alert.yml b/.github/workflows/vv-pid-alert.yml index 3465161..d46321a 100644 --- a/.github/workflows/vv-pid-alert.yml +++ b/.github/workflows/vv-pid-alert.yml @@ -6,8 +6,9 @@ name: PID + Alert V&V # bugs are patched on fix/pid-robustness — flip `continue-on-error` # to `false` after that PR lands. # -# Reports are published as workflow artefacts on every run and to -# GitHub Pages on push to development/main under +# Reports are published as workflow artefacts on every run, and to +# GitHub Pages by publish-vv-reports.yml after every triggered V&V +# workflow on the SHA completes successfully. Live URL: # https://erycaaf.github.io/AEB-stellantis-project/vv_pid_alert//. on: diff --git a/.github/workflows/vv-uds.yml b/.github/workflows/vv-uds.yml index 07983f0..dce831e 100644 --- a/.github/workflows/vv-uds.yml +++ b/.github/workflows/vv-uds.yml @@ -11,9 +11,9 @@ name: UDS V&V # # Reports are published in two layers: # 1. Workflow Artifacts on every run (PR or push), retention 30 days. -# 2. GitHub Pages (gh-pages branch) on push to development/main — -# navigable HTML reports under -# https://erycaaf.github.io/AEB-stellantis-project/vv_uds//. +# 2. GitHub Pages — published by publish-vv-reports.yml after every +# triggered V&V workflow on the SHA completes successfully. +# Live URL: https://erycaaf.github.io/AEB-stellantis-project/vv_uds//. on: pull_request: From eb0cd2c48eaca463db0d308ec21e474d6b0e7ea2 Mon Sep 17 00:00:00 2001 From: Renato Silva Fagundes Date: Fri, 15 May 2026 00:04:23 -0300 Subject: [PATCH 3/3] chore(vv): trigger V&V workflows to repopulate gh-pages snapshots The Makefile is in every vv-*.yml `paths:` filter, so this no-op comment bump fires all five V&V workflows on the merge commit. With publish-vv-reports.yml now on development, the aggregator fans them in and produces a single gh-pages deploy commit refreshing vv_/development/ for every module (last refresh was 2026-05-06, before the publish-pages race fix landed). This same commit, carried forward in the upcoming development -> main PR, will trigger the equivalent fan-in on main and finally populate vv_can/main/, vv_decision/main/, and vv_uds/main/ -- which have been 404 since the v2.0.0 release because their publish-pages jobs lost the concurrency race on every push. No build/runtime impact; comment-only change. --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index ddcf05b..41a7dbb 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,8 @@ # Makefile — AEB Stellantis Project (host build) # +# This file is in every vv-*.yml `paths:` filter; bumping a comment +# here re-triggers all five V&V workflows + publish-vv-reports.yml. +# # Targets (build & test): # make build — compile all modules (zero-warning gate) # make test — build and run all unit tests