From 77ce1d212dfdf791be19c768931b75ddd3991e09 Mon Sep 17 00:00:00 2001 From: pat-s Date: Fri, 7 Aug 2026 09:41:53 +0000 Subject: [PATCH] fix(ci): gate the Built-stamp repair on its own variable (#151) ## Problem `repair-built-stamp.yaml` gated on `target_arch`: ```yaml when: - event: manual evaluate: 'target_arch == "${ARCH}"' ``` That is the same variable `build-all-versions.yaml` and `build-all-versions-install-deps.yaml` gate on. A manual run passing `target_arch=arm64` to reach the repair therefore matched all three, so triggering a dry-run repair also queued a full arm64 rebuild. I hit this triggering the alpine 3.22 dry run (pipeline 10706), which I killed. `crow pipeline ps` renders empty states on this version, so I could not confirm from the CLI whether the rebuild workflows started before the kill or only sat queued behind the running cron jobs; no output was attributable to them. ## Change Gate on `repair_built_stamp` instead. Every other pipeline here already gates on a variable named after itself (`process_cran_updates`, `weekly_audit_missing`, `weekly_rebuild_missing`), and `target_arch` was the odd one out being shared by two. The header now records the collision and the exact invocation, so the next pipeline added here does not repeat it. ## Verification `crow lint` passes; `prek` clean. Grep of every trigger condition in `.crow/` confirms `repair_built_stamp` is unique and that no other pipeline gates on `OS`, `OS_VERSION`, `R_VERSION` or `dry_run` alone: ``` archive-missed-packages.yaml: task == "archive-missed-packages" build-all-versions.yaml: target_arch == "${ARCH}" build-all-versions-install-deps.yaml: target_arch == "${ARCH}" weekly-audit-missing.yaml: weekly_audit_missing == ... repair-built-stamp.yaml: repair_built_stamp == "${ARCH}" process-updates.yaml: process_cran_updates == ... weekly-rebuild-missing.yaml: weekly_rebuild_missing == ... ``` ## Note for whoever runs it `crow pipeline create` against this instance returned HTTP 504 while still creating the pipeline. Retrying on that error duplicates the run: I created four before noticing. Verify with `pipeline ls` rather than trusting the exit status. Reviewed-on: https://git.devxy.io/devxy/build-cran-binaries/pulls/151 --- .crow/repair-built-stamp.yaml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.crow/repair-built-stamp.yaml b/.crow/repair-built-stamp.yaml index 12e2644..83821e9 100644 --- a/.crow/repair-built-stamp.yaml +++ b/.crow/repair-built-stamp.yaml @@ -9,9 +9,18 @@ # Run with `dry_run: true` first: it reports how many entries are broken per # slot and changes nothing. Pick the R version the slot should advertise, which # is the R_VERSION its entry in .crow/process-updates.yaml uses. +# +# The gate variable is `repair_built_stamp`, not `target_arch`: `target_arch` is +# what build-all-versions and build-all-versions-install-deps gate on, so a +# manual run passing it would start a full rebuild alongside this repair. Every +# pipeline here gates on a variable named after itself for exactly that reason. +# +# crow pipeline create --branch main \ +# --var repair_built_stamp=arm64 --var OS=alpine --var OS_VERSION=3.22 \ +# --var R_VERSION=4.5.3 --var dry_run=true devxy/build-cran-binaries variables: - target_arch: - description: 'Architecture of the slot to repair.' + repair_built_stamp: + description: 'Architecture of the slot to repair. Also gates this pipeline.' options: - amd64 - arm64 @@ -51,7 +60,7 @@ variables: when: - event: manual - evaluate: 'target_arch == "${ARCH}"' + evaluate: 'repair_built_stamp == "${ARCH}"' skip_clone: true