mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2026-09-03 05:10:16 +03:00
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 9.0.0 to 10.0.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/setup-uv/releases">astral-sh/setup-uv's releases</a>.</em></p> <blockquote> <h2>v10.0.1 🌈 Tolerate transient manifest timeouts</h2> <h2>Changes</h2> <p>Thank you <a href="https://github.com/arguile"><code>@arguile</code></a>- for making this action more resilient.</p> <h2>🐛 Bug fixes</h2> <ul> <li>Tolerate transient manifest timeouts <a href="https://github.com/arguile"><code>@arguile</code></a>- (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1016">#1016</a>)</li> </ul> <h2>🧰 Maintenance</h2> <ul> <li>chore: update known checksums for 0.12.4 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1017">#1017</a>)</li> </ul> <h2>📚 Documentation</h2> <ul> <li>docs: update version references to v10.0.0 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1014">#1014</a>)</li> </ul> <h2>v10.0.0 🌈 Disable automatic caching for sensitive events and new QOL features</h2> <h2>Changes</h2> <p>Another breaking release, directly after v9.0.0 but we think the added security justifies that.</p> <h3>Extra security by default</h3> <p>If you use the default <code>enable-cache: auto</code> this will now <strong>DISABLE THE CACHE</strong> to protect against cache poisoning for the following events:</p> <ul> <li><code>pull_request_target</code></li> <li><code>workflow_run</code></li> <li><code>release</code></li> </ul> <p>You can read the full reasoning in <a href="https://redirect.github.com/astral-sh/setup-uv/issues/984">astral-sh/setup-uv#984</a></p> <h3><code>version: latest-known</code></h3> <pre lang="yaml"><code>- name: Install the latest version of uv known to setup-uv uses: astral-sh/setup-uv@v10.0.0 with: version: "latest-known" </code></pre> <p>This will now install the latest version with a checksum that is known by this action. The <a href="https://github.com/astral-sh/setup-uv/blob/4f6036f71cec78afb113b323f220c9185d983c12/src/download/checksum/known-checksums.ts">known <code>uv</code> checksums</a> are automatically updated but will take a release of this action to take effect. You won't be always using the latest & greatest but you will have an extra level of security.</p> <h3>Read python version from <code>.tool-versions</code></h3> <pre lang="yaml"><code>- name: Install uv based on the version defined in .tool-versions and also set python uses: astral-sh/setup-uv@v10.0.0 with: version-file: "pyproject.toml" </tr></table> </code></pre> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/setup-uv/commit/20cfd1bf945f4377ade1205e4dbc17946fc9a30d"><code>20cfd1b</code></a> chore: update known checksums for 0.12.4 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1017">#1017</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/d73a0cab66a532d7afa440d9df4a67ea9fe65a30"><code>d73a0ca</code></a> Tolerate transient manifest timeouts (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1016">#1016</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/ae3b92d1bdb308a10adfe7b8f408e5cc8c30f3f6"><code>ae3b92d</code></a> docs: update version references to v10.0.0 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1014">#1014</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/ae62891fec2bb8e7d6c99fc78c9fec3a63790f8d"><code>ae62891</code></a> chore(deps): roll up Dependabot updates (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1013">#1013</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/f9cdb47d487aee2be8925d1e57290177ad9e1ac2"><code>f9cdb47</code></a> Reject paths in .tool-versions (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1007">#1007</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/4f6036f71cec78afb113b323f220c9185d983c12"><code>4f6036f</code></a> Require pull requests for Dependabot rollups (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1005">#1005</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/8d6402c9b71205b2d8d0b82de531d8fed8430182"><code>8d6402c</code></a> chore(deps): roll up Dependabot updates (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1004">#1004</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/46f427bd47c794e99536b75ffaa9f27602425027"><code>46f427b</code></a> Read Python version from .tool-versions (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/996">#996</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/8ed89c51143f65ea13eaba62db51dbb8ea52d0a3"><code>8ed89c5</code></a> ci: pin Alpine container image (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/995">#995</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/8473c7fea42cdfd540f4b01317a17ac5f54126ae"><code>8473c7f</code></a> chore(deps): roll up Dependabot updates (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/994">#994</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/setup-uv/compare/c771a70e6277c0a99b617c7a806ffedaca235ff9...20cfd1bf945f4377ade1205e4dbc17946fc9a30d">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
229 lines
11 KiB
YAML
229 lines
11 KiB
YAML
name: Aggregate backend coverage
|
|
|
|
# Reusable workflow called from build.yml after every backend coverage
|
|
# producer (JUnit, e2e:live, cucumber) has run. Downloads each job's raw
|
|
# .exec, merges them into one JaCoCo report, and posts a combined step
|
|
# summary alongside the per-source ones.
|
|
#
|
|
# Kept separate from the per-source jobs so:
|
|
# - the per-source jobs stay fast and independent (no cross-job waits)
|
|
# - this job can `if: always()` and still produce something useful when
|
|
# one of the producers fails partway through
|
|
# - frontend producers can be added later without touching the
|
|
# producers themselves
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
frontend-validation-result:
|
|
description: Result of the frontend-validation producer job
|
|
required: false
|
|
type: string
|
|
default: skipped
|
|
playwright-e2e-live-result:
|
|
description: Result of the playwright-e2e-live producer job
|
|
required: false
|
|
type: string
|
|
default: skipped
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
aggregate:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Harden Runner
|
|
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
|
with:
|
|
egress-policy: audit
|
|
- name: Checkout repository
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
|
|
- name: Restore cache Gradle User Home
|
|
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
with:
|
|
path: |
|
|
~/.gradle/caches
|
|
~/.gradle/wrapper
|
|
key: gradle-v1-${{ runner.os }}-${{ runner.arch }}-jdk-25-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml', 'buildSrc/**', 'settings.gradle', 'build.gradle', 'app/**/build.gradle', 'gradle/**/*.gradle') }}
|
|
|
|
- name: Set up JDK 25
|
|
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0
|
|
with:
|
|
java-version: "25"
|
|
distribution: "temurin"
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
with:
|
|
enable-cache: true
|
|
cache-dependency-glob: |
|
|
engine/pyproject.toml
|
|
engine/uv.lock
|
|
|
|
# Pattern matches every artifact this PR's producers might upload:
|
|
# jacoco-exec-junit-jdk-25 (uploaded only by the saas
|
|
# leg of backend-build, which
|
|
# is a strict superset of the
|
|
# core + proprietary legs)
|
|
# jacoco-exec-e2e-live
|
|
# jacoco-exec-cucumber
|
|
# Each lands as a sibling dir under coverage-execs/, with the .exec
|
|
# files preserving their original relative paths.
|
|
- name: Download all .exec artifacts
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
pattern: jacoco-exec-*
|
|
path: coverage-execs/
|
|
merge-multiple: false
|
|
continue-on-error: true
|
|
|
|
- name: Inventory .exec files
|
|
id: inventory
|
|
# Splits the downloaded artifacts into two buckets:
|
|
# * e2e-only = cucumber + Playwright live (user-flow coverage)
|
|
# * all = the above plus JUnit (everything we test)
|
|
#
|
|
# Bucketing is by artifact-name prefix: download-artifact preserves
|
|
# the artifact name as the top-level dir, so JUnit's `.exec`s live
|
|
# under coverage-execs/jacoco-exec-junit-*/... while the others
|
|
# are under coverage-execs/jacoco-exec-{e2e-live,cucumber}/...
|
|
#
|
|
# If nothing was uploaded (e.g. all producers crashed before
|
|
# writing) we exit gracefully so this advisory job never fails CI.
|
|
run: |
|
|
mapfile -t all_execs < <(find coverage-execs -name '*.exec' -type f | sort)
|
|
mapfile -t e2e_execs < <(find coverage-execs -name '*.exec' -type f -not -path '*/jacoco-exec-junit-*' | sort)
|
|
if [ "${#all_execs[@]}" -eq 0 ]; then
|
|
echo "::warning::No .exec artifacts found - skipping aggregate report"
|
|
echo "found_all=false" >> "$GITHUB_OUTPUT"
|
|
echo "found_e2e=false" >> "$GITHUB_OUTPUT"
|
|
exit 0
|
|
fi
|
|
printf 'All %d .exec files:\n' "${#all_execs[@]}"
|
|
printf ' %s\n' "${all_execs[@]}"
|
|
IFS=','; all_joined="${all_execs[*]}"
|
|
echo "files_all=$all_joined" >> "$GITHUB_OUTPUT"
|
|
echo "found_all=true" >> "$GITHUB_OUTPUT"
|
|
if [ "${#e2e_execs[@]}" -eq 0 ]; then
|
|
echo "::notice::No e2e/cucumber .exec files - e2e-only report will be skipped"
|
|
echo "found_e2e=false" >> "$GITHUB_OUTPUT"
|
|
else
|
|
printf 'E2E-only %d .exec files:\n' "${#e2e_execs[@]}"
|
|
printf ' %s\n' "${e2e_execs[@]}"
|
|
unset IFS
|
|
IFS=','; e2e_joined="${e2e_execs[*]}"
|
|
echo "files_e2e=$e2e_joined" >> "$GITHUB_OUTPUT"
|
|
echo "found_e2e=true" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
- name: Compile classes for JaCoCo class lookup
|
|
# jacocoReportFromExec only needs the compiled .class files
|
|
# under each subproject's build/classes/java/main/. `classes`
|
|
# (compileJava + processResources) is enough; we skipped the
|
|
# heavier `assemble` to avoid building bootJar / fat jars that
|
|
# add 60+ seconds per run for no gain to the report.
|
|
if: steps.inventory.outputs.found_all == 'true'
|
|
run: ./gradlew classes -PnoSpotless
|
|
|
|
- name: Generate e2e-only JaCoCo report
|
|
# "Real user-flow" coverage: only counts code reached by an actual
|
|
# HTTP request from cucumber or live Playwright. Useful for
|
|
# questions like "how much of our backend does a user actually
|
|
# hit?". Skipped when neither producer uploaded a .exec.
|
|
if: steps.inventory.outputs.found_e2e == 'true'
|
|
run: |
|
|
./gradlew jacocoReportFromExec \
|
|
-PexecFile="${{ steps.inventory.outputs.files_e2e }}" \
|
|
-PreportDir=build/reports/jacoco/aggregate-e2e \
|
|
-PnoSpotless
|
|
|
|
- name: Generate combined JaCoCo report (everything)
|
|
if: steps.inventory.outputs.found_all == 'true'
|
|
run: |
|
|
./gradlew jacocoReportFromExec \
|
|
-PexecFile="${{ steps.inventory.outputs.files_all }}" \
|
|
-PreportDir=build/reports/jacoco/aggregate-all \
|
|
-PnoSpotless
|
|
|
|
- name: E2E-only step summary
|
|
# Rendered first so it gets prime real estate in the Summary
|
|
# tab - this is the number most readers actually want
|
|
# ("how much of the backend do real user flows cover?").
|
|
if: steps.inventory.outputs.found_e2e == 'true'
|
|
run: |
|
|
uv run --project engine --locked --group tools python scripts/coverage-summary.py \
|
|
--title "Real user-flow backend coverage (e2e:live + cucumber)" \
|
|
--jacoco "merged=build/reports/jacoco/aggregate-e2e/jacocoTestReport.xml" \
|
|
--github-step-summary
|
|
|
|
- name: ALL-sources step summary
|
|
# Separate call (not a multi-input one) because the helper's
|
|
# rightmost "Aggregate" column would sum the two reports - which
|
|
# is meaningless when one is a strict superset of the other.
|
|
if: steps.inventory.outputs.found_all == 'true'
|
|
run: |
|
|
uv run --project engine --locked --group tools python scripts/coverage-summary.py \
|
|
--title "Combined backend coverage (JUnit + e2e:live + cucumber)" \
|
|
--jacoco "merged=build/reports/jacoco/aggregate-all/jacocoTestReport.xml" \
|
|
--github-step-summary
|
|
|
|
- name: Upload combined aggregate report
|
|
if: steps.inventory.outputs.found_all == 'true'
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: jacoco-aggregate-all-${{ github.run_id }}
|
|
path: build/reports/jacoco/aggregate-all/
|
|
retention-days: 14
|
|
|
|
- name: Upload e2e-only aggregate report
|
|
if: steps.inventory.outputs.found_e2e == 'true'
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: jacoco-aggregate-e2e-${{ github.run_id }}
|
|
path: build/reports/jacoco/aggregate-e2e/
|
|
retention-days: 14
|
|
|
|
# --------------------------------------------------------------
|
|
# Per-area matrix: rolls backend + frontend coverage into one
|
|
# table indexed by core/proprietary/saas/desktop. Pulls the
|
|
# frontend artifacts now (after the JaCoCo step has done its
|
|
# work) so the per-source backend summaries still render first
|
|
# even if the matrix step fails.
|
|
# --------------------------------------------------------------
|
|
- name: Download vitest coverage artifact
|
|
# frontend-validation uploads as `frontend-coverage`. Tolerate
|
|
# absence on backend-only runs by skipping the download entirely
|
|
# when the producer job was not part of this workflow run.
|
|
if: inputs.frontend-validation-result == 'success'
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: frontend-coverage
|
|
path: matrix-inputs/vitest/
|
|
continue-on-error: true
|
|
|
|
- name: Download Playwright frontend coverage artifact
|
|
# e2e-live uploads the artifact with a stable name. Skip the
|
|
# download entirely when the producer job did not run.
|
|
if: inputs.playwright-e2e-live-result == 'success'
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: playwright-frontend-coverage
|
|
path: matrix-inputs/playwright/
|
|
continue-on-error: true
|
|
|
|
- name: Coverage matrix step summary
|
|
if: always()
|
|
# Matrix references the two aggregate JaCoCo XMLs (already
|
|
# generated above) plus whichever frontend artifacts landed.
|
|
# Every input is optional; missing ones render as "-".
|
|
run: |
|
|
uv run --project engine --locked --group tools python scripts/coverage-matrix.py \
|
|
${{ steps.inventory.outputs.found_all == 'true' && '--jacoco-all build/reports/jacoco/aggregate-all/jacocoTestReport.xml' || '' }} \
|
|
${{ steps.inventory.outputs.found_e2e == 'true' && '--jacoco-e2e build/reports/jacoco/aggregate-e2e/jacocoTestReport.xml' || '' }} \
|
|
--vitest matrix-inputs/vitest/coverage-summary.json \
|
|
--playwright-frontend matrix-inputs/playwright/coverage-pw-summary/coverage-summary.json \
|
|
--title "Coverage matrix (per-area, e2e vs all)" \
|
|
--github-step-summary
|