From e26462961ce5026740c5037a41b14e73dfd331c1 Mon Sep 17 00:00:00 2001 From: Nick DiZazzo Date: Mon, 3 Aug 2026 00:30:14 -0400 Subject: [PATCH 1/2] Record Depot phase metrics --- .github/workflows/package-image-row.yml | 259 ++++++++++++++++++++++++ docs/matrix.md | 25 +++ docs/runner-capacity.md | 60 ++++++ tests/release-workflow.test.ts | 30 +++ 4 files changed, 374 insertions(+) diff --git a/.github/workflows/package-image-row.yml b/.github/workflows/package-image-row.yml index 7e5dbfe..5d51494 100644 --- a/.github/workflows/package-image-row.yml +++ b/.github/workflows/package-image-row.yml @@ -153,6 +153,14 @@ jobs: exit 1 } done + - name: Start Depot native package measurement + id: package_measurement + shell: bash + run: | + set -euo pipefail + context_bytes="$(du -sb . | awk '{ print $1 }')" + echo "context_bytes=$context_bytes" >> "$GITHUB_OUTPUT" + echo "started_at=$(date +%s)" >> "$GITHUB_OUTPUT" - name: Build native package from verified upstream product bundle id: package uses: depot/build-push-action@98e78adca7817480b8185f474a400b451d74e287 # v1 @@ -173,6 +181,84 @@ jobs: outputs: type=local,dest=artifacts/native-package # Preserve a BuildKit attestation when the exporter can provide one. provenance: mode=max + - name: Record Depot native package measurement + if: always() + env: + ARTIFACT_ID: ${{ fromJSON(inputs.row_json).artifact_id }} + ARCH: ${{ fromJSON(inputs.row_json).arch }} + BACKEND: ${{ fromJSON(inputs.row_json).backend }} + BACKEND_VERSION: ${{ fromJSON(inputs.row_json).backend_version }} + CONTEXT_BYTES: ${{ steps.package_measurement.outputs.context_bytes }} + DEPOT_BUILD_ID: ${{ steps.package.outputs.build-id }} + DEPOT_PROJECT_OUTPUT: ${{ steps.package.outputs.project-id }} + DISTRO: ${{ fromJSON(inputs.row_json).distro }} + PLATFORM: ${{ fromJSON(inputs.row_json).platform }} + RUNNER_LABEL: ${{ fromJSON(fromJSON(inputs.row_json).runner_labels) }} + START_AT: ${{ steps.package_measurement.outputs.started_at }} + shell: bash + run: | + set -euo pipefail + end_at="$(date +%s)" + if [[ "$START_AT" =~ ^[0-9]+$ ]]; then + action_seconds_json="$((end_at - START_AT))" + else + action_seconds_json=null + fi + if [[ "$CONTEXT_BYTES" =~ ^[0-9]+$ ]]; then + context_bytes_json="$CONTEXT_BYTES" + else + context_bytes_json=null + fi + project_id="${DEPOT_PROJECT_OUTPUT:-$DEPOT_PROJECT_ID}" + mkdir -p artifacts/depot-build + jq -n \ + --arg artifact_id "$ARTIFACT_ID" \ + --arg phase native-package \ + --arg platform "$PLATFORM" \ + --arg arch "$ARCH" \ + --arg distro "$DISTRO" \ + --arg backend "$BACKEND" \ + --arg backend_version "$BACKEND_VERSION" \ + --arg runner_label "$RUNNER_LABEL" \ + --arg project_id "$project_id" \ + --arg build_id "$DEPOT_BUILD_ID" \ + --argjson action_seconds "$action_seconds_json" \ + --argjson context_bytes_estimate "$context_bytes_json" \ + '{ + schema_version: 1, + artifact_id: $artifact_id, + phase: $phase, + matrix: { + platform: $platform, + arch: $arch, + distro: $distro, + backend: $backend, + backend_version: $backend_version + }, + runner: {label: $runner_label}, + depot: { + project_id: (if $project_id == "" then null else $project_id end), + build_id: (if $build_id == "" then null else $build_id end) + }, + measurements: { + action_seconds: $action_seconds, + context_bytes_estimate: $context_bytes_estimate, + cache_state: "unclassified", + cache_hit_rate: null, + context_upload_seconds: null, + cache_import_seconds: null, + cache_export_seconds: null, + cpu_utilization_percent: null, + cost_usd: null + } + }' > "artifacts/depot-build/${ARTIFACT_ID}-native-package.json" + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + if: always() + with: + name: depot-build-${{ fromJSON(inputs.row_json).artifact_id }}-native-package + path: artifacts/depot-build/${{ fromJSON(inputs.row_json).artifact_id }}-native-package.json + if-no-files-found: error + retention-days: 14 - name: Namespace exact package build provenance env: ARTIFACT_ID: ${{ fromJSON(inputs.row_json).artifact_id }} @@ -313,7 +399,16 @@ jobs: echo "runtime_id=$(jq -r .runtime_id "$provenance")" echo "runtime_sha=$(jq -r .runtime_sha256 "$provenance")" } >> "$GITHUB_OUTPUT" + - name: Start Depot dry-image measurement + id: dry_measurement + shell: bash + run: | + set -euo pipefail + context_bytes="$(du -sb . | awk '{ print $1 }')" + echo "context_bytes=$context_bytes" >> "$GITHUB_OUTPUT" + echo "started_at=$(date +%s)" >> "$GITHUB_OUTPUT" - name: Build the final runtime image once + id: image uses: depot/build-push-action@98e78adca7817480b8185f474a400b451d74e287 # v1 with: project: ${{ env.DEPOT_PROJECT_ID }} @@ -335,6 +430,84 @@ jobs: MESH_LLM_HOST_SHA=${{ steps.product.outputs.host_sha }} MESH_LLM_RUNTIME_ID=${{ steps.product.outputs.runtime_id }} MESH_LLM_RUNTIME_SHA=${{ steps.product.outputs.runtime_sha }} + - name: Record Depot dry-image measurement + if: always() + env: + ARTIFACT_ID: ${{ fromJSON(inputs.row_json).artifact_id }} + ARCH: ${{ fromJSON(inputs.row_json).arch }} + BACKEND: ${{ fromJSON(inputs.row_json).backend }} + BACKEND_VERSION: ${{ fromJSON(inputs.row_json).backend_version }} + CONTEXT_BYTES: ${{ steps.dry_measurement.outputs.context_bytes }} + DEPOT_BUILD_ID: ${{ steps.image.outputs.build-id }} + DEPOT_PROJECT_OUTPUT: ${{ steps.image.outputs.project-id }} + DISTRO: ${{ fromJSON(inputs.row_json).distro }} + PLATFORM: ${{ fromJSON(inputs.row_json).platform }} + RUNNER_LABEL: ${{ fromJSON(fromJSON(inputs.row_json).runner_labels) }} + START_AT: ${{ steps.dry_measurement.outputs.started_at }} + shell: bash + run: | + set -euo pipefail + end_at="$(date +%s)" + if [[ "$START_AT" =~ ^[0-9]+$ ]]; then + action_seconds_json="$((end_at - START_AT))" + else + action_seconds_json=null + fi + if [[ "$CONTEXT_BYTES" =~ ^[0-9]+$ ]]; then + context_bytes_json="$CONTEXT_BYTES" + else + context_bytes_json=null + fi + project_id="${DEPOT_PROJECT_OUTPUT:-$DEPOT_PROJECT_ID}" + mkdir -p artifacts/depot-build + jq -n \ + --arg artifact_id "$ARTIFACT_ID" \ + --arg phase runtime-image-dry \ + --arg platform "$PLATFORM" \ + --arg arch "$ARCH" \ + --arg distro "$DISTRO" \ + --arg backend "$BACKEND" \ + --arg backend_version "$BACKEND_VERSION" \ + --arg runner_label "$RUNNER_LABEL" \ + --arg project_id "$project_id" \ + --arg build_id "$DEPOT_BUILD_ID" \ + --argjson action_seconds "$action_seconds_json" \ + --argjson context_bytes_estimate "$context_bytes_json" \ + '{ + schema_version: 1, + artifact_id: $artifact_id, + phase: $phase, + matrix: { + platform: $platform, + arch: $arch, + distro: $distro, + backend: $backend, + backend_version: $backend_version + }, + runner: {label: $runner_label}, + depot: { + project_id: (if $project_id == "" then null else $project_id end), + build_id: (if $build_id == "" then null else $build_id end) + }, + measurements: { + action_seconds: $action_seconds, + context_bytes_estimate: $context_bytes_estimate, + cache_state: "unclassified", + cache_hit_rate: null, + context_upload_seconds: null, + cache_import_seconds: null, + cache_export_seconds: null, + cpu_utilization_percent: null, + cost_usd: null + } + }' > "artifacts/depot-build/${ARTIFACT_ID}-runtime-image-dry.json" + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + if: always() + with: + name: depot-build-${{ fromJSON(inputs.row_json).artifact_id }}-runtime-image-dry + path: artifacts/depot-build/${{ fromJSON(inputs.row_json).artifact_id }}-runtime-image-dry.json + if-no-files-found: error + retention-days: 14 - name: Test the exact locally loaded final image env: IMAGE_REF: mesh-packaging-local:${{ fromJSON(inputs.row_json).artifact_id }} @@ -428,6 +601,14 @@ jobs: echo "runtime_id=$(jq -r .runtime_id "$provenance")" echo "runtime_sha=$(jq -r .runtime_sha256 "$provenance")" } >> "$GITHUB_OUTPUT" + - name: Start Depot staged-image measurement + id: stage_measurement + shell: bash + run: | + set -euo pipefail + context_bytes="$(du -sb . | awk '{ print $1 }')" + echo "context_bytes=$context_bytes" >> "$GITHUB_OUTPUT" + echo "started_at=$(date +%s)" >> "$GITHUB_OUTPUT" - name: Build and push one run-scoped staging image id: stage uses: depot/build-push-action@98e78adca7817480b8185f474a400b451d74e287 # v1 @@ -451,6 +632,84 @@ jobs: MESH_LLM_HOST_SHA=${{ steps.product.outputs.host_sha }} MESH_LLM_RUNTIME_ID=${{ steps.product.outputs.runtime_id }} MESH_LLM_RUNTIME_SHA=${{ steps.product.outputs.runtime_sha }} + - name: Record Depot staged-image measurement + if: always() + env: + ARTIFACT_ID: ${{ fromJSON(inputs.row_json).artifact_id }} + ARCH: ${{ fromJSON(inputs.row_json).arch }} + BACKEND: ${{ fromJSON(inputs.row_json).backend }} + BACKEND_VERSION: ${{ fromJSON(inputs.row_json).backend_version }} + CONTEXT_BYTES: ${{ steps.stage_measurement.outputs.context_bytes }} + DEPOT_BUILD_ID: ${{ steps.stage.outputs.build-id }} + DEPOT_PROJECT_OUTPUT: ${{ steps.stage.outputs.project-id }} + DISTRO: ${{ fromJSON(inputs.row_json).distro }} + PLATFORM: ${{ fromJSON(inputs.row_json).platform }} + RUNNER_LABEL: ${{ fromJSON(fromJSON(inputs.row_json).runner_labels) }} + START_AT: ${{ steps.stage_measurement.outputs.started_at }} + shell: bash + run: | + set -euo pipefail + end_at="$(date +%s)" + if [[ "$START_AT" =~ ^[0-9]+$ ]]; then + action_seconds_json="$((end_at - START_AT))" + else + action_seconds_json=null + fi + if [[ "$CONTEXT_BYTES" =~ ^[0-9]+$ ]]; then + context_bytes_json="$CONTEXT_BYTES" + else + context_bytes_json=null + fi + project_id="${DEPOT_PROJECT_OUTPUT:-$DEPOT_PROJECT_ID}" + mkdir -p artifacts/depot-build + jq -n \ + --arg artifact_id "$ARTIFACT_ID" \ + --arg phase runtime-image-stage \ + --arg platform "$PLATFORM" \ + --arg arch "$ARCH" \ + --arg distro "$DISTRO" \ + --arg backend "$BACKEND" \ + --arg backend_version "$BACKEND_VERSION" \ + --arg runner_label "$RUNNER_LABEL" \ + --arg project_id "$project_id" \ + --arg build_id "$DEPOT_BUILD_ID" \ + --argjson action_seconds "$action_seconds_json" \ + --argjson context_bytes_estimate "$context_bytes_json" \ + '{ + schema_version: 1, + artifact_id: $artifact_id, + phase: $phase, + matrix: { + platform: $platform, + arch: $arch, + distro: $distro, + backend: $backend, + backend_version: $backend_version + }, + runner: {label: $runner_label}, + depot: { + project_id: (if $project_id == "" then null else $project_id end), + build_id: (if $build_id == "" then null else $build_id end) + }, + measurements: { + action_seconds: $action_seconds, + context_bytes_estimate: $context_bytes_estimate, + cache_state: "unclassified", + cache_hit_rate: null, + context_upload_seconds: null, + cache_import_seconds: null, + cache_export_seconds: null, + cpu_utilization_percent: null, + cost_usd: null + } + }' > "artifacts/depot-build/${ARTIFACT_ID}-runtime-image-stage.json" + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + if: always() + with: + name: depot-build-${{ fromJSON(inputs.row_json).artifact_id }}-runtime-image-stage + path: artifacts/depot-build/${{ fromJSON(inputs.row_json).artifact_id }}-runtime-image-stage.json + if-no-files-found: error + retention-days: 14 - name: Pull and test the exact staged digest env: IMAGE_REF: ${{ inputs.image_name }}@${{ steps.stage.outputs.digest }} diff --git a/docs/matrix.md b/docs/matrix.md index f17a7e1..10c8907 100644 --- a/docs/matrix.md +++ b/docs/matrix.md @@ -52,3 +52,28 @@ row; this repository verifies composition once and fans out distro packaging without rebuilding either layer. Before fan-out, the release workflow groups verified upstream provenance by platform/architecture and rejects any group with more than one host SHA-256. + +## Execution and tuning boundary + +The active matrix remains 11 package/image rows backed by 8 unique Linux +products. A package row consumes an immutable upstream archive, creates the +native package, builds exactly one runtime image from that package, and either +loads it for QA or pushes it for staging. No source compilation is introduced +in this repository. `native_selector` remains the exact selector for collecting +comparable rows during a review iteration. + +The release fan-out remains fail-fast disabled and has no speculative +`max-parallel` cap. The packaging evidence available for Depot is one row on +each side of a comparison, with different commits and no cache-state labels; +there is no measured full-matrix completion time or per-architecture/backend +variance from which to change concurrency or allocate native versus assembly +jobs. The runner-images warm-pair experiment is documented in +`docs/runner-capacity.md` and does not transfer its runner-size decision to +this archive assembly matrix. + +All rows continue to use the existing Depot project boundary +(`mzm95zcv7p`). The project is not a per-row cache namespace, but there is no +evidence here of cross-family cache contamination or a cost/hit-rate benefit +from inventing separate identities. The new per-phase Depot records distinguish +native package, dry image, and staged image for later analysis only; they do not +alter selectors, artifact names, provenance, or release promotion behavior. diff --git a/docs/runner-capacity.md b/docs/runner-capacity.md index 9c39980..fd2f632 100644 --- a/docs/runner-capacity.md +++ b/docs/runner-capacity.md @@ -24,3 +24,63 @@ hosted no-device gate. The ROCm row deliberately uses and exhausts a standard hosted runner during extraction. The first complete v0.73.1 static-host dry run finished all 35 jobs in 9m57s; keep it as historical data and record a new product-v2 baseline before setting current budgets. + +## Depot tuning boundary + +This repository assembles and verifies upstream product archives; it is not the +owner of the Depot runner-size experiment. The companion runner-images benchmark +record (`../../mesh-llm-runner-images/docs/CI_BENCHMARKS.md`, not modified here) +contains three matched 20-row warm-cache control/candidate pairs. Depot was +slower on wall time and native runner time in all three pairs: + +| Pair | Wall time | Active time | Native runner time | Build-action time | Candidate cost estimate | +|---|---:|---:|---:|---:|---:| +| 1 | 187s → 246s (+31.6%) | 890s → 1371s (+54.0%) | 863s → 1329s (+54.0%) | 675s → 688s (+1.9%) | $0.7132 | +| 2 | 125s → 141s (+12.8%) | 750s → 1147s (+52.9%) | 724s → 1101s (+52.1%) | 518s → 473s (-8.7%) | $0.5921 | +| 3 | 153s → 165s (+7.8%) | 562s → 1298s (+131.0%) | 534s → 1253s (+134.6%) | 358s → 579s (+61.7%) | $0.6731 | + +The paired logs reported `CACHED` step counts of 414/434, 431/493, and +470/492 (14–32 cached layers per run). Those counts have no stable total-layer +denominator and are not a Depot cache-hit rate, so this record does not infer +one. + +The median effect was +16s (+12.8%) wall time, +481s (+54.0%) active +time, and +466s (+54.0%) native runner time; build-action time was +13s +(+1.9%) with a -45s to +221s pair range. The cost values are observed-runner +arithmetic from that experiment, not Depot invoices. That evidence does not +justify increasing this repository's runner size, adding a matrix concurrency +cap, or splitting the existing Depot project. The trusted runner-images rollout +therefore retains its measured 16-vCPU native and 4-vCPU orchestration choices; +that boundary is not expanded into packaging. + +The only packaging-side comparison available is a one-row observation, not a +cold/warm pair or a full-matrix baseline: + +| Build path | Run | Workflow wall | Native package | Dry image | +|---|---|---:|---:|---:| +| Depot remote BuildKit | [30708002408](https://github.com/Mesh-LLM/mesh-packaging/actions/runs/30708002408) | 148s | 45s | 40s | +| Hosted Buildx control | [30708253831](https://github.com/Mesh-LLM/mesh-packaging/actions/runs/30708253831) | 200s | 76s | 63s | + +Those runs used different commits and one `ubuntu-cpu-amd64` row, so they do +not establish cold versus warm behavior, cache hit rate, context upload time, +cache import/export time, CPU utilization, billed cost, matrix completion time, +or per-architecture/per-backend variance. The hosted control's `.dockerbuild` +artifact also does not supply the missing Depot cache and resource metrics. + +To improve bounded reporting without manufacturing those values, each +`package-image` row now uploads one 14-day `depot-build-*` JSON record for each +Depot phase (native package, dry image, and staged image). Each record carries +the exact artifact/matrix identity, runner label, Depot project/build IDs, +GitHub action-step seconds, and a `du -sb` context-size estimate. Unsupported +fields remain explicit: `cache_state` is `unclassified`, while cache hit rate, +context upload duration, cache import/export duration, CPU utilization, and +cost are `null`. `action_seconds` measures the GitHub action step, not Depot's +server-side build duration. + +The workflow continues to use project `mzm95zcv7p`; no new cache project or +family-specific cache identity is invented without measured contamination, +hit-rate, or cost evidence. The phase labels in the records are measurement +identities only and do not change the archive-first producer contract or cache +scope. Revisit runner size, bake grouping, matrix concurrency, or project +boundaries only after at least three comparable full-matrix runs have +independent cache-state labels, per-row Depot records, and resource/cost data. diff --git a/tests/release-workflow.test.ts b/tests/release-workflow.test.ts index 035a692..952b210 100644 --- a/tests/release-workflow.test.ts +++ b/tests/release-workflow.test.ts @@ -103,6 +103,36 @@ test("pull-through bases are opt-in, trusted, digest-pinned, and short-lived", ( assert.match(stage, /RUNTIME_BASE_IMAGE=\$\{\{ needs\.package\.outputs\.runtime_base_image \}\}/); }); +test("each Depot phase emits bounded tuning evidence without claiming unavailable metrics", () => { + const packageJob = section(row, " package:", " dry-image:"); + const dry = section(row, " dry-image:", " stage-image:"); + const stage = section(row, " stage-image:"); + for (const job of [packageJob, dry, stage]) { + assert.match(job, /Start Depot [^\n]+ measurement/); + assert.match(job, /context_bytes/); + assert.match(job, /action_seconds_json=null/); + assert.match(job, /context_bytes_json=null/); + assert.match(job, /DEPOT_BUILD_ID: \$\{\{ steps\.[a-z_]+\.outputs\.build-id \}\}/); + assert.match(job, /DEPOT_PROJECT_OUTPUT: \$\{\{ steps\.[a-z_]+\.outputs\.project-id \}\}/); + assert.match(job, /cache_state: \"unclassified\"/); + for (const metric of [ + "cache_hit_rate", + "context_upload_seconds", + "cache_import_seconds", + "cache_export_seconds", + "cpu_utilization_percent", + "cost_usd", + ]) { + assert.match(job, new RegExp(`${metric}: null`)); + } + assert.match(job, /actions\/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7/); + assert.match(job, /retention-days: 14/); + } + assert.match(packageJob, /phase native-package/); + assert.match(dry, /phase runtime-image-dry/); + assert.match(stage, /phase runtime-image-stage/); +}); + test("new reusable and image-index actions use immutable commits", () => { const externalActionReferences = [...row.matchAll( /^\s*(?:-\s+)?uses:\s*([^@\s]+)@([^\s#]+)/gm, From a4aa469d7162c26a412eb006de99297130033acb Mon Sep 17 00:00:00 2001 From: Nick DiZazzo Date: Mon, 3 Aug 2026 00:47:21 -0400 Subject: [PATCH 2/2] Address CodeRabbit review findings --- .github/workflows/package-image-row.yml | 18 +++++++++--------- docs/matrix.md | 7 +++++++ tests/release-workflow.test.ts | 4 ++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/.github/workflows/package-image-row.yml b/.github/workflows/package-image-row.yml index 5d51494..c2f5464 100644 --- a/.github/workflows/package-image-row.yml +++ b/.github/workflows/package-image-row.yml @@ -193,7 +193,7 @@ jobs: DEPOT_PROJECT_OUTPUT: ${{ steps.package.outputs.project-id }} DISTRO: ${{ fromJSON(inputs.row_json).distro }} PLATFORM: ${{ fromJSON(inputs.row_json).platform }} - RUNNER_LABEL: ${{ fromJSON(fromJSON(inputs.row_json).runner_labels) }} + RUNNER_LABELS_JSON: ${{ fromJSON(inputs.row_json).runner_labels }} START_AT: ${{ steps.package_measurement.outputs.started_at }} shell: bash run: | @@ -219,7 +219,7 @@ jobs: --arg distro "$DISTRO" \ --arg backend "$BACKEND" \ --arg backend_version "$BACKEND_VERSION" \ - --arg runner_label "$RUNNER_LABEL" \ + --argjson runner_labels "$RUNNER_LABELS_JSON" \ --arg project_id "$project_id" \ --arg build_id "$DEPOT_BUILD_ID" \ --argjson action_seconds "$action_seconds_json" \ @@ -235,7 +235,7 @@ jobs: backend: $backend, backend_version: $backend_version }, - runner: {label: $runner_label}, + runner: {labels: $runner_labels}, depot: { project_id: (if $project_id == "" then null else $project_id end), build_id: (if $build_id == "" then null else $build_id end) @@ -442,7 +442,7 @@ jobs: DEPOT_PROJECT_OUTPUT: ${{ steps.image.outputs.project-id }} DISTRO: ${{ fromJSON(inputs.row_json).distro }} PLATFORM: ${{ fromJSON(inputs.row_json).platform }} - RUNNER_LABEL: ${{ fromJSON(fromJSON(inputs.row_json).runner_labels) }} + RUNNER_LABELS_JSON: ${{ fromJSON(inputs.row_json).runner_labels }} START_AT: ${{ steps.dry_measurement.outputs.started_at }} shell: bash run: | @@ -468,7 +468,7 @@ jobs: --arg distro "$DISTRO" \ --arg backend "$BACKEND" \ --arg backend_version "$BACKEND_VERSION" \ - --arg runner_label "$RUNNER_LABEL" \ + --argjson runner_labels "$RUNNER_LABELS_JSON" \ --arg project_id "$project_id" \ --arg build_id "$DEPOT_BUILD_ID" \ --argjson action_seconds "$action_seconds_json" \ @@ -484,7 +484,7 @@ jobs: backend: $backend, backend_version: $backend_version }, - runner: {label: $runner_label}, + runner: {labels: $runner_labels}, depot: { project_id: (if $project_id == "" then null else $project_id end), build_id: (if $build_id == "" then null else $build_id end) @@ -644,7 +644,7 @@ jobs: DEPOT_PROJECT_OUTPUT: ${{ steps.stage.outputs.project-id }} DISTRO: ${{ fromJSON(inputs.row_json).distro }} PLATFORM: ${{ fromJSON(inputs.row_json).platform }} - RUNNER_LABEL: ${{ fromJSON(fromJSON(inputs.row_json).runner_labels) }} + RUNNER_LABELS_JSON: ${{ fromJSON(inputs.row_json).runner_labels }} START_AT: ${{ steps.stage_measurement.outputs.started_at }} shell: bash run: | @@ -670,7 +670,7 @@ jobs: --arg distro "$DISTRO" \ --arg backend "$BACKEND" \ --arg backend_version "$BACKEND_VERSION" \ - --arg runner_label "$RUNNER_LABEL" \ + --argjson runner_labels "$RUNNER_LABELS_JSON" \ --arg project_id "$project_id" \ --arg build_id "$DEPOT_BUILD_ID" \ --argjson action_seconds "$action_seconds_json" \ @@ -686,7 +686,7 @@ jobs: backend: $backend, backend_version: $backend_version }, - runner: {label: $runner_label}, + runner: {labels: $runner_labels}, depot: { project_id: (if $project_id == "" then null else $project_id end), build_id: (if $build_id == "" then null else $build_id end) diff --git a/docs/matrix.md b/docs/matrix.md index 10c8907..a64f208 100644 --- a/docs/matrix.md +++ b/docs/matrix.md @@ -71,6 +71,13 @@ jobs. The runner-images warm-pair experiment is documented in `docs/runner-capacity.md` and does not transfer its runner-size decision to this archive assembly matrix. +## macOS runtime boundary + +macOS GPU and runtime builds are not part of this Linux container packaging +flow. macOS support uses its native release/archive path and does not consume +these Linux package or image records; this repository does not provide a +macOS GPU qualification lane. + All rows continue to use the existing Depot project boundary (`mzm95zcv7p`). The project is not a per-row cache namespace, but there is no evidence here of cross-family cache contamination or a cost/hit-rate benefit diff --git a/tests/release-workflow.test.ts b/tests/release-workflow.test.ts index 952b210..a65a90b 100644 --- a/tests/release-workflow.test.ts +++ b/tests/release-workflow.test.ts @@ -58,6 +58,10 @@ test("package and image BuildKit work uses the Depot project cache", () => { assert.match(job, new RegExp(pinnedDepotSetupAction.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))); assert.match(job, new RegExp(pinnedDepotBuildPushAction.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))); assert.match(job, /project: \$\{\{ env\.DEPOT_PROJECT_ID \}\}/); + assert.match(job, /RUNNER_LABELS_JSON: \$\{\{ fromJSON\(inputs\.row_json\)\.runner_labels \}\}/); + assert.match(job, /--argjson runner_labels "\$RUNNER_LABELS_JSON"/); + assert.match(job, /runner: \{labels: \$runner_labels\}/); + assert.doesNotMatch(job, /--arg runner_label/); assert.doesNotMatch(job, /docker\/(?:setup-buildx-action|build-push-action)/); } assert.match(packageJob, /id: package[\s\S]*outputs: type=local,dest=artifacts\/native-package/);