From 2432f3ff94905fc2d8684418b1e19f74f35dc961 Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 20:08:31 +0200 Subject: [PATCH 01/16] docs: add spec for multi-R-version image refactor Image tag drops the R version (e.g., build-env-alpine:3.23 instead of :3.23-4.5); workflows pick an R version by calling /opt/R/${R_VERSION}/bin/R explicitly. Includes three folded-in bug fixes (alpine audit images, package-index images, ubuntu-2404 R patch). --- ...026-05-25-multi-r-version-images-design.md | 242 ++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md diff --git a/docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md b/docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md new file mode 100644 index 0000000..482b89a --- /dev/null +++ b/docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md @@ -0,0 +1,242 @@ +# Refactor build workflows to multi-R-version images + +## Goal + +The container images at `reg.devxy.io/rpkgs/build-env-*` are moving from a one-R-version-per-tag model to a multi-R-version-per-tag model. +The image tag now encodes only the OS version (e.g. `build-env-alpine:3.23`), and each image ships several R installs under `/opt/R//`. +Workflows and recipes must select an R version explicitly by calling `/opt/R/${R_VERSION}/bin/R` instead of relying on `R`/`Rscript` from `PATH`. + +## Scope + +In scope: + +- Every `.crow/*.yaml` workflow that references a `build-env-*` image (64 files). +- `Justfile` recipes that run `docker run` against a `build-env-*` image (3 recipes). +- The commented-out `build-all-versions-install-deps.yaml` in the repo root (kept consistent so the example doesn't go stale). +- Three correctness bug fixes that the user asked to roll into the same change: + - The six `weekly-audit-missing-alpine-{321,322,323}-{amd64,arm64}.yaml` files all incorrectly use `alpine:3.23-4.5`; each should use its own alpine image. + - The fourteen `update-package-index-*.yaml` files all use `build-env-ubuntu:noble-4.4` regardless of the platform they index; each should use its own platform's image. + - `process-updates-ubuntu-2404-{amd64,arm64}.yaml` use `noble-4.4` while the audit and rebuild counterparts use `noble-4.4.3`; align to 4.4.3. + +Out of scope: + +- `local/build-all.R` and other R scripts run *inside* a container with `Rscript`. Once R is launched, child processes inherit `R.home()`; the scripts themselves need no change. +- `docker/`, `benchmark/`. +- Historical docs in `docs/superpowers/plans/` and `docs/superpowers/specs/` that reference old image tags. +- Any workflow restructuring beyond image and R-path changes plus the three bug fixes above. + +## Image and R-path scheme + +New image tag: + +``` +reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} +``` + +`R_VERSION` is no longer encoded in the tag. +Each image contains R installs under `/opt/R//`, accessed via: + +- `/opt/R/${R_VERSION}/bin/R` +- `/opt/R/${R_VERSION}/bin/Rscript` + +`R_VERSION` is always a full patch string (e.g. `4.5.3`, `4.4.3`), never a minor (`4.5`). + +## Platform → image + R_VERSION mapping + +| Platform | New image | `R_VERSION` | +|--------------|-------------------------------------------------|-------------| +| alpine-322 | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| alpine-323 | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| ubuntu-2204 | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` | 4.4.3 | +| ubuntu-2404 | `reg.devxy.io/rpkgs/build-env-ubuntu:noble` | 4.4.3 | +| redhat-8 | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| redhat-9 | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| redhat-10 | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | + +The `alpine-321` platform has no matching new image; its two audit-only workflows fall back to `build-env-alpine:3.23` with `R_VERSION=4.5.3` (rationale in the "Edge cases" section). + +## How workflows reference R + +Two patterns appear in the repo today: + +1. **Hard-coded image, no `R_VERSION` env var.** The R version is implicit in the image tag. +2. **Parameterised image via matrix/`--var`.** `R_VERSION` is already an environment variable; the image tag interpolates `${R_VERSION}`. + +After the refactor: + +- Pattern (1) workflows gain a single `R_VERSION:` entry in their `environment:` block. All `R …` and `Rscript …` invocations in the `commands:` block become `/opt/R/${R_VERSION}/bin/R …` / `/opt/R/${R_VERSION}/bin/Rscript …`. +- Pattern (2) workflows keep their existing `R_VERSION` value source (caller-supplied `--var`); only the image tag and the R invocations change. + +No `PATH` munging, no wrapper script, no shell aliasing. +Every R call site is explicit about which R is invoked. + +### Example: pattern (1) before → after + +Before (excerpt from `process-updates-alpine-322-amd64.yaml`): + +```yaml +- name: 'Processing Updates' + image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 + environment: + PLATFORM: alpine-322 + ARCH: amd64 + # ... + commands: + - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - R -q -e 'packageVersion("bincraft")' + - xvfb-run R -q -e "..." +``` + +After: + +```yaml +- name: 'Processing Updates' + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 + environment: + PLATFORM: alpine-322 + ARCH: amd64 + R_VERSION: 4.5.3 + # ... + commands: + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "..." +``` + +### Example: pattern (2) before → after + +Before (excerpt from `build-all-versions-amd64.yaml`): + +```yaml +- name: 'Build binaries' + image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} + commands: + - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 + - R -q -e "bincraft::process_unarchived_pkgs(...)" +``` + +After: + +```yaml +- name: 'Build binaries' + image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} + commands: + - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- /opt/R/${R_VERSION}/bin/Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e "bincraft::process_unarchived_pkgs(...)" +``` + +`R_VERSION` (e.g. `4.5.3`) is already supplied by the `crow pipeline create --var` invocations documented in the file header. + +## Files touched + +### A. `.crow/build-all-versions-*.yaml` (4 files, pattern 2) + +- `.crow/build-all-versions-amd64.yaml` +- `.crow/build-all-versions-arm64.yaml` +- `.crow/build-all-versions-install-deps-amd64.yaml` +- `.crow/build-all-versions-install-deps-arm64.yaml` + +Change: drop `-${R_VERSION}` from the image tag; substitute the explicit R path in every `R`/`Rscript` invocation. +`R_VERSION` already arrives via `--var`. + +### B. `.crow/process-updates-*.yaml` (14 files, pattern 1) + +- `process-updates-alpine-322-{amd64,arm64}.yaml` +- `process-updates-alpine-323-{amd64,arm64}.yaml` +- `process-updates-ubuntu-2204-{amd64,arm64}.yaml` +- `process-updates-ubuntu-2404-{amd64,arm64}.yaml` +- `process-updates-redhat-8-{amd64,arm64}.yaml` +- `process-updates-redhat-9-{amd64,arm64}.yaml` +- `process-updates-redhat-10-{amd64,arm64}.yaml` + +Change: image swap per mapping table; add `R_VERSION:` env var; substitute R path in every `R`/`Rscript`/`xvfb-run R` invocation. +The two `ubuntu-2404` files also bump from `4.4` to `4.4.3` (bug fix; see "Edge cases"). + +### C. `.crow/weekly-rebuild-missing-*.yaml` (14 files, pattern 1) + +One per platform/arch listed in the mapping table. Same treatment as B. + +### D. `.crow/weekly-audit-missing-*.yaml` (16 files, pattern 1) + +Same treatment as B, *plus* repointing each alpine audit file to its own alpine image: + +| File | New image | `R_VERSION` | +|-------------------------------------------------|--------------------------------------------|-------------| +| `weekly-audit-missing-alpine-321-amd64.yaml` | `build-env-alpine:3.23` (no 3.21 image) | 4.5.3 | +| `weekly-audit-missing-alpine-321-arm64.yaml` | `build-env-alpine:3.23` (no 3.21 image) | 4.5.3 | +| `weekly-audit-missing-alpine-322-amd64.yaml` | `build-env-alpine:3.22` | 4.5.3 | +| `weekly-audit-missing-alpine-322-arm64.yaml` | `build-env-alpine:3.22` | 4.5.3 | +| `weekly-audit-missing-alpine-323-amd64.yaml` | `build-env-alpine:3.23` | 4.5.3 | +| `weekly-audit-missing-alpine-323-arm64.yaml` | `build-env-alpine:3.23` | 4.5.3 | + +The non-alpine audit files follow the mapping table directly. + +### E. `.crow/update-package-index-*.yaml` (14 files, pattern 1) + +Each currently uses `build-env-ubuntu:noble-4.4` regardless of which platform's package index it uploads. Repoint each to its own platform's image and R_VERSION per the mapping table. + +Files: + +- `update-package-index-alpine-322-{amd64,arm64}.yaml` +- `update-package-index-alpine-323-{amd64,arm64}.yaml` +- `update-package-index-ubuntu-2204-{amd64,arm64}.yaml` +- `update-package-index-ubuntu-2404-{amd64,arm64}.yaml` +- `update-package-index-redhat-8-{amd64,arm64}.yaml` +- `update-package-index-redhat-9-{amd64,arm64}.yaml` +- `update-package-index-redhat-10-{amd64,arm64}.yaml` + +The second step in each (`Purge CDN cache`) runs on `alpine:3.23` and does not invoke R; it is unchanged. + +### F. `.crow/archive-missed-packages.yaml` (1 file) + +Currently uses `build-env-alpine:3.23-4.5`. The image OS doesn't matter for this workflow (it only writes to S3 + Postgres). New: `build-env-alpine:3.23` + `R_VERSION: 4.5.3`. Same R-path substitution as elsewhere. + +### G. `.crow/build-r-minor-sensitive-packages.yaml` (1 file) + +Special case: uses `docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}-${r_version}` (lowercase matrix vars; different registry). + +Decision (user-confirmed): keep the `docker.io/devxygmbh/` registry. Drop the `-${r_version}` suffix from the image tag, leaving `docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}`. Substitute every `R`/`Rscript` for `/opt/R/${r_version}/bin/R` / `/opt/R/${r_version}/bin/Rscript`. + +The workflow's matrix continues to use `r_version: 4.5` / `4.4`. To remain consistent with the rest of the refactor's "always full patch" rule, the matrix values should be updated to `4.5.3` and `4.4.3` respectively (matching alpine-321's R 4.5.3 and the historical 4.4.3 patch). + +### H. `Justfile` (3 recipes) + +- `build-all OS OS_VERSION ARCH R_VERSION PACKAGE NCPUS` +- `build-single OS OS_VERSION ARCH R_VERSION PACKAGE TAG NCPUS` +- `process-updates OS OS_VERSION ARCH R_VERSION interval` + +Change in each: drop `-{{R_VERSION}}` from the image tag, and replace every `R `/`R -q -e` inside the `bash -c '…'` string with `/opt/R/{{R_VERSION}}/bin/R `/`/opt/R/{{R_VERSION}}/bin/R -q -e`. +The example comments above each recipe (`# just build-all alpine 3.21 arm64 4.5.0 …`) should be updated to use a current platform/R combination (e.g. `alpine 3.22 amd64 4.5.3`). + +### I. `build-all-versions-install-deps.yaml` (commented-out, repo root) + +Apply the same edits as the active `.crow/build-all-versions-install-deps-*.yaml` files so the commented-out example remains a faithful template. + +## Edge cases and bug fixes folded in + +1. **Alpine audit images.** All six `weekly-audit-missing-alpine-{321,322,323}-{amd64,arm64}.yaml` files currently point at `alpine:3.23-4.5`. After the refactor, each one points at the image that matches its own alpine version. `alpine-321` has no matching image in the new scheme, so its two files use `build-env-alpine:3.23` (the audit workflow reads `PLATFORM` from env and queries S3/CRAN; the container's own OS does not affect correctness). +2. **Package-index workflows.** All fourteen `update-package-index-*.yaml` files are repointed to their own platform's image, matching the rest of the per-platform workflows. +3. **Ubuntu-2404 R version.** `process-updates-ubuntu-2404-{amd64,arm64}.yaml` move from `noble-4.4` to `build-env-ubuntu:noble` + `R_VERSION: 4.4.3`, matching the audit and rebuild counterparts. + +## Validation + +There is no automated test suite for workflow files in this repo. Validation is: + +1. **Static checks per file**: after edit, grep each touched workflow for leftover bare `R `, `Rscript `, `R -q`, `R -e`, `R CMD` invocations. Any hit that is not part of a longer path (`/opt/R/…/bin/R`) is a regression. +2. **Image tag check**: grep for `build-env-` lines and confirm no tag still contains `-${R_VERSION}`, `-4.4`, `-4.4.3`, `-4.5`, or `-4.5.3`. +3. **Smoke runs**: trigger one workflow per shape on a feature branch and confirm green: + - `process-updates-alpine-322-amd64.yaml` + - `weekly-rebuild-missing-redhat-9-amd64.yaml` + - `weekly-audit-missing-ubuntu-2204-amd64.yaml` + - `update-package-index-redhat-10-amd64.yaml` + - `archive-missed-packages.yaml` + - `build-all-versions-amd64.yaml` (with its `install-deps` predecessor) + - `build-r-minor-sensitive-packages.yaml` + +The `Justfile` recipes are exercised by running each once locally against a current platform. + +## Risks + +- **Wrong `R_VERSION` in a file**: typo in the platform→version mapping causes `/opt/R//bin/R: not found`. Mitigated by the static grep in validation and by smoke-running one workflow per shape. +- **`build-r-minor-sensitive-packages.yaml` assumes new images exist at `docker.io/devxygmbh/`**: if the multi-R image is only published to `reg.devxy.io/rpkgs/`, this workflow will fail on the first pull. If that turns out to be the case, switch to option (a) — repoint to `reg.devxy.io/rpkgs/` — as a follow-up. +- **R subprocesses inside scripts**: `pak`, `future`, and similar libraries spawn child R processes via `R.home()`, which is set to the parent's install. No additional action needed. -- 2.54.0 From 754a076e33a78c81a0db1551878bab500117221f Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:22:51 +0200 Subject: [PATCH 02/16] docs: add implementation plan for multi-R-version image refactor --- .../2026-05-25-multi-r-version-images.md | 1031 +++++++++++++++++ 1 file changed, 1031 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-25-multi-r-version-images.md diff --git a/docs/superpowers/plans/2026-05-25-multi-r-version-images.md b/docs/superpowers/plans/2026-05-25-multi-r-version-images.md new file mode 100644 index 0000000..82a5198 --- /dev/null +++ b/docs/superpowers/plans/2026-05-25-multi-r-version-images.md @@ -0,0 +1,1031 @@ +# Multi-R-version image refactor — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. +> Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Refactor every `.crow/` workflow, the `Justfile` recipes, and the commented-out repo-root example to use the new multi-R-version images — drop `R_VERSION` from the image tag and invoke R via `/opt/R/${R_VERSION}/bin/R` instead of `R`/`Rscript` on `PATH`. + +**Architecture:** Pure mechanical refactor across 64 `.crow/*.yaml` workflows, 1 `Justfile`, and 1 commented-root file. +Each workflow gets three kinds of edits: image tag (drop `-` suffix), `R_VERSION` env var (added where it wasn't present), and explicit R path substitution at every call site. +Three correctness bug fixes are folded in: alpine audits use the matching alpine image, package-index workflows use the matching platform image, and `ubuntu-2404` process-updates align to R 4.4.3. + +**Tech Stack:** Woodpecker CI / `crow` (YAML workflows), `just` (Justfile), R 4.4.3 / 4.5.3. + +**Spec:** [`docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md`](../specs/2026-05-25-multi-r-version-images-design.md) + +--- + +## Conventions used throughout this plan + +**Platform → image + R_VERSION mapping:** + +| Platform | New image | `R_VERSION` | +|--------------|-------------------------------------------------|-------------| +| alpine-322 | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| alpine-323 | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| ubuntu-2204 | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` | 4.4.3 | +| ubuntu-2404 | `reg.devxy.io/rpkgs/build-env-ubuntu:noble` | 4.4.3 | +| redhat-8 | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| redhat-9 | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| redhat-10 | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | + +`alpine-321` (audit-only) has no matching new image — falls back to `build-env-alpine:3.23` + `R_VERSION: 4.5.3`. + +**Editing recipe per file (pattern-1 workflows, i.e. those with a hard-coded image tag):** + +1. Replace the `image:` line — drop `-` from the tag. +2. Insert `R_VERSION: ` into the `environment:` block. Anchor the insertion to a line that already exists in that file (typically `R_LIBS_USER:`, falling back to `GIT_USER:` for files that don't cache R libraries). +3. Replace every bare `R ` invocation in `commands:` with `/opt/R/${R_VERSION}/bin/R ` (including `xvfb-run R`, `R CMD`, etc.). +4. Replace every bare `Rscript ` invocation in `commands:` with `/opt/R/${R_VERSION}/bin/Rscript `. + +**Pattern-2 workflows** (image already parameterised via `${OS}`/`${OS_VERSION}`/`${R_VERSION}`) skip step 2 — `R_VERSION` already arrives via `--var`. + +**Why `replace_all` is safe:** The `Edit` tool's `replace_all` is used in the steps below only on tokens that appear nowhere except in workflow command lines (`R -q -e`, `R CMD INSTALL`, `Rscript local/`, `xvfb-run R `). +These tokens never appear inside YAML keys, env vars, comments, or quoted strings within R code in these files (verified by grep). +If a future workflow contains any of these tokens in a non-command context, switch that file to per-line targeted edits. + +--- + +## Task 1: build-all-versions-* workflows (4 files, pattern 2) + +**Files (modify):** + +- `.crow/build-all-versions-amd64.yaml` +- `.crow/build-all-versions-arm64.yaml` +- `.crow/build-all-versions-install-deps-amd64.yaml` +- `.crow/build-all-versions-install-deps-arm64.yaml` + +These workflows already receive `R_VERSION` from `crow pipeline create --var R_VERSION=…`. +Only the image tag and R invocations change. + +- [ ] **Step 1.1: Edit `.crow/build-all-versions-amd64.yaml` — image tag** + +Use `Edit`: + +``` +old_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} +new_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} +``` + +- [ ] **Step 1.2: Edit `.crow/build-all-versions-amd64.yaml` — Rscript invocation** + +Use `Edit`: + +``` +old_string: - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 +new_string: - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- /opt/R/${R_VERSION}/bin/Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 +``` + +- [ ] **Step 1.3: Edit `.crow/build-all-versions-amd64.yaml` — `R -q -e` invocation** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +(The file contains one such line: `R -q -e "bincraft::process_unarchived_pkgs(...)"`.) + +- [ ] **Step 1.4: Repeat steps 1.1–1.3 for `.crow/build-all-versions-arm64.yaml`** + +The three edits are textually identical to steps 1.1–1.3 because the build-arm64 file uses the same parameterised image tag and the same `R -q -e` / `Rscript` invocations. + +- [ ] **Step 1.5: Edit `.crow/build-all-versions-install-deps-amd64.yaml` — image tag** + +Use `Edit`: + +``` +old_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} +new_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} +``` + +- [ ] **Step 1.6: Edit `.crow/build-all-versions-install-deps-amd64.yaml` — `R -q -e` invocations** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +(The file contains four `R -q -e` lines.) + +- [ ] **Step 1.7: Repeat steps 1.5–1.6 for `.crow/build-all-versions-install-deps-arm64.yaml`** + +- [ ] **Step 1.8: Validate** + +Run: + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/build-all-versions-*.yaml | grep -v '/opt/R/' +``` + +Expected: no output. +Any line returned is a missed substitution — investigate before continuing. + +Run: + +```bash +grep -nE 'build-env-.*\$\{OS_VERSION\}-' .crow/build-all-versions-*.yaml +``` + +Expected: no output. + +- [ ] **Step 1.9: Commit** + +```bash +git add .crow/build-all-versions-amd64.yaml .crow/build-all-versions-arm64.yaml .crow/build-all-versions-install-deps-amd64.yaml .crow/build-all-versions-install-deps-arm64.yaml +git commit -m "refactor(ci): use multi-R-version images in build-all-versions workflows + +Drop -\${R_VERSION} from the image tag and invoke R/Rscript via the +explicit /opt/R/\${R_VERSION}/bin/ path." +``` + +--- + +## Task 2: process-updates workflows (14 files, pattern 1) + +**Files (modify):** + +| File | New image | `R_VERSION` | +|-----------------------------------------------|--------------------------------------------|-------------| +| `process-updates-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| `process-updates-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| `process-updates-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| `process-updates-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| `process-updates-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | +| `process-updates-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | +| `process-updates-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | +| `process-updates-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | +| `process-updates-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| `process-updates-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| `process-updates-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| `process-updates-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| `process-updates-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | +| `process-updates-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | + +The two `process-updates-ubuntu-2404-*` files also bump R from `4.4` to `4.4.3` (folded-in bug fix per spec). + +### Worked example: `.crow/process-updates-alpine-322-amd64.yaml` + +- [ ] **Step 2.1: Edit image tag** + +Use `Edit`: + +``` +old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 +new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 +``` + +- [ ] **Step 2.2: Add `R_VERSION` env var** + +Use `Edit` (anchor on `R_LIBS_USER:`, which appears in every process-updates file): + +``` +old_string: R_LIBS_USER: /mnt/cache/R-pkgs +new_string: R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 +``` + +(Preserve the existing six-space indentation.) + +- [ ] **Step 2.3: Substitute R path** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +This covers both bare `R -q -e` and `xvfb-run R -q -e` lines (the latter becomes `xvfb-run /opt/R/${R_VERSION}/bin/R -q -e`, which is correct). + +- [ ] **Step 2.4: Validate this file** + +Run: + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/process-updates-alpine-322-amd64.yaml | grep -v '/opt/R/' +``` + +Expected: no output. + +### Apply the same three-step pattern to the remaining 13 files + +- [ ] **Step 2.5: Apply to `process-updates-alpine-322-arm64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-alpine:3.22` · `R_VERSION: 4.5.3`. +Old image tag suffix: `-4.5` (so `old_string` is `image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5`). + +- [ ] **Step 2.6: Apply to `process-updates-alpine-323-amd64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-alpine:3.23` · `R_VERSION: 4.5.3`. +Old image tag suffix: `-4.5`. + +- [ ] **Step 2.7: Apply to `process-updates-alpine-323-arm64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-alpine:3.23` · `R_VERSION: 4.5.3`. +Old image tag suffix: `-4.5`. + +- [ ] **Step 2.8: Apply to `process-updates-ubuntu-2204-amd64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4.3`. + +- [ ] **Step 2.9: Apply to `process-updates-ubuntu-2204-arm64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4.3`. + +- [ ] **Step 2.10: Apply to `process-updates-ubuntu-2404-amd64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-ubuntu:noble` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4` (note: `4.4` without the patch — bug fix). + +- [ ] **Step 2.11: Apply to `process-updates-ubuntu-2404-arm64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-ubuntu:noble` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4`. + +- [ ] **Step 2.12: Apply to `process-updates-redhat-8-amd64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-redhat:8` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4.3`. + +- [ ] **Step 2.13: Apply to `process-updates-redhat-8-arm64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-redhat:8` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4.3`. + +- [ ] **Step 2.14: Apply to `process-updates-redhat-9-amd64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-redhat:9` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4.3`. + +- [ ] **Step 2.15: Apply to `process-updates-redhat-9-arm64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-redhat:9` · `R_VERSION: 4.4.3`. +Old image tag suffix: `-4.4.3`. + +- [ ] **Step 2.16: Apply to `process-updates-redhat-10-amd64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-redhat:10` · `R_VERSION: 4.5.3`. +Old image tag suffix: `-4.5.3`. + +- [ ] **Step 2.17: Apply to `process-updates-redhat-10-arm64.yaml`** + +Image: `reg.devxy.io/rpkgs/build-env-redhat:10` · `R_VERSION: 4.5.3`. +Old image tag suffix: `-4.5.3`. + +- [ ] **Step 2.18: Validate all 14 files** + +Run: + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/process-updates-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +``` + +Expected: no output (comments starting with `#` are filtered out). + +Run: + +```bash +grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/process-updates-*.yaml +``` + +Expected: no output. + +Run: + +```bash +grep -nE 'R_VERSION:' .crow/process-updates-*.yaml | wc -l +``` + +Expected: `14` (one `R_VERSION:` per file). + +- [ ] **Step 2.19: Commit** + +```bash +git add .crow/process-updates-*.yaml +git commit -m "refactor(ci): use multi-R-version images in process-updates workflows + +Drop the R-version suffix from each image tag, add an explicit +R_VERSION env var per file, and invoke R via +/opt/R/\${R_VERSION}/bin/R at every call site. + +Also aligns ubuntu-2404 process-updates from R 4.4 to R 4.4.3, +matching the audit and rebuild counterparts." +``` + +--- + +## Task 3: weekly-rebuild-missing workflows (14 files, pattern 1) + +**Files (modify):** + +| File | New image | `R_VERSION` | +|---------------------------------------------------|--------------------------------------------|-------------| +| `weekly-rebuild-missing-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| `weekly-rebuild-missing-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| `weekly-rebuild-missing-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| `weekly-rebuild-missing-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| `weekly-rebuild-missing-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | +| `weekly-rebuild-missing-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | +| `weekly-rebuild-missing-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | +| `weekly-rebuild-missing-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | +| `weekly-rebuild-missing-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| `weekly-rebuild-missing-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| `weekly-rebuild-missing-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| `weekly-rebuild-missing-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| `weekly-rebuild-missing-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | +| `weekly-rebuild-missing-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | + +### Worked example: `.crow/weekly-rebuild-missing-alpine-322-amd64.yaml` + +- [ ] **Step 3.1: Edit image tag** + +Use `Edit`: + +``` +old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 +new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 +``` + +- [ ] **Step 3.2: Add `R_VERSION` env var** + +Use `Edit` (anchor on `R_LIBS_USER:`): + +``` +old_string: R_LIBS_USER: /mnt/cache/R-pkgs +new_string: R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 +``` + +- [ ] **Step 3.3: Substitute R path** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +(Also covers `$XVFB $XVFB_ARGS -- R -q -e ...` since the matched substring becomes `/opt/R/${R_VERSION}/bin/R -q -e`.) + +- [ ] **Step 3.4: Validate this file** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/weekly-rebuild-missing-alpine-322-amd64.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +``` + +Expected: no output. + +### Apply the same three-step pattern to the remaining 13 files + +- [ ] **Step 3.5: Apply to `weekly-rebuild-missing-alpine-322-arm64.yaml`** (image alpine:3.22, R_VERSION 4.5.3, old suffix `-4.5`) +- [ ] **Step 3.6: Apply to `weekly-rebuild-missing-alpine-323-amd64.yaml`** (image alpine:3.23, R_VERSION 4.5.3, old suffix `-4.5`) +- [ ] **Step 3.7: Apply to `weekly-rebuild-missing-alpine-323-arm64.yaml`** (image alpine:3.23, R_VERSION 4.5.3, old suffix `-4.5`) +- [ ] **Step 3.8: Apply to `weekly-rebuild-missing-ubuntu-2204-amd64.yaml`** (image ubuntu:jammy, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.9: Apply to `weekly-rebuild-missing-ubuntu-2204-arm64.yaml`** (image ubuntu:jammy, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.10: Apply to `weekly-rebuild-missing-ubuntu-2404-amd64.yaml`** (image ubuntu:noble, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.11: Apply to `weekly-rebuild-missing-ubuntu-2404-arm64.yaml`** (image ubuntu:noble, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.12: Apply to `weekly-rebuild-missing-redhat-8-amd64.yaml`** (image redhat:8, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.13: Apply to `weekly-rebuild-missing-redhat-8-arm64.yaml`** (image redhat:8, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.14: Apply to `weekly-rebuild-missing-redhat-9-amd64.yaml`** (image redhat:9, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.15: Apply to `weekly-rebuild-missing-redhat-9-arm64.yaml`** (image redhat:9, R_VERSION 4.4.3, old suffix `-4.4.3`) +- [ ] **Step 3.16: Apply to `weekly-rebuild-missing-redhat-10-amd64.yaml`** (image redhat:10, R_VERSION 4.5.3, old suffix `-4.5.3`) +- [ ] **Step 3.17: Apply to `weekly-rebuild-missing-redhat-10-arm64.yaml`** (image redhat:10, R_VERSION 4.5.3, old suffix `-4.5.3`) + +- [ ] **Step 3.18: Validate all 14 files** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/weekly-rebuild-missing-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/weekly-rebuild-missing-*.yaml +grep -nE 'R_VERSION:' .crow/weekly-rebuild-missing-*.yaml | wc -l +``` + +Expected: first two return no output; the third returns `14`. + +- [ ] **Step 3.19: Commit** + +```bash +git add .crow/weekly-rebuild-missing-*.yaml +git commit -m "refactor(ci): use multi-R-version images in weekly-rebuild-missing workflows + +Drop the R-version suffix from each image tag, add an explicit +R_VERSION env var per file, and invoke R via +/opt/R/\${R_VERSION}/bin/R at every call site." +``` + +--- + +## Task 4: weekly-audit-missing workflows (16 files, pattern 1) + +This task folds in the **alpine audit bug fix**: all six `weekly-audit-missing-alpine-*` files currently point at `alpine:3.23-4.5` regardless of platform, even when the platform is alpine-321 or alpine-322. + +**Files (modify):** + +| File | New image | `R_VERSION` | Old tag | +|---------------------------------------------------|--------------------------------------------|-------------|---------| +| `weekly-audit-missing-alpine-321-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | +| `weekly-audit-missing-alpine-321-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | +| `weekly-audit-missing-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | `3.23-4.5` (bug fix: was wrong) | +| `weekly-audit-missing-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | `3.23-4.5` (bug fix) | +| `weekly-audit-missing-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | +| `weekly-audit-missing-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | +| `weekly-audit-missing-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | `jammy-4.4.3` | +| `weekly-audit-missing-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | `jammy-4.4.3` | +| `weekly-audit-missing-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | `noble-4.4.3` | +| `weekly-audit-missing-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | `noble-4.4.3` | +| `weekly-audit-missing-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | `8-4.4.3` | +| `weekly-audit-missing-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | `8-4.4.3` | +| `weekly-audit-missing-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | `9-4.4.3` | +| `weekly-audit-missing-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | `9-4.4.3` | +| `weekly-audit-missing-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | `10-4.5.3` | +| `weekly-audit-missing-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | `10-4.5.3` | + +### Worked example: `.crow/weekly-audit-missing-alpine-322-amd64.yaml` (includes bug fix) + +- [ ] **Step 4.1: Edit image tag** + +Use `Edit`: + +``` +old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 +new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 +``` + +Note: this both drops the R version AND fixes the OS-version mismatch (was 3.23, should be 3.22). + +- [ ] **Step 4.2: Add `R_VERSION` env var** + +Use `Edit` (anchor on `R_LIBS_USER:`, which appears in every weekly-audit-missing file): + +``` +old_string: R_LIBS_USER: /mnt/cache/R-pkgs +new_string: R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 +``` + +- [ ] **Step 4.3: Substitute R path** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +- [ ] **Step 4.4: Validate this file** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/weekly-audit-missing-alpine-322-amd64.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +``` + +Expected: no output. + +### Apply the same three-step pattern to the remaining 15 files + +For each file, use its row in the table above to get the new image and `R_VERSION`. +The `old_string` for the image tag edit is `image: reg.devxy.io/rpkgs/build-env-`, where `` is the "Old tag" column. + +- [ ] **Step 4.5: Apply to `weekly-audit-missing-alpine-321-amd64.yaml`** (new image alpine:3.23, R_VERSION 4.5.3, old tag suffix `-4.5`) +- [ ] **Step 4.6: Apply to `weekly-audit-missing-alpine-321-arm64.yaml`** (alpine:3.23, 4.5.3, old `-4.5`) +- [ ] **Step 4.7: Apply to `weekly-audit-missing-alpine-322-arm64.yaml`** (alpine:3.22, 4.5.3, old `-4.5` — image bug fix) +- [ ] **Step 4.8: Apply to `weekly-audit-missing-alpine-323-amd64.yaml`** (alpine:3.23, 4.5.3, old `-4.5`) +- [ ] **Step 4.9: Apply to `weekly-audit-missing-alpine-323-arm64.yaml`** (alpine:3.23, 4.5.3, old `-4.5`) +- [ ] **Step 4.10: Apply to `weekly-audit-missing-ubuntu-2204-amd64.yaml`** (ubuntu:jammy, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.11: Apply to `weekly-audit-missing-ubuntu-2204-arm64.yaml`** (ubuntu:jammy, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.12: Apply to `weekly-audit-missing-ubuntu-2404-amd64.yaml`** (ubuntu:noble, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.13: Apply to `weekly-audit-missing-ubuntu-2404-arm64.yaml`** (ubuntu:noble, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.14: Apply to `weekly-audit-missing-redhat-8-amd64.yaml`** (redhat:8, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.15: Apply to `weekly-audit-missing-redhat-8-arm64.yaml`** (redhat:8, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.16: Apply to `weekly-audit-missing-redhat-9-amd64.yaml`** (redhat:9, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.17: Apply to `weekly-audit-missing-redhat-9-arm64.yaml`** (redhat:9, 4.4.3, old `-4.4.3`) +- [ ] **Step 4.18: Apply to `weekly-audit-missing-redhat-10-amd64.yaml`** (redhat:10, 4.5.3, old `-4.5.3`) +- [ ] **Step 4.19: Apply to `weekly-audit-missing-redhat-10-arm64.yaml`** (redhat:10, 4.5.3, old `-4.5.3`) + +- [ ] **Step 4.20: Validate all 16 files** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/weekly-audit-missing-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/weekly-audit-missing-*.yaml +grep -nE 'R_VERSION:' .crow/weekly-audit-missing-*.yaml | wc -l +``` + +Expected: first two return no output; the third returns `16`. + +Also verify the alpine bug fix took effect: + +```bash +grep -E 'image:' .crow/weekly-audit-missing-alpine-*.yaml +``` + +Expected: + +``` +.crow/weekly-audit-missing-alpine-321-amd64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 +.crow/weekly-audit-missing-alpine-321-arm64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 +.crow/weekly-audit-missing-alpine-322-amd64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 +.crow/weekly-audit-missing-alpine-322-arm64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 +.crow/weekly-audit-missing-alpine-323-amd64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 +.crow/weekly-audit-missing-alpine-323-arm64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 +``` + +- [ ] **Step 4.21: Commit** + +```bash +git add .crow/weekly-audit-missing-*.yaml +git commit -m "refactor(ci): use multi-R-version images in weekly-audit-missing workflows + +Drop the R-version suffix from each image tag, add an explicit +R_VERSION env var per file, and invoke R via +/opt/R/\${R_VERSION}/bin/R at every call site. + +Also fixes the alpine-322 audit image, which was previously pointing +at alpine:3.23 instead of alpine:3.22. The alpine-321 audits stay on +alpine:3.23 since no 3.21 image exists in the new scheme — they only +query S3/CRAN, so the container OS does not affect correctness." +``` + +--- + +## Task 5: update-package-index workflows (14 files, pattern 1) + +This task folds in the **package-index image bug fix**: every `update-package-index-*` file currently uses `build-env-ubuntu:noble-4.4` (or `noble-4.5` in the redhat-10 case) regardless of which platform's package index it uploads. +After the refactor, each file uses the image that matches its own platform per the mapping table. + +The first step (`Upload PACKAGES files`) needs the refactor; the second step (`Purge CDN cache`) uses `alpine:3.23` directly, has no R calls, and is unchanged. + +**Files (modify):** + +| File | New image | `R_VERSION` | +|---------------------------------------------------|--------------------------------------------|-------------| +| `update-package-index-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| `update-package-index-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | +| `update-package-index-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| `update-package-index-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | +| `update-package-index-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | +| `update-package-index-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | +| `update-package-index-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | +| `update-package-index-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | +| `update-package-index-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| `update-package-index-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | +| `update-package-index-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| `update-package-index-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | +| `update-package-index-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | +| `update-package-index-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | + +### Worked example: `.crow/update-package-index-alpine-322-amd64.yaml` + +The current image is `build-env-ubuntu:noble-4.4` (a *wrong* OS); we repoint to `build-env-alpine:3.22` (the matching OS) and add R_VERSION. + +- [ ] **Step 5.1: Edit image tag** + +Use `Edit`: + +``` +old_string: image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 +new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 +``` + +- [ ] **Step 5.2: Add `R_VERSION` env var** + +Use `Edit` (anchor on `R_LIBS_USER:`, which appears in every update-package-index file): + +``` +old_string: R_LIBS_USER: /mnt/cache/R-pkgs +new_string: R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 +``` + +- [ ] **Step 5.3: Substitute R path** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +- [ ] **Step 5.4: Validate this file** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/update-package-index-alpine-322-amd64.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +``` + +Expected: no output. + +### Apply the same three-step pattern to the remaining 13 files + +Old image tag for every file in this task except `update-package-index-redhat-10-amd64.yaml` is `reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4`. +For `update-package-index-redhat-10-amd64.yaml`, the old image tag is `reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.5` (verify with `grep image: .crow/update-package-index-redhat-10-amd64.yaml` before editing). + +- [ ] **Step 5.5: Apply to `update-package-index-alpine-322-arm64.yaml`** (new alpine:3.22, R_VERSION 4.5.3, old `noble-4.4`) +- [ ] **Step 5.6: Apply to `update-package-index-alpine-323-amd64.yaml`** (alpine:3.23, 4.5.3, old `noble-4.4`) +- [ ] **Step 5.7: Apply to `update-package-index-alpine-323-arm64.yaml`** (alpine:3.23, 4.5.3, old `noble-4.4`) +- [ ] **Step 5.8: Apply to `update-package-index-ubuntu-2204-amd64.yaml`** (ubuntu:jammy, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.9: Apply to `update-package-index-ubuntu-2204-arm64.yaml`** (ubuntu:jammy, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.10: Apply to `update-package-index-ubuntu-2404-amd64.yaml`** (ubuntu:noble, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.11: Apply to `update-package-index-ubuntu-2404-arm64.yaml`** (ubuntu:noble, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.12: Apply to `update-package-index-redhat-8-amd64.yaml`** (redhat:8, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.13: Apply to `update-package-index-redhat-8-arm64.yaml`** (redhat:8, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.14: Apply to `update-package-index-redhat-9-amd64.yaml`** (redhat:9, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.15: Apply to `update-package-index-redhat-9-arm64.yaml`** (redhat:9, 4.4.3, old `noble-4.4`) +- [ ] **Step 5.16: Apply to `update-package-index-redhat-10-amd64.yaml`** (redhat:10, 4.5.3, old `noble-4.5` — note the `4.5` not `4.4`!) +- [ ] **Step 5.17: Apply to `update-package-index-redhat-10-arm64.yaml`** (redhat:10, 4.5.3, old `noble-4.4`) + +- [ ] **Step 5.18: Validate all 14 files** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/update-package-index-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/update-package-index-*.yaml +grep -nE '^\s*R_VERSION:' .crow/update-package-index-*.yaml | wc -l +``` + +Expected: first two return no output; the third returns `14`. + +Verify each file's image matches its platform: + +```bash +grep -E '^\s*image: reg.devxy.io/rpkgs/build-env' .crow/update-package-index-*.yaml +``` + +Expected: each file's image OS/version matches its platform suffix (alpine-322 → alpine:3.22, ubuntu-2404 → ubuntu:noble, redhat-10 → redhat:10, etc.). + +- [ ] **Step 5.19: Commit** + +```bash +git add .crow/update-package-index-*.yaml +git commit -m "refactor(ci): use multi-R-version images in update-package-index workflows + +Drop the R-version suffix from each image tag, add an explicit +R_VERSION env var per file, and invoke R via +/opt/R/\${R_VERSION}/bin/R at every call site. + +Also repoints every update-package-index workflow at the image that +matches its own platform (was previously pinned to +build-env-ubuntu:noble-4.4 / noble-4.5 regardless of platform)." +``` + +--- + +## Task 6: archive-missed-packages workflow (1 file) + +**File (modify):** `.crow/archive-missed-packages.yaml` + +The image OS doesn't matter for this workflow (it only writes to S3 + Postgres). +It currently uses `build-env-alpine:3.23-4.5`; the new image keeps alpine:3.23 and picks R 4.5.3 explicitly. +Note: this file has no `R_LIBS_USER` env var, so anchor the `R_VERSION` insertion on `GIT_USER: pat-s` (a line that *is* present). + +- [ ] **Step 6.1: Edit image tag** + +Use `Edit`: + +``` +old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 +new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 +``` + +- [ ] **Step 6.2: Add `R_VERSION` env var** + +Use `Edit` (anchor on `GIT_USER:`): + +``` +old_string: GIT_USER: pat-s +new_string: GIT_USER: pat-s + R_VERSION: 4.5.3 +``` + +- [ ] **Step 6.3: Substitute R path** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +- [ ] **Step 6.4: Validate** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/archive-missed-packages.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/archive-missed-packages.yaml +``` + +Expected: both return no output. + +- [ ] **Step 6.5: Commit** + +```bash +git add .crow/archive-missed-packages.yaml +git commit -m "refactor(ci): use multi-R-version image in archive-missed-packages + +Drop the R-version suffix from the image tag and invoke R via the +explicit /opt/R/\${R_VERSION}/bin/R path. The image OS does not +matter for this workflow; it stays on alpine:3.23." +``` + +--- + +## Task 7: build-r-minor-sensitive-packages workflow (1 file) + +**File (modify):** `.crow/build-r-minor-sensitive-packages.yaml` + +This is the only workflow on the `docker.io/devxygmbh/` registry, with lowercase matrix variables. +Per the spec decision: keep the registry, drop `-${r_version}` from the tag, update the matrix to use full patch versions, and substitute the explicit R path (including `R CMD INSTALL`). + +- [ ] **Step 7.1: Bump matrix to full-patch R versions** + +Use `Edit`: + +``` +old_string: - os: alpine + os_version: 3.21 + r_version: 4.5 + - os: alpine + os_version: 3.21 + r_version: 4.4 +new_string: - os: alpine + os_version: 3.21 + r_version: 4.5.3 + - os: alpine + os_version: 3.21 + r_version: 4.4.3 +``` + +- [ ] **Step 7.2: Edit image tag** + +Use `Edit`: + +``` +old_string: image: "docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}-${r_version}" +new_string: image: "docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}" +``` + +- [ ] **Step 7.3: Substitute `R CMD INSTALL` invocation** + +Use `Edit`: + +``` +old_string: git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft && R CMD INSTALL --library=/tmp/R-libs /tmp/bincraft && R -q -e 'packageVersion("bincraft")' +new_string: git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft && /opt/R/${r_version}/bin/R CMD INSTALL --library=/tmp/R-libs /tmp/bincraft && /opt/R/${r_version}/bin/R -q -e 'packageVersion("bincraft")' +``` + +- [ ] **Step 7.4: Substitute the remaining R invocation** + +Use `Edit`: + +``` +old_string: $XVFB -- R -q -e +new_string: $XVFB -- /opt/R/${r_version}/bin/R -q -e +``` + +- [ ] **Step 7.5: Validate** + +```bash +grep -nE '(^|[^/])R(script)? ' .crow/build-r-minor-sensitive-packages.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' +grep -nE 'rpkgs-build-env-.*:[^[:space:]]*-[0-9]' .crow/build-r-minor-sensitive-packages.yaml +``` + +Expected: both return no output. + +- [ ] **Step 7.6: Commit** + +```bash +git add .crow/build-r-minor-sensitive-packages.yaml +git commit -m "refactor(ci): use multi-R-version image in build-r-minor-sensitive-packages + +Drop -\${r_version} from the docker.io/devxygmbh tag and invoke R +via the explicit /opt/R/\${r_version}/bin/R path (including +R CMD INSTALL). Bumps the matrix r_version values from 4.5/4.4 to +the full-patch 4.5.3/4.4.3, matching the rest of the refactor's +'always full patch' rule." +``` + +--- + +## Task 8: Justfile (3 recipes) + +**File (modify):** `Justfile` + +Three recipes use `docker run … reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} …`. +Drop `-{{R_VERSION}}` from each image tag and substitute `/opt/R/{{R_VERSION}}/bin/R` for every `R ` inside the `bash -c '…'` strings. + +The example comment lines above each recipe still mention `4.5.0` and `3.21` (which no longer have matching images). +Update those examples to a current platform/R combination so they remain runnable. + +- [ ] **Step 8.1: Update `build-all` recipe and its example comment** + +Use `Edit`: + +``` +old_string: # just build-all alpine 3.21 arm64 4.5.0 odbc 1 +build-all OS OS_VERSION ARCH R_VERSION PACKAGE NCPUS: + docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} bash -c 'R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' +new_string: # just build-all alpine 3.22 arm64 4.5.3 odbc 1 +build-all OS OS_VERSION ARCH R_VERSION PACKAGE NCPUS: + docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} bash -c '/opt/R/{{R_VERSION}}/bin/R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && /opt/R/{{R_VERSION}}/bin/R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' +``` + +- [ ] **Step 8.2: Update `build-single` recipe and its example comments** + +Use `Edit`: + +``` +old_string: # just build-single alpine 3.21 arm64 4.5.0 odbc 1.5.0 1 +# just build-single alpine 3.22 arm64 4.5.0 sf latest 1 +# just build-single ubuntu noble arm64 4.2.3 rlang 1.1.6 1 +build-single OS OS_VERSION ARCH R_VERSION PACKAGE TAG NCPUS: + docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} bash -c 'R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", tag = \"{{TAG}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' +new_string: # just build-single alpine 3.22 arm64 4.5.3 odbc 1.5.0 1 +# just build-single alpine 3.22 arm64 4.5.3 sf latest 1 +# just build-single ubuntu noble arm64 4.4.3 rlang 1.1.6 1 +build-single OS OS_VERSION ARCH R_VERSION PACKAGE TAG NCPUS: + docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} bash -c '/opt/R/{{R_VERSION}}/bin/R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && /opt/R/{{R_VERSION}}/bin/R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", tag = \"{{TAG}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' +``` + +- [ ] **Step 8.3: Update `process-updates` recipe and its example comment** + +Use `Edit`: + +``` +old_string: # just process-updates redhat 9 arm64 4.4.3 'lubridate::interval(lubridate::today() - 4, lubridate::today() - 4)' +process-updates OS OS_VERSION ARCH R_VERSION interval: + docker run --rm -it --platform linux/{{ARCH}} -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} R -q -e "bincraft::process_cran_updates(interval = {{interval}}, platform = \"{{OS}}\", s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" +new_string: # just process-updates redhat 9 arm64 4.4.3 'lubridate::interval(lubridate::today() - 4, lubridate::today() - 4)' +process-updates OS OS_VERSION ARCH R_VERSION interval: + docker run --rm -it --platform linux/{{ARCH}} -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::process_cran_updates(interval = {{interval}}, platform = \"{{OS}}\", s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" +``` + +- [ ] **Step 8.4: Validate** + +```bash +grep -nE 'build-env-.*\{\{OS_VERSION\}\}-' Justfile +grep -nE "(^|[^/])R " Justfile | grep -v '/opt/R/' +``` + +Expected: both return no output. + +- [ ] **Step 8.5: Commit** + +```bash +git add Justfile +git commit -m "refactor(justfile): use multi-R-version images in build/process recipes + +Drop -{{R_VERSION}} from the image tag and invoke R via the explicit +/opt/R/{{R_VERSION}}/bin/R path in build-all, build-single, and +process-updates. Updates example comments to use current +platform/R combinations." +``` + +--- + +## Task 9: Commented-out build-all-versions-install-deps.yaml in repo root (1 file) + +**File (modify):** `build-all-versions-install-deps.yaml` (the *commented-out* template at repo root, not the active files under `.crow/`). + +Keep the example in sync with the active workflows so it remains a faithful template. +Every line in this file is prefixed with `# ` (block-comment); the substitutions still happen inside the comments. + +- [ ] **Step 9.1: Edit image tag (inside comment)** + +Use `Edit`: + +``` +old_string: # image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} +new_string: # image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} +``` + +- [ ] **Step 9.2: Substitute R path inside commented commands** + +Use `Edit` with `replace_all: true`: + +``` +old_string: R -q -e +new_string: /opt/R/${R_VERSION}/bin/R -q -e +``` + +(Three `R -q -e` lines are inside the commented commands block.) + +- [ ] **Step 9.3: Validate** + +```bash +grep -nE '(^|[^/])R(script)? ' build-all-versions-install-deps.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:# *#' +``` + +Expected: no output (filters out lines that are nested-commented). + +- [ ] **Step 9.4: Commit** + +```bash +git add build-all-versions-install-deps.yaml +git commit -m "refactor: keep commented build-all-versions-install-deps example in sync + +Mirror the multi-R-version image refactor in the commented-out +template so the example remains faithful to active .crow workflows." +``` + +--- + +## Task 10: Final repo-wide validation + +No code edits — just a comprehensive grep sweep across every file the previous tasks touched. +Any failures discovered here mean a previous task missed an edit; go back and fix the offending file, commit separately, then re-run this validation. + +- [ ] **Step 10.1: Verify no bare R/Rscript invocations remain in any workflow** + +Run: + +```bash +grep -rnE '(^|[^/])R(script)? ' .crow/ Justfile build-all-versions-install-deps.yaml | grep -v '/opt/R/' | grep -vE '^[^:]*:[0-9]+:\s*#' +``` + +Expected: no output. + +If output appears, inspect each match. False positives are possible only for content unrelated to R invocation (e.g., a yaml key starting with "R" or text inside an R code string). +True positives are missed substitutions — fix and recommit. + +- [ ] **Step 10.2: Verify no old-style image tags remain** + +Run: + +```bash +grep -rnE 'build-env-[a-z]+:[^[:space:]]*-[0-9]+\.[0-9]' .crow/ Justfile build-all-versions-install-deps.yaml +``` + +Expected: no output. + +- [ ] **Step 10.3: Verify every pattern-1 workflow declares `R_VERSION`** + +Pattern-1 workflows hard-code the image tag and therefore need an explicit `R_VERSION:` env var. +Pattern-2 workflows (the four `build-all-versions-*` files) receive `R_VERSION` from `--var` and should NOT have it in their `environment:` block. + +Count files in each group: + +```bash +# Pattern-1 files that MUST have R_VERSION: in their environment block. +# Total expected: 14 (process-updates) + 14 (weekly-rebuild) + 16 (weekly-audit) +# + 14 (update-package-index) + 1 (archive-missed-packages) = 59 +ls .crow/process-updates-*.yaml .crow/weekly-rebuild-missing-*.yaml .crow/weekly-audit-missing-*.yaml .crow/update-package-index-*.yaml .crow/archive-missed-packages.yaml | wc -l +# Expected: 59 + +grep -lE '^\s+R_VERSION:' .crow/process-updates-*.yaml .crow/weekly-rebuild-missing-*.yaml .crow/weekly-audit-missing-*.yaml .crow/update-package-index-*.yaml .crow/archive-missed-packages.yaml | wc -l +# Expected: 59 + +# Pattern-2 files that MUST NOT have a top-level R_VERSION: env var +grep -nE '^\s+R_VERSION:' .crow/build-all-versions-*.yaml +# Expected: no output +``` + +- [ ] **Step 10.4: Spot-check one file end-to-end** + +Read `.crow/process-updates-alpine-322-amd64.yaml` and visually confirm: + +1. `image: reg.devxy.io/rpkgs/build-env-alpine:3.22` (no `-4.5`) +2. `R_VERSION: 4.5.3` appears in the `environment:` block +3. Every `R …` line in `commands:` is prefixed by `/opt/R/${R_VERSION}/bin/` + +Repeat for `.crow/update-package-index-redhat-10-amd64.yaml` (the one with the old `noble-4.5` tag). +Repeat for `.crow/build-r-minor-sensitive-packages.yaml` (the lowercase-var, docker.io-registry file). + +- [ ] **Step 10.5: Verify smoke-test list is ready** + +Confirm the following workflows exist and are unchanged in shape; they are the targets for post-merge smoke runs (one per workflow type, per spec §Validation): + +```bash +ls -1 \ + .crow/process-updates-alpine-322-amd64.yaml \ + .crow/weekly-rebuild-missing-redhat-9-amd64.yaml \ + .crow/weekly-audit-missing-ubuntu-2204-amd64.yaml \ + .crow/update-package-index-redhat-10-amd64.yaml \ + .crow/archive-missed-packages.yaml \ + .crow/build-all-versions-amd64.yaml \ + .crow/build-all-versions-install-deps-amd64.yaml \ + .crow/build-r-minor-sensitive-packages.yaml +``` + +Expected: all eight files listed, no errors. +Smoke runs are out of scope for this plan (they happen after the PR merges). + +- [ ] **Step 10.6: Final no-op commit only if any fix-up was needed** + +If steps 10.1–10.5 surfaced any issues that required edits, commit those fixes here: + +```bash +git add -A +git commit -m "fix(ci): catch missed substitutions from multi-R-version refactor" +``` + +If everything was clean, no commit is needed for this step. + +--- + +## Notes for the executing engineer + +- **No tests to run.** This refactor changes CI workflow files; correctness is validated by `grep` checks at each task boundary and by smoke runs after merge. +- **Order doesn't matter between tasks 1–7.** Each task is independent and self-committing. Tasks 8–9 (Justfile, commented file) are also independent. Task 10 is final and depends on all others being complete. +- **If `Edit` complains that an `old_string` isn't unique:** add more surrounding context to disambiguate. The Edit tool requires the `old_string` to match exactly one location in the file. +- **`replace_all` safety:** the tokens we use it on (`R -q -e`, `R CMD INSTALL`, etc.) were verified by grep to appear only inside workflow command lines, never inside YAML structure or unrelated content. If a future workflow violates that assumption, switch to per-line targeted edits. +- **Don't squash commits.** Each task produces a logically coherent commit; keeping them separate makes `git bisect` useful if a smoke run regresses. -- 2.54.0 From 6403ad602fef03eb77a0cf6ef056986488b9a23b Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:27:35 +0200 Subject: [PATCH 03/16] refactor(ci): use multi-R-version images in build-all-versions workflows Drop -${R_VERSION} from the image tag and invoke R/Rscript via the explicit /opt/R/${R_VERSION}/bin/ path. --- .crow/build-all-versions-amd64.yaml | 6 +++--- .crow/build-all-versions-arm64.yaml | 6 +++--- .crow/build-all-versions-install-deps-amd64.yaml | 6 +++--- .crow/build-all-versions-install-deps-arm64.yaml | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.crow/build-all-versions-amd64.yaml b/.crow/build-all-versions-amd64.yaml index 4c10387..e5590fb 100644 --- a/.crow/build-all-versions-amd64.yaml +++ b/.crow/build-all-versions-amd64.yaml @@ -39,7 +39,7 @@ depends_on: steps: - name: 'Build binaries' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} + image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} pull: true environment: RED_HAT_DEV_PW: @@ -69,9 +69,9 @@ steps: # Windows-only: 'RInno', 'KeyboardSimulator', 'R2PPT', 'RWinEdt', 'blatr', 'excel.link', 'spectrino', 'taskscheduleR', 'MDSGUI', 'BiplotGUI', 'R2wd', 'rFUSION', 'MediaNews', 'rFUSION', 'MediaNews' # pkgs = readRDS('/mnt/cache/pkgs_amd64.rds'); - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 + - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- /opt/R/${R_VERSION}/bin/Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 # archive missed packages - - R -q -e "bincraft::process_unarchived_pkgs(paste(Sys.getenv('OS'), Sys.getenv('OS_VERSION')), Sys.getenv('ARCH'), workers = $NCPUS)" + - /opt/R/${R_VERSION}/bin/R -q -e "bincraft::process_unarchived_pkgs(paste(Sys.getenv('OS'), Sys.getenv('OS_VERSION')), Sys.getenv('ARCH'), workers = $NCPUS)" backend_options: docker: resources: diff --git a/.crow/build-all-versions-arm64.yaml b/.crow/build-all-versions-arm64.yaml index eb1a5c2..2829bc9 100644 --- a/.crow/build-all-versions-arm64.yaml +++ b/.crow/build-all-versions-arm64.yaml @@ -54,7 +54,7 @@ depends_on: steps: - name: 'Build binaries' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} + image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} pull: true environment: RED_HAT_DEV_PW: @@ -82,9 +82,9 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 + - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- /opt/R/${R_VERSION}/bin/Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 # archive missed packages - - R -q -e "bincraft::process_unarchived_pkgs(paste(Sys.getenv('OS'), Sys.getenv('OS_VERSION')), Sys.getenv('ARCH'), workers = $NCPUS)" + - /opt/R/${R_VERSION}/bin/R -q -e "bincraft::process_unarchived_pkgs(paste(Sys.getenv('OS'), Sys.getenv('OS_VERSION')), Sys.getenv('ARCH'), workers = $NCPUS)" backend_options: docker: resources: diff --git a/.crow/build-all-versions-install-deps-amd64.yaml b/.crow/build-all-versions-install-deps-amd64.yaml index c41789f..f3d61f0 100644 --- a/.crow/build-all-versions-install-deps-amd64.yaml +++ b/.crow/build-all-versions-install-deps-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Install deps and bincraft' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} + image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} pull: true environment: REPO_RO_TOKEN: @@ -34,8 +34,8 @@ steps: - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft - - R -q -e 'pak::sysreqs_db_update(); pak::local_install("/tmp/bincraft"); pak::pak(c("RPostgres", "s3fs", "data.table", "future")); packageVersion("bincraft")' - - R -q -e "source('local/packages-to-build.R'); saveRDS(pkgs, '/mnt/cache/packages/pkgs_to_build.rds'); sprintf('Precomputed %s package versions to build', nrow(pkgs))" + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::sysreqs_db_update(); pak::local_install("/tmp/bincraft"); pak::pak(c("RPostgres", "s3fs", "data.table", "future")); packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e "source('local/packages-to-build.R'); saveRDS(pkgs, '/mnt/cache/packages/pkgs_to_build.rds'); sprintf('Precomputed %s package versions to build', nrow(pkgs))" backend_options: docker: resources: diff --git a/.crow/build-all-versions-install-deps-arm64.yaml b/.crow/build-all-versions-install-deps-arm64.yaml index dbd1df3..e6e65ec 100644 --- a/.crow/build-all-versions-install-deps-arm64.yaml +++ b/.crow/build-all-versions-install-deps-arm64.yaml @@ -9,7 +9,7 @@ labels: steps: - name: 'Install deps and bincraft' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} + image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} pull: true environment: REPO_RO_TOKEN: @@ -33,8 +33,8 @@ steps: - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft - - R -q -e 'pak::sysreqs_db_update(); pak::local_install("/tmp/bincraft"); pak::pak(c("RPostgres", "s3fs", "data.table", "future")); packageVersion("bincraft")' - - R -q -e "source('local/packages-to-build.R'); saveRDS(pkgs, '/mnt/cache/packages/pkgs_to_build.rds'); sprintf('Precomputed %s package versions to build', nrow(pkgs))" + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::sysreqs_db_update(); pak::local_install("/tmp/bincraft"); pak::pak(c("RPostgres", "s3fs", "data.table", "future")); packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e "source('local/packages-to-build.R'); saveRDS(pkgs, '/mnt/cache/packages/pkgs_to_build.rds'); sprintf('Precomputed %s package versions to build', nrow(pkgs))" backend_options: docker: resources: -- 2.54.0 From 5e50f2a6a0d0a03f29313c2656e2b904635ca17a Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:31:02 +0200 Subject: [PATCH 04/16] docs(ci): correct R_VERSION header annotation to full patch Header comments described R_VERSION as (4.5) but the new multi-R-version images only ship full-patch paths (/opt/R/4.5.3/bin/R), so the minor-form annotation is misleading. The example pipeline-create lines below the annotation already use 4.5.3 correctly. --- .crow/build-all-versions-amd64.yaml | 2 +- .crow/build-all-versions-arm64.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.crow/build-all-versions-amd64.yaml b/.crow/build-all-versions-amd64.yaml index e5590fb..2766243 100644 --- a/.crow/build-all-versions-amd64.yaml +++ b/.crow/build-all-versions-amd64.yaml @@ -2,7 +2,7 @@ # ARCH (amd64) # OS (alpine) # OS_VERSION (3.22) -# R_VERSION (4.5) +# R_VERSION (4.5.3) # crow pipeline create --var ARCH=arm64 --var OS=alpine --var OS_VERSION=3.23 --var R_VERSION=4.5.3 --var task=build-all-arm64 --branch=main --log-level=info 5 # crow pipeline create --var ARCH=arm64 --var OS=redhat --var OS_VERSION=10 --var R_VERSION=4.5.3 --var task=build-all-arm64 --branch=main --log-level=info 5 # crow pipeline create --var ARCH=amd64 --var OS=redhat --var OS_VERSION=10 --var R_VERSION=4.5.3 --var task=build-all-amd64 --branch=main --log-level=info 5 diff --git a/.crow/build-all-versions-arm64.yaml b/.crow/build-all-versions-arm64.yaml index 2829bc9..8de103d 100644 --- a/.crow/build-all-versions-arm64.yaml +++ b/.crow/build-all-versions-arm64.yaml @@ -2,7 +2,7 @@ # ARCH (amd64) # OS (alpine) # OS_VERSION (3.22) -# R_VERSION (4.5) +# R_VERSION (4.5.3) # echo "c('RInno','KeyboardSimulator','R2PPT','RWinEdt','blatr','excel.link','spectrino','taskscheduleR','MDSGUI','BiplotGUI','R2wd','rFUSION','MediaNews','doBy','IDPmisc','frailtypack','afex','FrF2','DoE.base','agricolae','doFuture','fscaret','PHYLOGR','seewave','pls','relaimpo','geepack','gggenes','NPCirc','repmis','PNDSIBGE','lidR','poismf','neonstore','MachineShop','mvst','MacBehaviour','mcmcderive','RGIFT','KnowBR','netmeta','spdep','sf','Rfast','compareGroups','ff','GsymPoint','RcppDynProg','comtradr','RcppDynProg','FD','PearsonDS','DCluster','gRc','mixlm','geospt','fdth','ffmanova','fiery','ffscrapr','cold','fiery','RcmdrPlugin.DoE','RcmdrPlugin.NMBU')" | base64 # crow pipeline create --var ARCH=arm64 --var OS=alpine --var OS_VERSION=3.22 --var R_VERSION=4.5 --var task=build-all-arm64 --var K8S_INSTANCE_TYPE=cax41 --branch=main --var SKIP_PKGS=YygnUklubm8nLCdLZXlib2FyZFNpbXVsYXRvcicsJ1IyUFBUJywnUldpbkVkdCcsJ2JsYXRyJywnZXhjZWwubGluaycsJ3NwZWN0cmlubycsJ3Rhc2tzY2hlZHVsZVInLCdNRFNHVUknLCdCaXBsb3RHVUknLCdSMndkJywnckZVU0lPTicsJ01lZGlhTmV3cycsJ2RvQnknLCdJRFBtaXNjJywnZnJhaWx0eXBhY2snLCdhZmV4JywnRnJGMicsJ0RvRS5iYXNlJywnYWdyaWNvbGFlJywnZG9GdXR1cmUnLCdmc2NhcmV0JywnUEhZTE9HUicsJ3NlZXdhdmUnLCdwbHMnLCdyZWxhaW1wbycsJ2dlZXBhY2snLCdnZ2dlbmVzJywnTlBDaXJjJywncmVwbWlzJywnUE5EU0lCR0UnLCdsaWRSJywncG9pc21mJywnbmVvbnN0b3JlJywnTWFjaGluZVNob3AnLCdtdnN0JywnTWFjQmVoYXZpb3VyJywnbWNtY2Rlcml2ZScsJ1JHSUZUJywnS25vd0JSJywnbmV0bWV0YScsJ3NwZGVwJywnc2YnLCdSZmFzdCcsJ2NvbXBhcmVHcm91cHMnLCdmZicsJ0dzeW1Qb2ludCcsJ1JjcHBEeW5Qcm9nJywnY29tdHJhZHInLCdSY3BwRHluUHJvZycsJ0ZEJywnUGVhcnNvbkRTJywnRENsdXN0ZXInLCdnUmMnLCdtaXhsbScsJ2dlb3NwdCcsJ2ZkdGgnLCdmZm1hbm92YScsJ2ZpZXJ5JywnZmZzY3JhcHInLCdjb2xkJywnZmllcnknLCdSY21kclBsdWdpbi5Eb0UnLCdSY21kclBsdWdpbi5OTUJVJykK --log-level=info 7 # crow pipeline create --var ARCH=arm64 --var OS=alpine --var OS_VERSION=3.23 --var R_VERSION=4.5 --var task=build-all-arm64 --var K8S_INSTANCE_TYPE=cax41 --branch=main --log-level=info 5 -- 2.54.0 From 71893f6f19f73cac1cff320b445b3f9cbf0eddd8 Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:35:32 +0200 Subject: [PATCH 05/16] refactor(ci): use multi-R-version images in process-updates workflows Drop the R-version suffix from each image tag, add an explicit R_VERSION env var per file, and invoke R via /opt/R/${R_VERSION}/bin/R at every call site. Also aligns ubuntu-2404 process-updates from R 4.4 to R 4.4.3, matching the audit and rebuild counterparts. --- .crow/process-updates-alpine-322-amd64.yaml | 11 ++++++----- .crow/process-updates-alpine-322-arm64.yaml | 11 ++++++----- .crow/process-updates-alpine-323-amd64.yaml | 11 ++++++----- .crow/process-updates-alpine-323-arm64.yaml | 11 ++++++----- .crow/process-updates-redhat-10-amd64.yaml | 11 ++++++----- .crow/process-updates-redhat-10-arm64.yaml | 11 ++++++----- .crow/process-updates-redhat-8-amd64.yaml | 11 ++++++----- .crow/process-updates-redhat-8-arm64.yaml | 11 ++++++----- .crow/process-updates-redhat-9-amd64.yaml | 11 ++++++----- .crow/process-updates-redhat-9-arm64.yaml | 11 ++++++----- .crow/process-updates-ubuntu-2204-amd64.yaml | 11 ++++++----- .crow/process-updates-ubuntu-2204-arm64.yaml | 11 ++++++----- .crow/process-updates-ubuntu-2404-amd64.yaml | 11 ++++++----- .crow/process-updates-ubuntu-2404-arm64.yaml | 11 ++++++----- 14 files changed, 84 insertions(+), 70 deletions(-) diff --git a/.crow/process-updates-alpine-322-amd64.yaml b/.crow/process-updates-alpine-322-amd64.yaml index ed39ccc..cccbf0b 100644 --- a/.crow/process-updates-alpine-322-amd64.yaml +++ b/.crow/process-updates-alpine-322-amd64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-322 ARCH: amd64 @@ -51,12 +52,12 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-322', process_updated = TRUE, process_new = FALSE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-322', process_updated = TRUE, process_new = FALSE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-alpine-322-arm64.yaml b/.crow/process-updates-alpine-322-arm64.yaml index 57d3891..40048cb 100644 --- a/.crow/process-updates-alpine-322-arm64.yaml +++ b/.crow/process-updates-alpine-322-arm64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-322 ARCH: arm64 @@ -50,9 +51,9 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-322', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-322', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' diff --git a/.crow/process-updates-alpine-323-amd64.yaml b/.crow/process-updates-alpine-323-amd64.yaml index 2855545..8de26d6 100644 --- a/.crow/process-updates-alpine-323-amd64.yaml +++ b/.crow/process-updates-alpine-323-amd64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-323 ARCH: amd64 @@ -51,12 +52,12 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-323', process_updated = TRUE, process_new = FALSE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-323', process_updated = TRUE, process_new = FALSE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-alpine-323-arm64.yaml b/.crow/process-updates-alpine-323-arm64.yaml index 7c0debe..41f6896 100644 --- a/.crow/process-updates-alpine-323-arm64.yaml +++ b/.crow/process-updates-alpine-323-arm64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-323 ARCH: arm64 @@ -50,11 +51,11 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-323', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'alpine-323', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' diff --git a/.crow/process-updates-redhat-10-amd64.yaml b/.crow/process-updates-redhat-10-amd64.yaml index 551895e..7746cc6 100644 --- a/.crow/process-updates-redhat-10-amd64.yaml +++ b/.crow/process-updates-redhat-10-amd64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-redhat:10-4.5.3 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-10 ARCH: amd64 @@ -52,13 +53,13 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - $XVFB $XVFB_ARGS -- R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-10', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-10', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-redhat-10-arm64.yaml b/.crow/process-updates-redhat-10-arm64.yaml index 2c72c28..7e65e36 100644 --- a/.crow/process-updates-redhat-10-arm64.yaml +++ b/.crow/process-updates-redhat-10-arm64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-redhat:10-4.5.3 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-10 ARCH: arm64 @@ -50,10 +51,10 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - $XVFB $XVFB_ARGS -- R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-10', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-10', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' diff --git a/.crow/process-updates-redhat-8-amd64.yaml b/.crow/process-updates-redhat-8-amd64.yaml index 9cb929d..0119302 100644 --- a/.crow/process-updates-redhat-8-amd64.yaml +++ b/.crow/process-updates-redhat-8-amd64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-8 ARCH: amd64 @@ -51,12 +52,12 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-8', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "rhel8", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-8', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel8", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-redhat-8-arm64.yaml b/.crow/process-updates-redhat-8-arm64.yaml index ae86e95..28f52ba 100644 --- a/.crow/process-updates-redhat-8-arm64.yaml +++ b/.crow/process-updates-redhat-8-arm64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-8 ARCH: arm64 @@ -50,11 +51,11 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-8', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "rhel8", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-8', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel8", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' diff --git a/.crow/process-updates-redhat-9-amd64.yaml b/.crow/process-updates-redhat-9-amd64.yaml index 520a7e0..961658f 100644 --- a/.crow/process-updates-redhat-9-amd64.yaml +++ b/.crow/process-updates-redhat-9-amd64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-9 ARCH: amd64 @@ -52,12 +53,12 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-9', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-9', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-redhat-9-arm64.yaml b/.crow/process-updates-redhat-9-arm64.yaml index 84268eb..fb90a46 100644 --- a/.crow/process-updates-redhat-9-arm64.yaml +++ b/.crow/process-updates-redhat-9-arm64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-9 ARCH: arm64 @@ -50,11 +51,11 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-9', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-9', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' diff --git a/.crow/process-updates-ubuntu-2204-amd64.yaml b/.crow/process-updates-ubuntu-2204-amd64.yaml index aeed362..5f81b1a 100644 --- a/.crow/process-updates-ubuntu-2204-amd64.yaml +++ b/.crow/process-updates-ubuntu-2204-amd64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2204 ARCH: amd64 @@ -52,12 +53,12 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2204', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2204', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-ubuntu-2204-arm64.yaml b/.crow/process-updates-ubuntu-2204-arm64.yaml index c25fbb9..479d299 100644 --- a/.crow/process-updates-ubuntu-2204-arm64.yaml +++ b/.crow/process-updates-ubuntu-2204-arm64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2204 ARCH: arm64 @@ -50,11 +51,11 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2204', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2204', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' diff --git a/.crow/process-updates-ubuntu-2404-amd64.yaml b/.crow/process-updates-ubuntu-2404-amd64.yaml index 268db50..9250cad 100644 --- a/.crow/process-updates-ubuntu-2404-amd64.yaml +++ b/.crow/process-updates-ubuntu-2404-amd64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2404 ARCH: amd64 @@ -51,12 +52,12 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2404', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2404', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-ubuntu-2404-arm64.yaml b/.crow/process-updates-ubuntu-2404-arm64.yaml index b926c19..1ad0fc1 100644 --- a/.crow/process-updates-ubuntu-2404-arm64.yaml +++ b/.crow/process-updates-ubuntu-2404-arm64.yaml @@ -13,7 +13,7 @@ labels: steps: - name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: RED_HAT_DEV_PW: @@ -40,6 +40,7 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2404 ARCH: arm64 @@ -50,11 +51,11 @@ steps: commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-r-pkg-binaries /mnt/cache/R-pkgs/00LOCK-bincraft /mnt/cache/R-pkgs/00LOCK-pak /mnt/cache/pkgcache/R/pkgcache /mnt/cache/pkgcache/R/pkgcache /mnt/cache/R-pkgs/pkgcache /mnt/cache/R-pkgs/00LOCK-pak/mnt/cache/R-pkgs/00LOCK-RPostgres /mnt/cache/R-pkgs/bincraft - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - - xvfb-run R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2404', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - R -q -e 'library(bincraft); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'ubuntu-2404', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' -- 2.54.0 From adfb2d4a8765c3c354157baf211bd7f1e8de3745 Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:42:09 +0200 Subject: [PATCH 06/16] refactor(ci): use multi-R-version images in weekly-rebuild-missing workflows Drop the R-version suffix from each image tag, add an explicit R_VERSION env var per file, and invoke R via /opt/R/${R_VERSION}/bin/R at every call site. --- .crow/weekly-rebuild-missing-alpine-322-amd64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-alpine-322-arm64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-alpine-323-amd64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-alpine-323-arm64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-redhat-10-amd64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-redhat-10-arm64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-redhat-8-amd64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-redhat-8-arm64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-redhat-9-amd64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-redhat-9-arm64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-ubuntu-2204-arm64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-ubuntu-2404-amd64.yaml | 13 +++++++------ .crow/weekly-rebuild-missing-ubuntu-2404-arm64.yaml | 13 +++++++------ 14 files changed, 98 insertions(+), 84 deletions(-) diff --git a/.crow/weekly-rebuild-missing-alpine-322-amd64.yaml b/.crow/weekly-rebuild-missing-alpine-322-amd64.yaml index 86f0680..18843a9 100644 --- a/.crow/weekly-rebuild-missing-alpine-322-amd64.yaml +++ b/.crow/weekly-rebuild-missing-alpine-322-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-322 ARCH: amd64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-alpine-322-arm64.yaml b/.crow/weekly-rebuild-missing-alpine-322-arm64.yaml index c985d1e..6bd7a9b 100644 --- a/.crow/weekly-rebuild-missing-alpine-322-arm64.yaml +++ b/.crow/weekly-rebuild-missing-alpine-322-arm64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-322 ARCH: arm64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-alpine-323-amd64.yaml b/.crow/weekly-rebuild-missing-alpine-323-amd64.yaml index 1b40307..a597143 100644 --- a/.crow/weekly-rebuild-missing-alpine-323-amd64.yaml +++ b/.crow/weekly-rebuild-missing-alpine-323-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-323 ARCH: amd64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-alpine-323-arm64.yaml b/.crow/weekly-rebuild-missing-alpine-323-arm64.yaml index b76b3c8..47a073a 100644 --- a/.crow/weekly-rebuild-missing-alpine-323-arm64.yaml +++ b/.crow/weekly-rebuild-missing-alpine-323-arm64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: alpine-323 ARCH: arm64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-redhat-10-amd64.yaml b/.crow/weekly-rebuild-missing-redhat-10-amd64.yaml index cfe3d01..4335e7f 100644 --- a/.crow/weekly-rebuild-missing-redhat-10-amd64.yaml +++ b/.crow/weekly-rebuild-missing-redhat-10-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:10-4.5.3 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-10 ARCH: amd64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-redhat-10-arm64.yaml b/.crow/weekly-rebuild-missing-redhat-10-arm64.yaml index 89d7c45..e0ee2ee 100644 --- a/.crow/weekly-rebuild-missing-redhat-10-arm64.yaml +++ b/.crow/weekly-rebuild-missing-redhat-10-arm64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:10-4.5.3 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-10 ARCH: arm64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-redhat-8-amd64.yaml b/.crow/weekly-rebuild-missing-redhat-8-amd64.yaml index 62d11b3..68bff14 100644 --- a/.crow/weekly-rebuild-missing-redhat-8-amd64.yaml +++ b/.crow/weekly-rebuild-missing-redhat-8-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-8 ARCH: amd64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-redhat-8-arm64.yaml b/.crow/weekly-rebuild-missing-redhat-8-arm64.yaml index 2194fee..f7fe7e9 100644 --- a/.crow/weekly-rebuild-missing-redhat-8-arm64.yaml +++ b/.crow/weekly-rebuild-missing-redhat-8-arm64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-8 ARCH: arm64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-redhat-9-amd64.yaml b/.crow/weekly-rebuild-missing-redhat-9-amd64.yaml index 4c7f404..fbdfcc3 100644 --- a/.crow/weekly-rebuild-missing-redhat-9-amd64.yaml +++ b/.crow/weekly-rebuild-missing-redhat-9-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-9 ARCH: amd64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-redhat-9-arm64.yaml b/.crow/weekly-rebuild-missing-redhat-9-arm64.yaml index 64cf358..92fd2fa 100644 --- a/.crow/weekly-rebuild-missing-redhat-9-arm64.yaml +++ b/.crow/weekly-rebuild-missing-redhat-9-arm64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: redhat-9 ARCH: arm64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml b/.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml index 94cdc34..c7bc6f7 100644 --- a/.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml +++ b/.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2204 ARCH: amd64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-ubuntu-2204-arm64.yaml b/.crow/weekly-rebuild-missing-ubuntu-2204-arm64.yaml index c8305a6..5d958d5 100644 --- a/.crow/weekly-rebuild-missing-ubuntu-2204-arm64.yaml +++ b/.crow/weekly-rebuild-missing-ubuntu-2204-arm64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2204 ARCH: arm64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-ubuntu-2404-amd64.yaml b/.crow/weekly-rebuild-missing-ubuntu-2404-amd64.yaml index 7da31a0..b508b85 100644 --- a/.crow/weekly-rebuild-missing-ubuntu-2404-amd64.yaml +++ b/.crow/weekly-rebuild-missing-ubuntu-2404-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2404 ARCH: amd64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: diff --git a/.crow/weekly-rebuild-missing-ubuntu-2404-arm64.yaml b/.crow/weekly-rebuild-missing-ubuntu-2404-arm64.yaml index 5bd25c7..063fa3c 100644 --- a/.crow/weekly-rebuild-missing-ubuntu-2404-arm64.yaml +++ b/.crow/weekly-rebuild-missing-ubuntu-2404-arm64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: RED_HAT_DEV_PW: @@ -30,6 +30,7 @@ steps: GIT_USER: pat-s R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 CCACHE_DIR: /mnt/cache/ccache PLATFORM: ubuntu-2404 ARCH: arm64 @@ -38,12 +39,12 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - R -q -e 'pak::pak("httr2")' - - R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("httr2")' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/fetch-rebuild-packages-from-issue.R")' + - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pkgs <- readLines('/tmp/rebuild_pkgs.txt'); if (length(pkgs) == 0) { cat('Nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s - %s\n', x, conditionMessage(e)))) }" 2>&1 backend_options: kubernetes: resources: -- 2.54.0 From 816b99cfaf2ac3289397bb964629c9141b423dad Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:48:35 +0200 Subject: [PATCH 07/16] refactor(ci): use multi-R-version images in weekly-audit-missing workflows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the R-version suffix from each image tag, add an explicit R_VERSION env var per file, and invoke R via /opt/R/${R_VERSION}/bin/R at every call site. Also fixes the alpine-322 audit image, which was previously pointing at alpine:3.23 instead of alpine:3.22. The alpine-321 audits stay on alpine:3.23 since no 3.21 image exists in the new scheme — they only query S3/CRAN, so the container OS does not affect correctness. --- .crow/weekly-audit-missing-alpine-321-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-alpine-321-arm64.yaml | 7 ++++--- .crow/weekly-audit-missing-alpine-322-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-alpine-322-arm64.yaml | 7 ++++--- .crow/weekly-audit-missing-alpine-323-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-alpine-323-arm64.yaml | 7 ++++--- .crow/weekly-audit-missing-redhat-10-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-redhat-10-arm64.yaml | 7 ++++--- .crow/weekly-audit-missing-redhat-8-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-redhat-8-arm64.yaml | 7 ++++--- .crow/weekly-audit-missing-redhat-9-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-redhat-9-arm64.yaml | 7 ++++--- .crow/weekly-audit-missing-ubuntu-2204-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-ubuntu-2204-arm64.yaml | 7 ++++--- .crow/weekly-audit-missing-ubuntu-2404-amd64.yaml | 7 ++++--- .crow/weekly-audit-missing-ubuntu-2404-arm64.yaml | 7 ++++--- 16 files changed, 64 insertions(+), 48 deletions(-) diff --git a/.crow/weekly-audit-missing-alpine-321-amd64.yaml b/.crow/weekly-audit-missing-alpine-321-amd64.yaml index 77b29a4..6a6ac56 100644 --- a/.crow/weekly-audit-missing-alpine-321-amd64.yaml +++ b/.crow/weekly-audit-missing-alpine-321-amd64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: alpine-321 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-alpine-321-arm64.yaml b/.crow/weekly-audit-missing-alpine-321-arm64.yaml index 80ca905..13a9baf 100644 --- a/.crow/weekly-audit-missing-alpine-321-arm64.yaml +++ b/.crow/weekly-audit-missing-alpine-321-arm64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: alpine-321 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-alpine-322-amd64.yaml b/.crow/weekly-audit-missing-alpine-322-amd64.yaml index b3f9ba8..d1255ea 100644 --- a/.crow/weekly-audit-missing-alpine-322-amd64.yaml +++ b/.crow/weekly-audit-missing-alpine-322-amd64.yaml @@ -7,7 +7,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: B2_S3_ACCESS_KEY: @@ -26,12 +26,13 @@ steps: PLATFORM: alpine-322 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-alpine-322-arm64.yaml b/.crow/weekly-audit-missing-alpine-322-arm64.yaml index 1815163..b23eaee 100644 --- a/.crow/weekly-audit-missing-alpine-322-arm64.yaml +++ b/.crow/weekly-audit-missing-alpine-322-arm64.yaml @@ -7,7 +7,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: B2_S3_ACCESS_KEY: @@ -25,12 +25,13 @@ steps: PLATFORM: alpine-322 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-alpine-323-amd64.yaml b/.crow/weekly-audit-missing-alpine-323-amd64.yaml index 3ef9715..8b0c80b 100644 --- a/.crow/weekly-audit-missing-alpine-323-amd64.yaml +++ b/.crow/weekly-audit-missing-alpine-323-amd64.yaml @@ -7,7 +7,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: B2_S3_ACCESS_KEY: @@ -26,12 +26,13 @@ steps: PLATFORM: alpine-323 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-alpine-323-arm64.yaml b/.crow/weekly-audit-missing-alpine-323-arm64.yaml index f3433ea..9a7e344 100644 --- a/.crow/weekly-audit-missing-alpine-323-arm64.yaml +++ b/.crow/weekly-audit-missing-alpine-323-arm64.yaml @@ -7,7 +7,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: B2_S3_ACCESS_KEY: @@ -26,12 +26,13 @@ steps: PLATFORM: alpine-323 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-redhat-10-amd64.yaml b/.crow/weekly-audit-missing-redhat-10-amd64.yaml index be0adce..a54dc5c 100644 --- a/.crow/weekly-audit-missing-redhat-10-amd64.yaml +++ b/.crow/weekly-audit-missing-redhat-10-amd64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:10-4.5.3 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: B2_S3_ACCESS_KEY: @@ -26,12 +26,13 @@ steps: PLATFORM: redhat-10 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-redhat-10-arm64.yaml b/.crow/weekly-audit-missing-redhat-10-arm64.yaml index fcfcce0..1cdb8f5 100644 --- a/.crow/weekly-audit-missing-redhat-10-arm64.yaml +++ b/.crow/weekly-audit-missing-redhat-10-arm64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:10-4.5.3 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: B2_S3_ACCESS_KEY: @@ -26,12 +26,13 @@ steps: PLATFORM: redhat-10 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-redhat-8-amd64.yaml b/.crow/weekly-audit-missing-redhat-8-amd64.yaml index 31e5bd3..96dec94 100644 --- a/.crow/weekly-audit-missing-redhat-8-amd64.yaml +++ b/.crow/weekly-audit-missing-redhat-8-amd64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: redhat-8 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-redhat-8-arm64.yaml b/.crow/weekly-audit-missing-redhat-8-arm64.yaml index c947e6c..c8009aa 100644 --- a/.crow/weekly-audit-missing-redhat-8-arm64.yaml +++ b/.crow/weekly-audit-missing-redhat-8-arm64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: redhat-8 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-redhat-9-amd64.yaml b/.crow/weekly-audit-missing-redhat-9-amd64.yaml index 9715204..c32ab75 100644 --- a/.crow/weekly-audit-missing-redhat-9-amd64.yaml +++ b/.crow/weekly-audit-missing-redhat-9-amd64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: redhat-9 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-redhat-9-arm64.yaml b/.crow/weekly-audit-missing-redhat-9-arm64.yaml index 3ebb5a2..a9de8c2 100644 --- a/.crow/weekly-audit-missing-redhat-9-arm64.yaml +++ b/.crow/weekly-audit-missing-redhat-9-arm64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: redhat-9 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml b/.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml index 66af6b4..9dc87fc 100644 --- a/.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml +++ b/.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: ubuntu-2204 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-ubuntu-2204-arm64.yaml b/.crow/weekly-audit-missing-ubuntu-2204-arm64.yaml index e1de5f5..da3d35b 100644 --- a/.crow/weekly-audit-missing-ubuntu-2204-arm64.yaml +++ b/.crow/weekly-audit-missing-ubuntu-2204-arm64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: ubuntu-2204 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-ubuntu-2404-amd64.yaml b/.crow/weekly-audit-missing-ubuntu-2404-amd64.yaml index 6ee080b..f9f5460 100644 --- a/.crow/weekly-audit-missing-ubuntu-2404-amd64.yaml +++ b/.crow/weekly-audit-missing-ubuntu-2404-amd64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: ubuntu-2404 ARCH: amd64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: diff --git a/.crow/weekly-audit-missing-ubuntu-2404-arm64.yaml b/.crow/weekly-audit-missing-ubuntu-2404-arm64.yaml index 9c7e093..f3aa0bb 100644 --- a/.crow/weekly-audit-missing-ubuntu-2404-arm64.yaml +++ b/.crow/weekly-audit-missing-ubuntu-2404-arm64.yaml @@ -8,7 +8,7 @@ skip_clone: true steps: - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: B2_S3_ACCESS_KEY: @@ -27,12 +27,13 @@ steps: PLATFORM: ubuntu-2404 ARCH: arm64 R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'source("local/weekly-missing-binaries-audit.R")' backend_options: kubernetes: resources: -- 2.54.0 From 6f1c421434e07a9f42e6f5d79d2aa4cf045201b7 Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:53:50 +0200 Subject: [PATCH 08/16] refactor(ci): use multi-R-version images in update-package-index workflows Drop the R-version suffix from each image tag, add an explicit R_VERSION env var per file, and invoke R via /opt/R/${R_VERSION}/bin/R at every call site. Also repoints every update-package-index workflow at the image that matches its own platform (was previously pinned to build-env-ubuntu:noble-4.4 / noble-4.5 regardless of platform). --- .crow/update-package-index-alpine-322-amd64.yaml | 13 +++++++------ .crow/update-package-index-alpine-322-arm64.yaml | 13 +++++++------ .crow/update-package-index-alpine-323-amd64.yaml | 13 +++++++------ .crow/update-package-index-alpine-323-arm64.yaml | 13 +++++++------ .crow/update-package-index-redhat-10-amd64.yaml | 13 +++++++------ .crow/update-package-index-redhat-10-arm64.yaml | 13 +++++++------ .crow/update-package-index-redhat-8-amd64.yaml | 11 ++++++----- .crow/update-package-index-redhat-8-arm64.yaml | 13 +++++++------ .crow/update-package-index-redhat-9-amd64.yaml | 13 +++++++------ .crow/update-package-index-redhat-9-arm64.yaml | 13 +++++++------ .crow/update-package-index-ubuntu-2204-amd64.yaml | 13 +++++++------ .crow/update-package-index-ubuntu-2204-arm64.yaml | 13 +++++++------ .crow/update-package-index-ubuntu-2404-amd64.yaml | 13 +++++++------ .crow/update-package-index-ubuntu-2404-arm64.yaml | 13 +++++++------ 14 files changed, 97 insertions(+), 83 deletions(-) diff --git a/.crow/update-package-index-alpine-322-amd64.yaml b/.crow/update-package-index-alpine-322-amd64.yaml index ae408f1..9f868d6 100644 --- a/.crow/update-package-index-alpine-322-amd64.yaml +++ b/.crow/update-package-index-alpine-322-amd64.yaml @@ -9,7 +9,7 @@ skip_clone: true steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: RED_HAT_DEV_PW: @@ -36,17 +36,18 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 # volumes: # - amd64-binaries-r-dep-cache-alpine-322:/mnt/cache commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' # - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-alpine-322-arm64.yaml b/.crow/update-package-index-alpine-322-arm64.yaml index 7d28c2a..ae8d9bd 100644 --- a/.crow/update-package-index-alpine-322-arm64.yaml +++ b/.crow/update-package-index-alpine-322-arm64.yaml @@ -12,7 +12,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-alpine:3.22 pull: true environment: RED_HAT_DEV_PW: @@ -39,17 +39,18 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 # volumes: # - arm64-binaries-r-dep-cache-alpine-322:/mnt/cache commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' # - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine322", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-alpine-323-amd64.yaml b/.crow/update-package-index-alpine-323-amd64.yaml index 77fbf9c..725aa26 100644 --- a/.crow/update-package-index-alpine-323-amd64.yaml +++ b/.crow/update-package-index-alpine-323-amd64.yaml @@ -12,7 +12,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: RED_HAT_DEV_PW: @@ -39,17 +39,18 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 # volumes: # - amd64-binaries-r-dep-cache-alpine-323:/mnt/cache commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' # - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-alpine-323-arm64.yaml b/.crow/update-package-index-alpine-323-arm64.yaml index 471cb4a..ce12e75 100644 --- a/.crow/update-package-index-alpine-323-arm64.yaml +++ b/.crow/update-package-index-alpine-323-arm64.yaml @@ -12,7 +12,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: RED_HAT_DEV_PW: @@ -39,17 +39,18 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 # volumes: # - arm64-binaries-r-dep-cache-alpine-323:/mnt/cache commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' # - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "alpine323", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-redhat-10-amd64.yaml b/.crow/update-package-index-redhat-10-amd64.yaml index b3f7056..3708457 100644 --- a/.crow/update-package-index-redhat-10-amd64.yaml +++ b/.crow/update-package-index-redhat-10-amd64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.5 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel10", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel10", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-redhat-10-arm64.yaml b/.crow/update-package-index-redhat-10-arm64.yaml index 22d6b2a..4550363 100644 --- a/.crow/update-package-index-redhat-10-arm64.yaml +++ b/.crow/update-package-index-redhat-10-arm64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-redhat:10 pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.5.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel10", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel10", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-redhat-8-amd64.yaml b/.crow/update-package-index-redhat-8-amd64.yaml index e3d5840..f0c80e4 100644 --- a/.crow/update-package-index-redhat-8-amd64.yaml +++ b/.crow/update-package-index-redhat-8-amd64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: RED_HAT_DEV_PW: @@ -40,14 +40,15 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel8", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel8", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-redhat-8-arm64.yaml b/.crow/update-package-index-redhat-8-arm64.yaml index 0e3111d..3da6384 100644 --- a/.crow/update-package-index-redhat-8-arm64.yaml +++ b/.crow/update-package-index-redhat-8-arm64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-redhat:8 pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel8",s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel8",s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-redhat-9-amd64.yaml b/.crow/update-package-index-redhat-9-amd64.yaml index 45a45b9..54c2c41 100644 --- a/.crow/update-package-index-redhat-9-amd64.yaml +++ b/.crow/update-package-index-redhat-9-amd64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-redhat-9-arm64.yaml b/.crow/update-package-index-redhat-9-arm64.yaml index 3dabf98..9445b26 100644 --- a/.crow/update-package-index-redhat-9-arm64.yaml +++ b/.crow/update-package-index-redhat-9-arm64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-redhat:9 pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-ubuntu-2204-amd64.yaml b/.crow/update-package-index-ubuntu-2204-amd64.yaml index d2b159a..f1a0828 100644 --- a/.crow/update-package-index-ubuntu-2204-amd64.yaml +++ b/.crow/update-package-index-ubuntu-2204-amd64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY")); warnings()' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY")); warnings()' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-ubuntu-2204-arm64.yaml b/.crow/update-package-index-ubuntu-2204-arm64.yaml index 57a8104..0641817 100644 --- a/.crow/update-package-index-ubuntu-2204-arm64.yaml +++ b/.crow/update-package-index-ubuntu-2204-arm64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "jammy", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-ubuntu-2404-amd64.yaml b/.crow/update-package-index-ubuntu-2404-amd64.yaml index f507c0b..a6f5e18 100644 --- a/.crow/update-package-index-ubuntu-2404-amd64.yaml +++ b/.crow/update-package-index-ubuntu-2404-amd64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: RED_HAT_DEV_PW: @@ -40,17 +40,18 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 # volumes: # - amd64-binaries-r-dep-cache-ubuntu-2404:/mnt/cache commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/update-package-index-ubuntu-2404-arm64.yaml b/.crow/update-package-index-ubuntu-2404-arm64.yaml index e052a66..c11044f 100644 --- a/.crow/update-package-index-ubuntu-2404-arm64.yaml +++ b/.crow/update-package-index-ubuntu-2404-arm64.yaml @@ -13,7 +13,7 @@ depends_on: steps: - name: Upload PACKAGES files - image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 + image: reg.devxy.io/rpkgs/build-env-ubuntu:noble pull: true environment: RED_HAT_DEV_PW: @@ -40,15 +40,16 @@ steps: # set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves R_PKG_CACHE_DIR: /mnt/cache/pkgcache R_LIBS_USER: /mnt/cache/R-pkgs + R_VERSION: 4.4.3 commands: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/packages/* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'pak::pak("pat-s/cranlike@s3")' - - R -q -e 'pak::pak("pat-s/desc@description-from-remote")' - - R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - - R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "noble", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: -- 2.54.0 From b25885bae3edb381cd1e8146ef39ce0711ec1eaf Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:57:21 +0200 Subject: [PATCH 09/16] refactor(ci): use multi-R-version image in archive-missed-packages Drop the R-version suffix from the image tag and invoke R via the explicit /opt/R/${R_VERSION}/bin/R path. The image OS does not matter for this workflow; it stays on alpine:3.23. --- .crow/archive-missed-packages.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.crow/archive-missed-packages.yaml b/.crow/archive-missed-packages.yaml index 1077b7d..e033f88 100644 --- a/.crow/archive-missed-packages.yaml +++ b/.crow/archive-missed-packages.yaml @@ -36,7 +36,7 @@ matrix: steps: - name: 'Archive missed packages' - image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 + image: reg.devxy.io/rpkgs/build-env-alpine:3.23 pull: true environment: RED_HAT_DEV_PW: @@ -53,10 +53,11 @@ steps: from_secret: GITHUB_PAT # normal env vars GIT_USER: pat-s + R_VERSION: 4.5.3 commands: - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git", dependencies = TRUE)' - - R -q -e 'packageVersion("bincraft")' - - R -q -e 'bincraft::process_unarchived_pkgs(Sys.getenv("CODENAME"), Sys.getenv("ARCH"), workers = 2L)' + - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git", dependencies = TRUE)' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' + - /opt/R/${R_VERSION}/bin/R -q -e 'bincraft::process_unarchived_pkgs(Sys.getenv("CODENAME"), Sys.getenv("ARCH"), workers = 2L)' backend_options: kubernetes: resources: -- 2.54.0 From 386deb5dfbf390c0fcd6d72872c8cd99f98bedfe Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 22:58:57 +0200 Subject: [PATCH 10/16] refactor(ci): use multi-R-version image in build-r-minor-sensitive-packages Drop -${r_version} from the docker.io/devxygmbh tag and invoke R via the explicit /opt/R/${r_version}/bin/R path (including R CMD INSTALL). Bumps the matrix r_version values from 4.5/4.4 to the full-patch 4.5.3/4.4.3, matching the rest of the refactor's 'always full patch' rule. --- .crow/build-r-minor-sensitive-packages.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.crow/build-r-minor-sensitive-packages.yaml b/.crow/build-r-minor-sensitive-packages.yaml index 6e9d10c..e4eea47 100644 --- a/.crow/build-r-minor-sensitive-packages.yaml +++ b/.crow/build-r-minor-sensitive-packages.yaml @@ -17,16 +17,16 @@ matrix: include: - os: alpine os_version: 3.21 - r_version: 4.5 + r_version: 4.5.3 - os: alpine os_version: 3.21 - r_version: 4.4 + r_version: 4.4.3 # - os: alpine # os_version: 3.21 # r_version: 4.3 steps: - name: 'Build R-minor-sensitive binaries' - image: "docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}-${r_version}" + image: "docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}" pull: true environment: RED_HAT_DEV_PW: @@ -60,10 +60,10 @@ steps: - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - rm -rf /mnt/cache/R-pkgs/00LOCK-* - mkdir -p /tmp/R-libs - - git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft && R CMD INSTALL --library=/tmp/R-libs /tmp/bincraft && R -q -e 'packageVersion("bincraft")' + - git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft && /opt/R/${r_version}/bin/R CMD INSTALL --library=/tmp/R-libs /tmp/bincraft && /opt/R/${r_version}/bin/R -q -e 'packageVersion("bincraft")' - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run) - - $XVFB -- R -q -e "options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pak::sysreqs_db_update(); pkgs = bincraft::get_r_minor_sensitive_packages(r_minor_packages_issue_url = 'https://git.devxy.io/api/v1/repos/devxy/build-cran-binaries/issues/29'); foo = lapply(pkgs, function(x) bincraft::build_binary_package(x, is_debug = FALSE, is_r_minor_sensitive = TRUE, force = FALSE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE))" 2>&1 + - $XVFB -- /opt/R/${r_version}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); pak::sysreqs_db_update(); pkgs = bincraft::get_r_minor_sensitive_packages(r_minor_packages_issue_url = 'https://git.devxy.io/api/v1/repos/devxy/build-cran-binaries/issues/29'); foo = lapply(pkgs, function(x) bincraft::build_binary_package(x, is_debug = FALSE, is_r_minor_sensitive = TRUE, force = FALSE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE))" 2>&1 backend_options: kubernetes: resources: -- 2.54.0 From e221e891199d60ad1ae7d6470abc92a56b844992 Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 23:01:11 +0200 Subject: [PATCH 11/16] refactor(justfile): use multi-R-version images in build/process recipes Drop -{{R_VERSION}} from the image tag and invoke R via the explicit /opt/R/{{R_VERSION}}/bin/R path in build-all, build-single, and process-updates. Updates example comments to use current platform/R combinations. --- Justfile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Justfile b/Justfile index 069f8c2..0c960d9 100644 --- a/Justfile +++ b/Justfile @@ -1,13 +1,13 @@ -# just build-all alpine 3.21 arm64 4.5.0 odbc 1 +# just build-all alpine 3.22 arm64 4.5.3 odbc 1 build-all OS OS_VERSION ARCH R_VERSION PACKAGE NCPUS: - docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} bash -c 'R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' + docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} bash -c '/opt/R/{{R_VERSION}}/bin/R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && /opt/R/{{R_VERSION}}/bin/R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' -# just build-single alpine 3.21 arm64 4.5.0 odbc 1.5.0 1 -# just build-single alpine 3.22 arm64 4.5.0 sf latest 1 -# just build-single ubuntu noble arm64 4.2.3 rlang 1.1.6 1 +# just build-single alpine 3.22 arm64 4.5.3 odbc 1.5.0 1 +# just build-single alpine 3.22 arm64 4.5.3 sf latest 1 +# just build-single ubuntu noble arm64 4.4.3 rlang 1.1.6 1 build-single OS OS_VERSION ARCH R_VERSION PACKAGE TAG NCPUS: - docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} bash -c 'R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", tag = \"{{TAG}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' + docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} bash -c '/opt/R/{{R_VERSION}}/bin/R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && /opt/R/{{R_VERSION}}/bin/R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", tag = \"{{TAG}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' # just process-updates redhat 9 arm64 4.4.3 'lubridate::interval(lubridate::today() - 4, lubridate::today() - 4)' process-updates OS OS_VERSION ARCH R_VERSION interval: - docker run --rm -it --platform linux/{{ARCH}} -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} R -q -e "bincraft::process_cran_updates(interval = {{interval}}, platform = \"{{OS}}\", s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" + docker run --rm -it --platform linux/{{ARCH}} -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::process_cran_updates(interval = {{interval}}, platform = \"{{OS}}\", s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" -- 2.54.0 From 5c88b2bc3762fbb53de7b7a34949108377e02c92 Mon Sep 17 00:00:00 2001 From: pat-s Date: Mon, 25 May 2026 23:02:21 +0200 Subject: [PATCH 12/16] refactor: keep commented build-all-versions-install-deps example in sync Mirror the multi-R-version image refactor in the commented-out template so the example remains faithful to active .crow workflows. --- build-all-versions-install-deps.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build-all-versions-install-deps.yaml b/build-all-versions-install-deps.yaml index d7c0180..afcbb58 100644 --- a/build-all-versions-install-deps.yaml +++ b/build-all-versions-install-deps.yaml @@ -17,7 +17,7 @@ # steps: # - name: 'Install common R deps' -# image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} +# image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} # pull: true # environment: # REPO_RO_TOKEN: @@ -40,11 +40,11 @@ # - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . # - mkdir -p /mnt/cache/R-pkgs # - rm -rf /mnt/cache/R-pkgs/00LOCK-* /mnt/cache/R-pkgs/bincraft /mnt/cache/pkgcache -# - R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/stable/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))' -# - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git", dependencies = TRUE)' -# - R -q -e 'packageVersion("bincraft")' -# # - R -q -e "future::plan('multisession', workers = 6L); pkgs = bincraft::query_packages_without_historic_versions('alpine322', 'amd64'); saveRDS(pkgs, '/mnt/cache/pkgs_amd64.rds')" -# - R -q -e "future::plan('multisession', workers = 6L); pkgs = bincraft::query_packages_without_historic_versions('alpine323', 'arm64'); saveRDS(pkgs, '/mnt/cache/pkgs_arm64.rds')" +# - /opt/R/${R_VERSION}/bin/R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/stable/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))' +# - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git", dependencies = TRUE)' +# - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' +# # - /opt/R/${R_VERSION}/bin/R -q -e "future::plan('multisession', workers = 6L); pkgs = bincraft::query_packages_without_historic_versions('alpine322', 'amd64'); saveRDS(pkgs, '/mnt/cache/pkgs_amd64.rds')" +# - /opt/R/${R_VERSION}/bin/R -q -e "future::plan('multisession', workers = 6L); pkgs = bincraft::query_packages_without_historic_versions('alpine323', 'arm64'); saveRDS(pkgs, '/mnt/cache/pkgs_arm64.rds')" # backend_options: # kubernetes: # resources: -- 2.54.0 From dc19a4fd572eadc4b4863745dc14df2197f9ffe6 Mon Sep 17 00:00:00 2001 From: pat-s Date: Tue, 26 May 2026 10:40:53 +0200 Subject: [PATCH 13/16] fix(ci): correct codename rhel9 -> rhel10 in redhat-10 process-updates The upload_package_index() call in both process-updates-redhat-10-* files passed codename = "rhel9", which uploaded the redhat-10 index to the rhel9 path. The companion update-package-index-redhat-10-* files already use "rhel10" correctly. --- .crow/process-updates-redhat-10-amd64.yaml | 2 +- .crow/process-updates-redhat-10-arm64.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.crow/process-updates-redhat-10-amd64.yaml b/.crow/process-updates-redhat-10-amd64.yaml index 7746cc6..511365d 100644 --- a/.crow/process-updates-redhat-10-amd64.yaml +++ b/.crow/process-updates-redhat-10-amd64.yaml @@ -59,7 +59,7 @@ steps: # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-10', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel10", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: kubernetes: resources: diff --git a/.crow/process-updates-redhat-10-arm64.yaml b/.crow/process-updates-redhat-10-arm64.yaml index 7e65e36..e09d0ca 100644 --- a/.crow/process-updates-redhat-10-arm64.yaml +++ b/.crow/process-updates-redhat-10-arm64.yaml @@ -57,4 +57,4 @@ steps: # options(future.globals.onReference = NULL): for some reason s3fs::file_delete() throws 'Error: Detected a non-exportable reference ('externalptr') in one of the globals ('FUN' of class 'function') used in the future expression' otherwise - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - $XVFB $XVFB_ARGS -- /opt/R/${R_VERSION}/bin/R -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = 'error', repos = structure(c(getOption('repos'),INLA='https://inla.r-inla-download.org/R/stable'))); progressr::handlers('cli'); progressr::handlers(global = TRUE); options(future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = 'redhat-10', process_updated = TRUE, process_new = TRUE, process_removed = TRUE, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" - - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel9", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' + - /opt/R/${R_VERSION}/bin/R -q -e 'library(bincraft); upload_package_index(codename = "rhel10", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' -- 2.54.0 From bd793868bf4863821463e48df5c176cd92b2de03 Mon Sep 17 00:00:00 2001 From: pat-s Date: Tue, 26 May 2026 10:40:59 +0200 Subject: [PATCH 14/16] fix(ci): add missing packageVersion(bincraft) diagnostic in update-package-index-redhat-8-amd64 The amd64 variant of the redhat-8 package-index workflow was missing the packageVersion("bincraft") diagnostic line that every sibling file (including its arm64 counterpart) runs after pak install. --- .crow/update-package-index-redhat-8-amd64.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.crow/update-package-index-redhat-8-amd64.yaml b/.crow/update-package-index-redhat-8-amd64.yaml index f0c80e4..c236afe 100644 --- a/.crow/update-package-index-redhat-8-amd64.yaml +++ b/.crow/update-package-index-redhat-8-amd64.yaml @@ -47,6 +47,7 @@ steps: - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/cranlike@s3")' - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("pat-s/desc@description-from-remote")' + - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - cd /mnt/cache/packages - /opt/R/${R_VERSION}/bin/R -q -e 'options(crayon.enabled = TRUE); library(bincraft); future::plan("multisession", workers = 4); library(progressr); handlers(global = TRUE); handlers("progress"); upload_package_index(codename = "rhel8", s3_endpoint = "https://s3.eu-central-003.backblazeb2.com", s3_region = "eu-central-003", s3_bucket = "devxy-rpkgs-binaries", s3_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), s3_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"))' backend_options: -- 2.54.0 From 5c3383f9e183a24eb58ba77c6cf59d49efb16204 Mon Sep 17 00:00:00 2001 From: pat-s Date: Tue, 26 May 2026 10:41:16 +0200 Subject: [PATCH 15/16] chore: gitignore docs/ and untrack existing files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stop tracking docs/ — the existing spec and plan files (both this PR's multi-R-version-images set and the prior weekly-missing-binaries set) were intermediate working artifacts that don't need to live in the repo. Files remain on disk locally but are no longer in git. --- .gitignore | 2 +- .../2026-04-11-weekly-missing-binaries.md | 905 --------------- .../2026-05-25-multi-r-version-images.md | 1031 ----------------- ...26-04-11-weekly-missing-binaries-design.md | 246 ---- ...026-05-25-multi-r-version-images-design.md | 242 ---- 5 files changed, 1 insertion(+), 2425 deletions(-) delete mode 100644 docs/superpowers/plans/2026-04-11-weekly-missing-binaries.md delete mode 100644 docs/superpowers/plans/2026-05-25-multi-r-version-images.md delete mode 100644 docs/superpowers/specs/2026-04-11-weekly-missing-binaries-design.md delete mode 100644 docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md diff --git a/.gitignore b/.gitignore index 7575017..b28375c 100644 --- a/.gitignore +++ b/.gitignore @@ -95,6 +95,6 @@ terraform.rc .envrc exec.sh exec.R -docs/_site +docs/ local/test.R .DS_Store diff --git a/docs/superpowers/plans/2026-04-11-weekly-missing-binaries.md b/docs/superpowers/plans/2026-04-11-weekly-missing-binaries.md deleted file mode 100644 index d7a099c..0000000 --- a/docs/superpowers/plans/2026-04-11-weekly-missing-binaries.md +++ /dev/null @@ -1,905 +0,0 @@ -# Weekly Missing Binaries Audit & Rebuild — Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Add a weekly CI workflow that audits CRAN packages missing binaries for their latest release version, reports them in Forgejo issues by OS family, and rebuilds those without a prior build failure. - -**Architecture:** Two independent workflow sets (audit + rebuild), each with one YAML per platform/arch (14 each). A shared R script does the audit logic. An excluded-packages JSON config is the shared blocklist. The audit writes per-platform RDS files consumed by rebuild workflows. - -**Tech Stack:** R (bincraft, s3fs, DBI/RPostgres, jsonlite, httr2), Crow/Woodpecker CI YAML, Forgejo API, PostgreSQL, Backblaze S3. - ---- - -## File Structure - -| File | Responsibility | -|------|---------------| -| `local/excluded-packages.json` | Excluded packages with reasons (single source of truth) | -| `local/weekly-missing-binaries-audit.R` | Audit logic: S3 check, DB check, issue update, RDS output | -| `.crow/weekly-audit-missing-{platform}-{arch}.yaml` (14 files) | Audit workflow per platform/arch | -| `.crow/weekly-rebuild-missing-{platform}-{arch}.yaml` (14 files) | Rebuild workflow per platform/arch | - -## Platform Reference - -Used throughout the plan. Each row is one workflow file pair (audit + rebuild). - -| PLATFORM env var | ARCH | S3 codename (sub("-","",PLATFORM)) | OS Family | Image | -|-----------------|------|-----------|-----------|-------| -| ubuntu-2204 | amd64 | ubuntu2204 | Ubuntu | reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 | -| ubuntu-2204 | arm64 | ubuntu2204 | Ubuntu | reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 | -| ubuntu-2404 | amd64 | ubuntu2404 | Ubuntu | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | -| ubuntu-2404 | arm64 | ubuntu2404 | Ubuntu | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | -| alpine-321 | amd64 | alpine321 | Alpine | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | -| alpine-321 | arm64 | alpine321 | Alpine | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | -| alpine-322 | amd64 | alpine322 | Alpine | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | -| alpine-322 | arm64 | alpine322 | Alpine | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | -| alpine-323 | amd64 | alpine323 | Alpine | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | -| alpine-323 | arm64 | alpine323 | Alpine | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | -| redhat-8 | amd64 | redhat8 | Red Hat | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | -| redhat-8 | arm64 | redhat8 | Red Hat | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | -| redhat-9 | amd64 | redhat9 | Red Hat | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | -| redhat-9 | arm64 | redhat9 | Red Hat | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | - ---- - -## Task 1: Create excluded-packages.json - -**Files:** -- Create: `local/excluded-packages.json` - -- [ ] **Step 1: Create the JSON file** - -Extract every package from the inline exclusion list in `.crow/build-all-versions-amd64.yaml` (line 72). The list has two categories: Windows-only packages (comment on line 69) and problematic packages (hang/OOM). Create `local/excluded-packages.json`: - -```json -[ - {"package": "RInno", "reason": "windows-only"}, - {"package": "KeyboardSimulator", "reason": "windows-only"}, - {"package": "R2PPT", "reason": "windows-only"}, - {"package": "RWinEdt", "reason": "windows-only"}, - {"package": "blatr", "reason": "windows-only"}, - {"package": "excel.link", "reason": "windows-only"}, - {"package": "spectrino", "reason": "windows-only"}, - {"package": "taskscheduleR", "reason": "windows-only"}, - {"package": "MDSGUI", "reason": "windows-only"}, - {"package": "BiplotGUI", "reason": "windows-only"}, - {"package": "R2wd", "reason": "windows-only"}, - {"package": "rFUSION", "reason": "windows-only"}, - {"package": "MediaNews", "reason": "windows-only"}, - {"package": "doBy", "reason": "hang"}, - {"package": "IDPmisc", "reason": "hang"}, - {"package": "frailtypack", "reason": "hang"}, - {"package": "afex", "reason": "hang"}, - {"package": "FrF2", "reason": "hang"}, - {"package": "DoE.base", "reason": "hang"}, - {"package": "agricolae", "reason": "hang"}, - {"package": "doFuture", "reason": "hang"}, - {"package": "fscaret", "reason": "hang"}, - {"package": "PHYLOGR", "reason": "hang"}, - {"package": "seewave", "reason": "hang"}, - {"package": "pls", "reason": "hang"}, - {"package": "relaimpo", "reason": "hang"}, - {"package": "geepack", "reason": "hang"}, - {"package": "gggenes", "reason": "hang"}, - {"package": "NPCirc", "reason": "hang"}, - {"package": "repmis", "reason": "hang"}, - {"package": "PNDSIBGE", "reason": "hang"}, - {"package": "lidR", "reason": "hang"}, - {"package": "poismf", "reason": "hang"}, - {"package": "neonstore", "reason": "hang"}, - {"package": "MachineShop", "reason": "hang"}, - {"package": "mvst", "reason": "hang"}, - {"package": "MacBehaviour", "reason": "hang"}, - {"package": "mcmcderive", "reason": "hang"}, - {"package": "RGIFT", "reason": "hang"}, - {"package": "KnowBR", "reason": "hang"}, - {"package": "netmeta", "reason": "hang"}, - {"package": "spdep", "reason": "hang"}, - {"package": "Rfast", "reason": "hang"}, - {"package": "compareGroups", "reason": "hang"}, - {"package": "ff", "reason": "hang"}, - {"package": "GsymPoint", "reason": "hang"}, - {"package": "RcppDynProg", "reason": "hang"}, - {"package": "comtradr", "reason": "hang"}, - {"package": "FD", "reason": "hang"}, - {"package": "PearsonDS", "reason": "hang"}, - {"package": "DCluster", "reason": "hang"}, - {"package": "gRc", "reason": "hang"}, - {"package": "mixlm", "reason": "hang"}, - {"package": "geospt", "reason": "hang"}, - {"package": "fdth", "reason": "hang"}, - {"package": "ffmanova", "reason": "hang"}, - {"package": "fiery", "reason": "hang"}, - {"package": "ffscrapr", "reason": "hang"}, - {"package": "cold", "reason": "hang"}, - {"package": "RcmdrPlugin.DoE", "reason": "hang"}, - {"package": "RcmdrPlugin.NMBU", "reason": "hang"}, - {"package": "RcmdrPlugin.RiskDemo", "reason": "hang"}, - {"package": "RcmdrPlugin.TeachStat", "reason": "hang"}, - {"package": "RcmdrPlugin.TeachingDemos", "reason": "hang"}, - {"package": "RcmdrPlugin.UCA", "reason": "hang"}, - {"package": "RcmdrPlugin.WorldFlora", "reason": "hang"}, - {"package": "RcmdrPlugin.aRnova", "reason": "hang"}, - {"package": "RcmdrPlugin.depthTools", "reason": "hang"}, - {"package": "RcmdrPlugin.orloca", "reason": "hang"}, - {"package": "RcmdrPlugin.sos", "reason": "hang"}, - {"package": "RcmdrPlugin.survival", "reason": "hang"}, - {"package": "RcmdrPlugin.temis", "reason": "hang"}, - {"package": "GWlasso", "reason": "hang"}, - {"package": "GWmodelVis", "reason": "hang"} -] -``` - -- [ ] **Step 2: Commit** - -```bash -git add local/excluded-packages.json -git commit -m "feat: add excluded-packages.json for weekly missing binaries workflow" -``` - ---- - -## Task 2: Create the audit R script - -**Files:** -- Create: `local/weekly-missing-binaries-audit.R` - -This is the core logic. It reads env vars `PLATFORM` and `ARCH`, checks S3 + DB, writes an RDS of rebuildable packages, and updates the Forgejo issue for the OS family. - -- [ ] **Step 1: Create the R script** - -Create `local/weekly-missing-binaries-audit.R` with the full content below: - -```r -options(error = function() { - cat("ERROR:", geterrmessage(), "\n", file = stdout()) - traceback(2) - q(status = 1) -}) - -library(DBI, quietly = TRUE) -suppressPackageStartupMessages(library(data.table)) - -platform <- Sys.getenv("PLATFORM") -arch <- Sys.getenv("ARCH") -stopifnot(nzchar(platform), nzchar(arch)) - -# S3 codename: remove hyphen from platform string (e.g. "ubuntu-2204" -> "ubuntu2204") -s3_codename <- gsub("-", "", platform) - -# OS family for issue grouping -os_family <- if (grepl("^ubuntu", platform)) { - "Ubuntu" -} else if (grepl("^alpine", platform)) { - "Alpine" -} else if (grepl("^redhat", platform)) { - "Red Hat" -} else { - stop("Unknown platform: ", platform) -} - -cat(sprintf("Audit: platform=%s, arch=%s, s3_codename=%s, os_family=%s\n", - platform, arch, s3_codename, os_family)) - -### 1. Get current CRAN release packages -cran_release <- as.data.table(tools::CRAN_package_db()[, c("Package", "Version")]) -cran_release[, Version := as.character(Version)] -cat(sprintf("CRAN release packages: %d\n", nrow(cran_release))) - -### 2. List S3 tarballs for this platform/arch -s3fs::s3_file_system( - aws_access_key_id = Sys.getenv("B2_S3_ACCESS_KEY"), - aws_secret_access_key = Sys.getenv("B2_S3_SECRET_KEY"), - endpoint = "https://s3.eu-central-003.backblazeb2.com", - region_name = "eu-central-003", - refresh = TRUE -) - -s3_path <- sprintf("devxy-rpkgs-binaries/%s/%s/latest/src/contrib", arch, s3_codename) -s3_files <- tryCatch( - s3fs::s3_dir_ls(s3_path), - error = function(e) { - cat(sprintf("Warning: could not list S3 path %s: %s\n", s3_path, conditionMessage(e))) - character(0) - } -) - -# Parse package name + version from tarball filenames -file_names <- basename(s3_files) -matches <- regexec("^([A-Za-z0-9.]+)_([0-9][^/]*)\\.tar\\.gz$", file_names) -parts <- regmatches(file_names, matches) -parts <- parts[lengths(parts) == 3] - -s3_dt <- if (length(parts) > 0) { - data.table( - Package = vapply(parts, `[`, character(1), 2), - Version = vapply(parts, `[`, character(1), 3) - ) -} else { - data.table(Package = character(0), Version = character(0)) -} -cat(sprintf("S3 packages for %s/%s: %d\n", arch, s3_codename, nrow(s3_dt))) - -### 3. Find CRAN release packages missing from S3 -setkey(cran_release, Package, Version) -setkey(s3_dt, Package, Version) -missing <- cran_release[!s3_dt] -cat(sprintf("Missing binaries (latest CRAN version): %d\n", nrow(missing))) - -### 4. Load excluded packages -excluded_json <- jsonlite::fromJSON("local/excluded-packages.json") -excluded_pkgs <- excluded_json$package -missing_not_excluded <- missing[!Package %in% excluded_pkgs] -missing_excluded <- missing[Package %in% excluded_pkgs] -cat(sprintf("Missing after excluding %d blocked packages: %d\n", - length(excluded_pkgs), nrow(missing_not_excluded))) - -### 5. Check DB for prior build failures on these exact versions -con <- DBI::dbConnect( - RPostgres::Postgres(), - dbname = "build_metadata", - host = "r-binaries.devxy.io", - port = 15432, - user = "rpkgs", - password = Sys.getenv("PGPASS"), - sslmode = "require" -) -on.exit(DBI::dbDisconnect(con), add = TRUE) - -errored_pkgs <- as.data.table(DBI::dbGetQuery( - con, - sprintf( - "SELECT name, tag FROM single_builds WHERE error_occurred = TRUE AND platform = '%s' AND arch = '%s'", - platform, arch - ) -)) -setnames(errored_pkgs, c("Package", "Version")) -setkey(errored_pkgs, Package, Version) - -# Split: rebuildable vs known failures -known_failures <- missing_not_excluded[errored_pkgs, nomatch = 0, on = c("Package", "Version")] -rebuildable <- missing_not_excluded[!errored_pkgs, on = c("Package", "Version")] - -cat(sprintf("Known build failures: %d\n", nrow(known_failures))) -cat(sprintf("Rebuildable (no prior failure): %d\n", nrow(rebuildable))) - -### 6. Write RDS for rebuild workflow -cache_dir <- "/mnt/cache/packages" -if (dir.exists(cache_dir)) { - rds_path <- file.path(cache_dir, sprintf("weekly_rebuild_%s_%s.rds", platform, arch)) - saveRDS(rebuildable$Package, rds_path) - cat(sprintf("Wrote %d packages to %s\n", nrow(rebuildable), rds_path)) -} else { - cat(sprintf("Cache dir %s does not exist, skipping RDS write\n", cache_dir)) -} - -### 7. Update Forgejo issue -forgejo_token <- Sys.getenv("FORGEJO_TOKEN") -if (!nzchar(forgejo_token)) { - cat("FORGEJO_TOKEN not set, skipping issue update\n") -} else { - base_url <- "https://git.devxy.io/api/v1" - repo <- "devxy/build-cran-binaries" - issue_title <- sprintf("Missing package binaries for latest version (%s)", os_family) - - # Helper: make API request - forgejo_get <- function(path, query = list()) { - url <- paste0(base_url, path) - resp <- httr2::request(url) |> - httr2::req_headers(Authorization = paste("token", forgejo_token)) |> - httr2::req_url_query(!!!query) |> - httr2::req_perform() - httr2::resp_body_json(resp) - } - - forgejo_patch <- function(path, body) { - url <- paste0(base_url, path) - httr2::request(url) |> - httr2::req_headers(Authorization = paste("token", forgejo_token)) |> - httr2::req_method("PATCH") |> - httr2::req_body_json(body) |> - httr2::req_perform() - } - - forgejo_post <- function(path, body) { - url <- paste0(base_url, path) - httr2::request(url) |> - httr2::req_headers(Authorization = paste("token", forgejo_token)) |> - httr2::req_body_json(body) |> - httr2::req_perform() - } - - # Build the markdown section for this platform/arch - build_section <- function() { - n_missing <- nrow(rebuildable) + nrow(known_failures) - n_rebuild <- nrow(rebuildable) - header <- sprintf("### %s (%d missing, %d to rebuild)", arch, n_missing, n_rebuild) - - lines <- header - if (nrow(rebuildable) > 0) { - pkg_lines <- sprintf("- %s (%s)", rebuildable$Package, rebuildable$Version) - lines <- c(lines, "", pkg_lines) - } else if (nrow(known_failures) == 0) { - lines <- c(lines, "", "All binaries available.") - } - - if (nrow(known_failures) > 0) { - lines <- c(lines, "", "#### Known build failures", - sprintf("- %s (%s)", known_failures$Package, known_failures$Version)) - } - - paste(lines, collapse = "\n") - } - - # Build excluded packages footer - build_excluded_footer <- function() { - if (nrow(excluded_json) == 0) return("") - items <- sprintf("%s (%s)", excluded_json$package, excluded_json$reason) - paste0("\n---\n\n## Excluded packages\n", paste(items, collapse = ", ")) - } - - new_section <- build_section() - - # Search for existing issue - issues <- forgejo_get( - sprintf("/repos/%s/issues", repo), - query = list(type = "issues", state = "open", q = issue_title, limit = 50) - ) - - # Find exact title match - existing <- Filter(function(i) i$title == issue_title, issues) - - if (length(existing) > 0) { - issue <- existing[[1]] - body <- issue$body - - # Replace or insert the platform section + arch subsection - platform_header <- sprintf("## %s", platform) - arch_header <- sprintf("### %s", arch) - - # Split body into lines for manipulation - body_lines <- strsplit(body, "\n")[[1]] - - # Find the platform section - platform_start <- which(body_lines == platform_header) - - if (length(platform_start) > 0) { - platform_start <- platform_start[1] - # Find end of this platform section (next ## or --- or end) - remaining <- body_lines[(platform_start + 1):length(body_lines)] - platform_end_offset <- which(grepl("^## |^---$", remaining)) - platform_end <- if (length(platform_end_offset) > 0) { - platform_start + platform_end_offset[1] - 1 - } else { - length(body_lines) - } - - # Within platform section, find the arch subsection - section_lines <- body_lines[platform_start:platform_end] - arch_start_offset <- which(grepl(sprintf("^### %s", arch), section_lines)) - - if (length(arch_start_offset) > 0) { - arch_start <- arch_start_offset[1] - # Find end of arch subsection (next ### or ## or --- or end of platform section) - arch_remaining <- section_lines[(arch_start + 1):length(section_lines)] - arch_end_offset <- which(grepl("^###|^## |^---$", arch_remaining)) - arch_end <- if (length(arch_end_offset) > 0) { - arch_start + arch_end_offset[1] - 1 - } else { - length(section_lines) - } - # Replace arch subsection within platform section - section_lines <- c( - section_lines[1:(arch_start - 1)], - strsplit(new_section, "\n")[[1]], - if (arch_end < length(section_lines)) section_lines[(arch_end + 1):length(section_lines)] else character(0) - ) - } else { - # Append arch subsection to end of platform section - section_lines <- c(section_lines, "", strsplit(new_section, "\n")[[1]]) - } - - body_lines <- c( - body_lines[1:(platform_start - 1)], - section_lines, - if (platform_end < length(body_lines)) body_lines[(platform_end + 1):length(body_lines)] else character(0) - ) - } else { - # Insert new platform section before "---" (excluded packages footer) or at end - footer_line <- which(body_lines == "---") - insert_at <- if (length(footer_line) > 0) footer_line[1] - 1 else length(body_lines) - body_lines <- c( - body_lines[1:insert_at], - "", - platform_header, - "", - strsplit(new_section, "\n")[[1]], - if (insert_at < length(body_lines)) body_lines[(insert_at + 1):length(body_lines)] else character(0) - ) - } - - # Update timestamp - timestamp_pattern <- "^_Last updated:.*_$" - ts_line <- which(grepl(timestamp_pattern, body_lines)) - new_ts <- sprintf("_Last updated: %s_", Sys.Date()) - if (length(ts_line) > 0) { - body_lines[ts_line[1]] <- new_ts - } else { - body_lines <- c(new_ts, "", body_lines) - } - - # Rebuild excluded footer - footer_start <- which(body_lines == "---") - if (length(footer_start) > 0) { - body_lines <- c(body_lines[1:(footer_start[1] - 1)], - strsplit(build_excluded_footer(), "\n")[[1]]) - } else { - body_lines <- c(body_lines, strsplit(build_excluded_footer(), "\n")[[1]]) - } - - new_body <- paste(body_lines, collapse = "\n") - forgejo_patch( - sprintf("/repos/%s/issues/%d", repo, issue$number), - list(body = new_body) - ) - cat(sprintf("Updated issue #%d: %s\n", issue$number, issue_title)) - } else { - # Create new issue - body_lines <- c( - sprintf("_Last updated: %s_", Sys.Date()), - "", - sprintf("## %s", platform), - "", - new_section, - build_excluded_footer() - ) - new_body <- paste(body_lines, collapse = "\n") - forgejo_post( - sprintf("/repos/%s/issues", repo), - list(title = issue_title, body = new_body) - ) - cat(sprintf("Created new issue: %s\n", issue_title)) - } -} - -cat("Audit complete.\n") -``` - -- [ ] **Step 2: Commit** - -```bash -git add local/weekly-missing-binaries-audit.R -git commit -m "feat: add weekly missing binaries audit R script" -``` - ---- - -## Task 3: Create audit workflow for ubuntu-2204-amd64 - -**Files:** -- Create: `.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml` - -This is the template. All other audit workflows follow the same structure with substituted values. - -- [ ] **Step 1: Create the workflow YAML** - -Create `.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml`: - -```yaml -when: - - event: cron - cron: weekly-audit-missing-ubuntu-2204-amd64 - - event: manual - evaluate: 'task == "weekly-audit-missing-ubuntu-2204-amd64"' - -skip_clone: true - -steps: - - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 - pull: true - environment: - B2_S3_ACCESS_KEY: - from_secret: B2_S3_ACCESS_KEY - B2_S3_SECRET_KEY: - from_secret: B2_S3_SECRET_KEY - PGPASS: - from_secret: PGPASS - REPO_RO_TOKEN: - from_secret: REPO_RO_TOKEN - FORGEJO_TOKEN: - from_secret: FORGEJO_TOKEN - GITHUB_PAT: - from_secret: GITHUB_PAT - PLATFORM: ubuntu-2204 - ARCH: amd64 - R_LIBS_USER: /mnt/cache/R-pkgs - volumes: - - amd64-binaries-r-dep-cache-ubuntu2204:/mnt/cache - commands: - - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' - backend_options: - kubernetes: - resources: - requests: - memory: 2Gi - cpu: 2000m - limits: - memory: 4Gi - cpu: 2000m - nodeSelector: - kubernetes.io/arch: amd64 - tolerations: - - key: 'CI' - operator: 'Equal' - value: 'true' - effect: 'NoSchedule' -``` - -- [ ] **Step 2: Commit** - -```bash -git add .crow/weekly-audit-missing-ubuntu-2204-amd64.yaml -git commit -m "feat: add weekly audit workflow for ubuntu-2204-amd64" -``` - ---- - -## Task 4: Create remaining 13 audit workflows - -**Files:** -- Create: 13 files in `.crow/` (see substitution table below) - -Each file follows the exact same structure as Task 3 with these substitutions: - -| File suffix | PLATFORM | ARCH | Image | Volume | -|-------------|----------|------|-------|--------| -| ubuntu-2204-arm64 | ubuntu-2204 | arm64 | reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 | arm64-binaries-r-dep-cache-ubuntu2204 | -| ubuntu-2404-amd64 | ubuntu-2404 | amd64 | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | amd64-binaries-r-dep-cache-ubuntu2404 | -| ubuntu-2404-arm64 | ubuntu-2404 | arm64 | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | arm64-binaries-r-dep-cache-ubuntu2404 | -| alpine-321-amd64 | alpine-321 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | amd64-binaries-r-dep-cache-alpine321 | -| alpine-321-arm64 | alpine-321 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | arm64-binaries-r-dep-cache-alpine321 | -| alpine-322-amd64 | alpine-322 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | amd64-binaries-r-dep-cache-alpine322 | -| alpine-322-arm64 | alpine-322 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | arm64-binaries-r-dep-cache-alpine322 | -| alpine-323-amd64 | alpine-323 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | amd64-binaries-r-dep-cache-alpine323 | -| alpine-323-arm64 | alpine-323 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | arm64-binaries-r-dep-cache-alpine323 | -| redhat-8-amd64 | redhat-8 | amd64 | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | amd64-binaries-r-dep-cache-redhat8 | -| redhat-8-arm64 | redhat-8 | arm64 | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | arm64-binaries-r-dep-cache-redhat8 | -| redhat-9-amd64 | redhat-9 | amd64 | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | amd64-binaries-r-dep-cache-redhat9 | -| redhat-9-arm64 | redhat-9 | arm64 | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | arm64-binaries-r-dep-cache-redhat9 | - -**Key substitution points in each YAML (6 locations):** - -1. `cron:` value — `weekly-audit-missing-{suffix}` -2. `evaluate:` value — `'task == "weekly-audit-missing-{suffix}"'` -3. `image:` — use the Image column -4. `PLATFORM:` env var — use the PLATFORM column -5. `ARCH:` env var — use the ARCH column -6. `volumes:` — `{ARCH}-binaries-r-dep-cache-{PLATFORM-without-hyphens}:/mnt/cache` -7. `nodeSelector: kubernetes.io/arch:` — use the ARCH column - -- [ ] **Step 1: Create all 13 audit workflow files** - -Copy the template from Task 3 and substitute the values per the table above. Example for alpine-321-arm64: - -```yaml -when: - - event: cron - cron: weekly-audit-missing-alpine-321-arm64 - - event: manual - evaluate: 'task == "weekly-audit-missing-alpine-321-arm64"' - -skip_clone: true - -steps: - - name: 'Audit missing binaries' - image: reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 - pull: true - environment: - B2_S3_ACCESS_KEY: - from_secret: B2_S3_ACCESS_KEY - B2_S3_SECRET_KEY: - from_secret: B2_S3_SECRET_KEY - PGPASS: - from_secret: PGPASS - REPO_RO_TOKEN: - from_secret: REPO_RO_TOKEN - FORGEJO_TOKEN: - from_secret: FORGEJO_TOKEN - GITHUB_PAT: - from_secret: GITHUB_PAT - PLATFORM: alpine-321 - ARCH: arm64 - R_LIBS_USER: /mnt/cache/R-pkgs - volumes: - - arm64-binaries-r-dep-cache-alpine321:/mnt/cache - commands: - - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - - mkdir -p /mnt/cache/packages /mnt/cache/R-pkgs - - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak(c("git::https://codefloe.com/rpkgs/bincraft.git", "httr2", "jsonlite"))' - - R -q -e 'source("local/weekly-missing-binaries-audit.R")' - backend_options: - kubernetes: - resources: - requests: - memory: 2Gi - cpu: 2000m - limits: - memory: 4Gi - cpu: 2000m - nodeSelector: - kubernetes.io/arch: arm64 - tolerations: - - key: 'CI' - operator: 'Equal' - value: 'true' - effect: 'NoSchedule' -``` - -Repeat for all 13 remaining suffixes from the table, substituting the 7 locations. - -- [ ] **Step 2: Commit** - -```bash -git add .crow/weekly-audit-missing-*.yaml -git commit -m "feat: add remaining 13 weekly audit workflows for all platform/arch combos" -``` - ---- - -## Task 5: Create rebuild workflow for ubuntu-2204-amd64 - -**Files:** -- Create: `.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml` - -This is the template for rebuild workflows. It reads the RDS written by the audit and builds each package. - -- [ ] **Step 1: Create the workflow YAML** - -Create `.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml`: - -```yaml -when: - - event: cron - cron: weekly-rebuild-missing-ubuntu-2204-amd64 - - event: manual - evaluate: 'task == "weekly-rebuild-missing-ubuntu-2204-amd64"' - -skip_clone: true - -steps: - - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 - pull: true - environment: - RED_HAT_DEV_PW: - from_secret: RED_HAT_DEV_PW - B2_S3_ACCESS_KEY: - from_secret: B2_S3_ACCESS_KEY - B2_S3_SECRET_KEY: - from_secret: B2_S3_SECRET_KEY - PGPASS: - from_secret: PGPASS - REPO_RO_TOKEN: - from_secret: REPO_RO_TOKEN - GITHUB_PAT: - from_secret: GITHUB_PAT - GIT_USER: pat-s - R_PKG_CACHE_DIR: /mnt/cache/pkgcache - R_LIBS_USER: /mnt/cache/R-pkgs - CCACHE_DIR: /mnt/cache/ccache - PLATFORM: ubuntu-2204 - ARCH: amd64 - NCPUS: 2 - volumes: - - amd64-binaries-r-dep-cache-ubuntu2204:/mnt/cache - commands: - - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' - - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); rds_path <- '/mnt/cache/packages/weekly_rebuild_ubuntu-2204_amd64.rds'; if (!file.exists(rds_path)) { cat('No RDS file found at', rds_path, '- nothing to rebuild\n'); q('no') }; pkgs <- readRDS(rds_path); if (length(pkgs) == 0) { cat('RDS is empty - nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s: %s\n', x, conditionMessage(e)))) }" 2>&1 - backend_options: - kubernetes: - resources: - requests: - memory: 5Gi - cpu: 3000m - limits: - memory: 18Gi - cpu: 3000m - nodeSelector: - kubernetes.io/arch: amd64 - node.kubernetes.io/instance-type: AX42 - tolerations: - - key: 'CI' - operator: 'Equal' - value: 'true' - effect: 'NoSchedule' -``` - -- [ ] **Step 2: Commit** - -```bash -git add .crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml -git commit -m "feat: add weekly rebuild workflow for ubuntu-2204-amd64" -``` - ---- - -## Task 6: Create remaining 13 rebuild workflows - -**Files:** -- Create: 13 files in `.crow/` (see substitution table below) - -Each file follows the exact same structure as Task 5 with these substitutions: - -| File suffix | PLATFORM | ARCH | Image | Volume | nodeSelector instance-type | -|-------------|----------|------|-------|--------|--------------------------| -| ubuntu-2204-arm64 | ubuntu-2204 | arm64 | reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 | arm64-binaries-r-dep-cache-ubuntu2204 | (omit) | -| ubuntu-2404-amd64 | ubuntu-2404 | amd64 | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | amd64-binaries-r-dep-cache-ubuntu2404 | AX42 | -| ubuntu-2404-arm64 | ubuntu-2404 | arm64 | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | arm64-binaries-r-dep-cache-ubuntu2404 | (omit) | -| alpine-321-amd64 | alpine-321 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | amd64-binaries-r-dep-cache-alpine321 | AX42 | -| alpine-321-arm64 | alpine-321 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | arm64-binaries-r-dep-cache-alpine321 | (omit) | -| alpine-322-amd64 | alpine-322 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | amd64-binaries-r-dep-cache-alpine322 | AX42 | -| alpine-322-arm64 | alpine-322 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | arm64-binaries-r-dep-cache-alpine322 | (omit) | -| alpine-323-amd64 | alpine-323 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | amd64-binaries-r-dep-cache-alpine323 | AX42 | -| alpine-323-arm64 | alpine-323 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | arm64-binaries-r-dep-cache-alpine323 | (omit) | -| redhat-8-amd64 | redhat-8 | amd64 | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | amd64-binaries-r-dep-cache-redhat8 | AX42 | -| redhat-8-arm64 | redhat-8 | arm64 | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | arm64-binaries-r-dep-cache-redhat8 | (omit) | -| redhat-9-amd64 | redhat-9 | amd64 | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | amd64-binaries-r-dep-cache-redhat9 | AX42 | -| redhat-9-arm64 | redhat-9 | arm64 | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | arm64-binaries-r-dep-cache-redhat9 | (omit) | - -**Key substitution points (8 locations):** - -1. `cron:` value — `weekly-rebuild-missing-{suffix}` -2. `evaluate:` value — `'task == "weekly-rebuild-missing-{suffix}"'` -3. `image:` — use the Image column -4. `PLATFORM:` env var — use the PLATFORM column -5. `ARCH:` env var — use the ARCH column -6. `volumes:` — `{ARCH}-binaries-r-dep-cache-{PLATFORM-without-hyphens}:/mnt/cache` -7. `rds_path` in the R command — `weekly_rebuild_{PLATFORM}_{ARCH}.rds` -8. `nodeSelector` — `kubernetes.io/arch: {ARCH}`, plus `node.kubernetes.io/instance-type: AX42` only for amd64 (omit the instance-type line entirely for arm64) - -- [ ] **Step 1: Create all 13 rebuild workflow files** - -Copy the template from Task 5 and substitute per the table. Example for redhat-9-arm64: - -```yaml -when: - - event: cron - cron: weekly-rebuild-missing-redhat-9-arm64 - - event: manual - evaluate: 'task == "weekly-rebuild-missing-redhat-9-arm64"' - -skip_clone: true - -steps: - - name: 'Rebuild missing binaries' - image: reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 - pull: true - environment: - RED_HAT_DEV_PW: - from_secret: RED_HAT_DEV_PW - B2_S3_ACCESS_KEY: - from_secret: B2_S3_ACCESS_KEY - B2_S3_SECRET_KEY: - from_secret: B2_S3_SECRET_KEY - PGPASS: - from_secret: PGPASS - REPO_RO_TOKEN: - from_secret: REPO_RO_TOKEN - GITHUB_PAT: - from_secret: GITHUB_PAT - GIT_USER: pat-s - R_PKG_CACHE_DIR: /mnt/cache/pkgcache - R_LIBS_USER: /mnt/cache/R-pkgs - CCACHE_DIR: /mnt/cache/ccache - PLATFORM: redhat-9 - ARCH: arm64 - NCPUS: 2 - volumes: - - arm64-binaries-r-dep-cache-redhat9:/mnt/cache - commands: - - git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git . - - mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages - - rm -rf /mnt/cache/R-pkgs/00LOCK-* - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' - - XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS=""; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi - - $XVFB $XVFB_ARGS -- R -q -e "sink(stdout(), type = 'message'); options(crayon.enabled = TRUE, Ncpus = $NCPUS, future.globals.onReference = NULL); rds_path <- '/mnt/cache/packages/weekly_rebuild_redhat-9_arm64.rds'; if (!file.exists(rds_path)) { cat('No RDS file found at', rds_path, '- nothing to rebuild\n'); q('no') }; pkgs <- readRDS(rds_path); if (length(pkgs) == 0) { cat('RDS is empty - nothing to rebuild\n'); q('no') }; excluded <- jsonlite::fromJSON('local/excluded-packages.json')[['package']]; pkgs <- setdiff(pkgs, excluded); cat(sprintf('Rebuilding %d packages\n', length(pkgs))); n <- length(pkgs); for (i in seq_along(pkgs)) { x <- pkgs[i]; cat(sprintf('[%d/%d] %s\n', i, n, x)); tryCatch(bincraft::build_binary_package(x, tag_limit = 1L, s3_endpoint = 'https://s3.eu-central-003.backblazeb2.com', s3_region = 'eu-central-003', s3_bucket = 'devxy-rpkgs-binaries', s3_access_key_id = Sys.getenv('B2_S3_ACCESS_KEY'), s3_secret_access_key = Sys.getenv('B2_S3_SECRET_KEY'), metadata_db_host = 'r-binaries.devxy.io', metadata_db_name = 'build_metadata', metadata_db_table = 'single_builds', metadata_db_user = 'rpkgs', metadata_db_password = Sys.getenv('PGPASS'), metadata_db_sslmode = 'require', metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE), error = function(e) cat(sprintf('ERROR building %s: %s\n', x, conditionMessage(e)))) }" 2>&1 - backend_options: - kubernetes: - resources: - requests: - memory: 5Gi - cpu: 3000m - limits: - memory: 18Gi - cpu: 3000m - nodeSelector: - kubernetes.io/arch: arm64 - tolerations: - - key: 'CI' - operator: 'Equal' - value: 'true' - effect: 'NoSchedule' -``` - -Note: arm64 workflows do NOT include `node.kubernetes.io/instance-type: AX42` in nodeSelector. - -Repeat for all 13 remaining suffixes from the table, substituting the 8 locations. - -- [ ] **Step 2: Commit** - -```bash -git add .crow/weekly-rebuild-missing-*.yaml -git commit -m "feat: add remaining 13 weekly rebuild workflows for all platform/arch combos" -``` - ---- - -## Task 7: Final verification - -- [ ] **Step 1: Verify all files exist** - -Run: -```bash -ls -1 local/excluded-packages.json local/weekly-missing-binaries-audit.R -ls -1 .crow/weekly-audit-missing-*.yaml | wc -l -ls -1 .crow/weekly-rebuild-missing-*.yaml | wc -l -``` - -Expected: both files exist, 14 audit workflows, 14 rebuild workflows. - -- [ ] **Step 2: Validate JSON** - -Run: -```bash -python3 -c "import json; json.load(open('local/excluded-packages.json')); print('JSON valid')" -``` - -Expected: `JSON valid` - -- [ ] **Step 3: Validate YAML syntax** - -Run: -```bash -python3 -c " -import yaml, glob -for f in sorted(glob.glob('.crow/weekly-*-missing-*.yaml') + glob.glob('.crow/weekly-audit-missing-*.yaml') + glob.glob('.crow/weekly-rebuild-missing-*.yaml')): - yaml.safe_load(open(f)) - print(f'OK: {f}') -" -``` - -Expected: all files print `OK`. - -- [ ] **Step 4: Verify unique cron names** - -Run: -```bash -grep -h 'cron: weekly-' .crow/weekly-*.yaml | sort | uniq -c | sort -rn | head -``` - -Expected: all counts are 1 (no duplicates). - -- [ ] **Step 5: Verify all 14 platform/arch combos covered** - -Run: -```bash -for suffix in ubuntu-2204-amd64 ubuntu-2204-arm64 ubuntu-2404-amd64 ubuntu-2404-arm64 alpine-321-amd64 alpine-321-arm64 alpine-322-amd64 alpine-322-arm64 alpine-323-amd64 alpine-323-arm64 redhat-8-amd64 redhat-8-arm64 redhat-9-amd64 redhat-9-arm64; do - test -f ".crow/weekly-audit-missing-${suffix}.yaml" || echo "MISSING audit: ${suffix}" - test -f ".crow/weekly-rebuild-missing-${suffix}.yaml" || echo "MISSING rebuild: ${suffix}" -done -echo "All checks passed if no MISSING lines above" -``` - -Expected: no MISSING lines, just "All checks passed". diff --git a/docs/superpowers/plans/2026-05-25-multi-r-version-images.md b/docs/superpowers/plans/2026-05-25-multi-r-version-images.md deleted file mode 100644 index 82a5198..0000000 --- a/docs/superpowers/plans/2026-05-25-multi-r-version-images.md +++ /dev/null @@ -1,1031 +0,0 @@ -# Multi-R-version image refactor — Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. -> Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Refactor every `.crow/` workflow, the `Justfile` recipes, and the commented-out repo-root example to use the new multi-R-version images — drop `R_VERSION` from the image tag and invoke R via `/opt/R/${R_VERSION}/bin/R` instead of `R`/`Rscript` on `PATH`. - -**Architecture:** Pure mechanical refactor across 64 `.crow/*.yaml` workflows, 1 `Justfile`, and 1 commented-root file. -Each workflow gets three kinds of edits: image tag (drop `-` suffix), `R_VERSION` env var (added where it wasn't present), and explicit R path substitution at every call site. -Three correctness bug fixes are folded in: alpine audits use the matching alpine image, package-index workflows use the matching platform image, and `ubuntu-2404` process-updates align to R 4.4.3. - -**Tech Stack:** Woodpecker CI / `crow` (YAML workflows), `just` (Justfile), R 4.4.3 / 4.5.3. - -**Spec:** [`docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md`](../specs/2026-05-25-multi-r-version-images-design.md) - ---- - -## Conventions used throughout this plan - -**Platform → image + R_VERSION mapping:** - -| Platform | New image | `R_VERSION` | -|--------------|-------------------------------------------------|-------------| -| alpine-322 | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| alpine-323 | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| ubuntu-2204 | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` | 4.4.3 | -| ubuntu-2404 | `reg.devxy.io/rpkgs/build-env-ubuntu:noble` | 4.4.3 | -| redhat-8 | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| redhat-9 | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| redhat-10 | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | - -`alpine-321` (audit-only) has no matching new image — falls back to `build-env-alpine:3.23` + `R_VERSION: 4.5.3`. - -**Editing recipe per file (pattern-1 workflows, i.e. those with a hard-coded image tag):** - -1. Replace the `image:` line — drop `-` from the tag. -2. Insert `R_VERSION: ` into the `environment:` block. Anchor the insertion to a line that already exists in that file (typically `R_LIBS_USER:`, falling back to `GIT_USER:` for files that don't cache R libraries). -3. Replace every bare `R ` invocation in `commands:` with `/opt/R/${R_VERSION}/bin/R ` (including `xvfb-run R`, `R CMD`, etc.). -4. Replace every bare `Rscript ` invocation in `commands:` with `/opt/R/${R_VERSION}/bin/Rscript `. - -**Pattern-2 workflows** (image already parameterised via `${OS}`/`${OS_VERSION}`/`${R_VERSION}`) skip step 2 — `R_VERSION` already arrives via `--var`. - -**Why `replace_all` is safe:** The `Edit` tool's `replace_all` is used in the steps below only on tokens that appear nowhere except in workflow command lines (`R -q -e`, `R CMD INSTALL`, `Rscript local/`, `xvfb-run R `). -These tokens never appear inside YAML keys, env vars, comments, or quoted strings within R code in these files (verified by grep). -If a future workflow contains any of these tokens in a non-command context, switch that file to per-line targeted edits. - ---- - -## Task 1: build-all-versions-* workflows (4 files, pattern 2) - -**Files (modify):** - -- `.crow/build-all-versions-amd64.yaml` -- `.crow/build-all-versions-arm64.yaml` -- `.crow/build-all-versions-install-deps-amd64.yaml` -- `.crow/build-all-versions-install-deps-arm64.yaml` - -These workflows already receive `R_VERSION` from `crow pipeline create --var R_VERSION=…`. -Only the image tag and R invocations change. - -- [ ] **Step 1.1: Edit `.crow/build-all-versions-amd64.yaml` — image tag** - -Use `Edit`: - -``` -old_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} -new_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} -``` - -- [ ] **Step 1.2: Edit `.crow/build-all-versions-amd64.yaml` — Rscript invocation** - -Use `Edit`: - -``` -old_string: - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 -new_string: - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- /opt/R/${R_VERSION}/bin/Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 -``` - -- [ ] **Step 1.3: Edit `.crow/build-all-versions-amd64.yaml` — `R -q -e` invocation** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -(The file contains one such line: `R -q -e "bincraft::process_unarchived_pkgs(...)"`.) - -- [ ] **Step 1.4: Repeat steps 1.1–1.3 for `.crow/build-all-versions-arm64.yaml`** - -The three edits are textually identical to steps 1.1–1.3 because the build-arm64 file uses the same parameterised image tag and the same `R -q -e` / `Rscript` invocations. - -- [ ] **Step 1.5: Edit `.crow/build-all-versions-install-deps-amd64.yaml` — image tag** - -Use `Edit`: - -``` -old_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} -new_string: image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} -``` - -- [ ] **Step 1.6: Edit `.crow/build-all-versions-install-deps-amd64.yaml` — `R -q -e` invocations** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -(The file contains four `R -q -e` lines.) - -- [ ] **Step 1.7: Repeat steps 1.5–1.6 for `.crow/build-all-versions-install-deps-arm64.yaml`** - -- [ ] **Step 1.8: Validate** - -Run: - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/build-all-versions-*.yaml | grep -v '/opt/R/' -``` - -Expected: no output. -Any line returned is a missed substitution — investigate before continuing. - -Run: - -```bash -grep -nE 'build-env-.*\$\{OS_VERSION\}-' .crow/build-all-versions-*.yaml -``` - -Expected: no output. - -- [ ] **Step 1.9: Commit** - -```bash -git add .crow/build-all-versions-amd64.yaml .crow/build-all-versions-arm64.yaml .crow/build-all-versions-install-deps-amd64.yaml .crow/build-all-versions-install-deps-arm64.yaml -git commit -m "refactor(ci): use multi-R-version images in build-all-versions workflows - -Drop -\${R_VERSION} from the image tag and invoke R/Rscript via the -explicit /opt/R/\${R_VERSION}/bin/ path." -``` - ---- - -## Task 2: process-updates workflows (14 files, pattern 1) - -**Files (modify):** - -| File | New image | `R_VERSION` | -|-----------------------------------------------|--------------------------------------------|-------------| -| `process-updates-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| `process-updates-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| `process-updates-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| `process-updates-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| `process-updates-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | -| `process-updates-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | -| `process-updates-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | -| `process-updates-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | -| `process-updates-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| `process-updates-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| `process-updates-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| `process-updates-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| `process-updates-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | -| `process-updates-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | - -The two `process-updates-ubuntu-2404-*` files also bump R from `4.4` to `4.4.3` (folded-in bug fix per spec). - -### Worked example: `.crow/process-updates-alpine-322-amd64.yaml` - -- [ ] **Step 2.1: Edit image tag** - -Use `Edit`: - -``` -old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 -new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 -``` - -- [ ] **Step 2.2: Add `R_VERSION` env var** - -Use `Edit` (anchor on `R_LIBS_USER:`, which appears in every process-updates file): - -``` -old_string: R_LIBS_USER: /mnt/cache/R-pkgs -new_string: R_LIBS_USER: /mnt/cache/R-pkgs - R_VERSION: 4.5.3 -``` - -(Preserve the existing six-space indentation.) - -- [ ] **Step 2.3: Substitute R path** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -This covers both bare `R -q -e` and `xvfb-run R -q -e` lines (the latter becomes `xvfb-run /opt/R/${R_VERSION}/bin/R -q -e`, which is correct). - -- [ ] **Step 2.4: Validate this file** - -Run: - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/process-updates-alpine-322-amd64.yaml | grep -v '/opt/R/' -``` - -Expected: no output. - -### Apply the same three-step pattern to the remaining 13 files - -- [ ] **Step 2.5: Apply to `process-updates-alpine-322-arm64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-alpine:3.22` · `R_VERSION: 4.5.3`. -Old image tag suffix: `-4.5` (so `old_string` is `image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5`). - -- [ ] **Step 2.6: Apply to `process-updates-alpine-323-amd64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-alpine:3.23` · `R_VERSION: 4.5.3`. -Old image tag suffix: `-4.5`. - -- [ ] **Step 2.7: Apply to `process-updates-alpine-323-arm64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-alpine:3.23` · `R_VERSION: 4.5.3`. -Old image tag suffix: `-4.5`. - -- [ ] **Step 2.8: Apply to `process-updates-ubuntu-2204-amd64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4.3`. - -- [ ] **Step 2.9: Apply to `process-updates-ubuntu-2204-arm64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4.3`. - -- [ ] **Step 2.10: Apply to `process-updates-ubuntu-2404-amd64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-ubuntu:noble` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4` (note: `4.4` without the patch — bug fix). - -- [ ] **Step 2.11: Apply to `process-updates-ubuntu-2404-arm64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-ubuntu:noble` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4`. - -- [ ] **Step 2.12: Apply to `process-updates-redhat-8-amd64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-redhat:8` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4.3`. - -- [ ] **Step 2.13: Apply to `process-updates-redhat-8-arm64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-redhat:8` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4.3`. - -- [ ] **Step 2.14: Apply to `process-updates-redhat-9-amd64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-redhat:9` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4.3`. - -- [ ] **Step 2.15: Apply to `process-updates-redhat-9-arm64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-redhat:9` · `R_VERSION: 4.4.3`. -Old image tag suffix: `-4.4.3`. - -- [ ] **Step 2.16: Apply to `process-updates-redhat-10-amd64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-redhat:10` · `R_VERSION: 4.5.3`. -Old image tag suffix: `-4.5.3`. - -- [ ] **Step 2.17: Apply to `process-updates-redhat-10-arm64.yaml`** - -Image: `reg.devxy.io/rpkgs/build-env-redhat:10` · `R_VERSION: 4.5.3`. -Old image tag suffix: `-4.5.3`. - -- [ ] **Step 2.18: Validate all 14 files** - -Run: - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/process-updates-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -``` - -Expected: no output (comments starting with `#` are filtered out). - -Run: - -```bash -grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/process-updates-*.yaml -``` - -Expected: no output. - -Run: - -```bash -grep -nE 'R_VERSION:' .crow/process-updates-*.yaml | wc -l -``` - -Expected: `14` (one `R_VERSION:` per file). - -- [ ] **Step 2.19: Commit** - -```bash -git add .crow/process-updates-*.yaml -git commit -m "refactor(ci): use multi-R-version images in process-updates workflows - -Drop the R-version suffix from each image tag, add an explicit -R_VERSION env var per file, and invoke R via -/opt/R/\${R_VERSION}/bin/R at every call site. - -Also aligns ubuntu-2404 process-updates from R 4.4 to R 4.4.3, -matching the audit and rebuild counterparts." -``` - ---- - -## Task 3: weekly-rebuild-missing workflows (14 files, pattern 1) - -**Files (modify):** - -| File | New image | `R_VERSION` | -|---------------------------------------------------|--------------------------------------------|-------------| -| `weekly-rebuild-missing-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| `weekly-rebuild-missing-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| `weekly-rebuild-missing-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| `weekly-rebuild-missing-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| `weekly-rebuild-missing-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | -| `weekly-rebuild-missing-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | -| `weekly-rebuild-missing-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | -| `weekly-rebuild-missing-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | -| `weekly-rebuild-missing-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| `weekly-rebuild-missing-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| `weekly-rebuild-missing-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| `weekly-rebuild-missing-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| `weekly-rebuild-missing-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | -| `weekly-rebuild-missing-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | - -### Worked example: `.crow/weekly-rebuild-missing-alpine-322-amd64.yaml` - -- [ ] **Step 3.1: Edit image tag** - -Use `Edit`: - -``` -old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 -new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 -``` - -- [ ] **Step 3.2: Add `R_VERSION` env var** - -Use `Edit` (anchor on `R_LIBS_USER:`): - -``` -old_string: R_LIBS_USER: /mnt/cache/R-pkgs -new_string: R_LIBS_USER: /mnt/cache/R-pkgs - R_VERSION: 4.5.3 -``` - -- [ ] **Step 3.3: Substitute R path** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -(Also covers `$XVFB $XVFB_ARGS -- R -q -e ...` since the matched substring becomes `/opt/R/${R_VERSION}/bin/R -q -e`.) - -- [ ] **Step 3.4: Validate this file** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/weekly-rebuild-missing-alpine-322-amd64.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -``` - -Expected: no output. - -### Apply the same three-step pattern to the remaining 13 files - -- [ ] **Step 3.5: Apply to `weekly-rebuild-missing-alpine-322-arm64.yaml`** (image alpine:3.22, R_VERSION 4.5.3, old suffix `-4.5`) -- [ ] **Step 3.6: Apply to `weekly-rebuild-missing-alpine-323-amd64.yaml`** (image alpine:3.23, R_VERSION 4.5.3, old suffix `-4.5`) -- [ ] **Step 3.7: Apply to `weekly-rebuild-missing-alpine-323-arm64.yaml`** (image alpine:3.23, R_VERSION 4.5.3, old suffix `-4.5`) -- [ ] **Step 3.8: Apply to `weekly-rebuild-missing-ubuntu-2204-amd64.yaml`** (image ubuntu:jammy, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.9: Apply to `weekly-rebuild-missing-ubuntu-2204-arm64.yaml`** (image ubuntu:jammy, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.10: Apply to `weekly-rebuild-missing-ubuntu-2404-amd64.yaml`** (image ubuntu:noble, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.11: Apply to `weekly-rebuild-missing-ubuntu-2404-arm64.yaml`** (image ubuntu:noble, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.12: Apply to `weekly-rebuild-missing-redhat-8-amd64.yaml`** (image redhat:8, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.13: Apply to `weekly-rebuild-missing-redhat-8-arm64.yaml`** (image redhat:8, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.14: Apply to `weekly-rebuild-missing-redhat-9-amd64.yaml`** (image redhat:9, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.15: Apply to `weekly-rebuild-missing-redhat-9-arm64.yaml`** (image redhat:9, R_VERSION 4.4.3, old suffix `-4.4.3`) -- [ ] **Step 3.16: Apply to `weekly-rebuild-missing-redhat-10-amd64.yaml`** (image redhat:10, R_VERSION 4.5.3, old suffix `-4.5.3`) -- [ ] **Step 3.17: Apply to `weekly-rebuild-missing-redhat-10-arm64.yaml`** (image redhat:10, R_VERSION 4.5.3, old suffix `-4.5.3`) - -- [ ] **Step 3.18: Validate all 14 files** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/weekly-rebuild-missing-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/weekly-rebuild-missing-*.yaml -grep -nE 'R_VERSION:' .crow/weekly-rebuild-missing-*.yaml | wc -l -``` - -Expected: first two return no output; the third returns `14`. - -- [ ] **Step 3.19: Commit** - -```bash -git add .crow/weekly-rebuild-missing-*.yaml -git commit -m "refactor(ci): use multi-R-version images in weekly-rebuild-missing workflows - -Drop the R-version suffix from each image tag, add an explicit -R_VERSION env var per file, and invoke R via -/opt/R/\${R_VERSION}/bin/R at every call site." -``` - ---- - -## Task 4: weekly-audit-missing workflows (16 files, pattern 1) - -This task folds in the **alpine audit bug fix**: all six `weekly-audit-missing-alpine-*` files currently point at `alpine:3.23-4.5` regardless of platform, even when the platform is alpine-321 or alpine-322. - -**Files (modify):** - -| File | New image | `R_VERSION` | Old tag | -|---------------------------------------------------|--------------------------------------------|-------------|---------| -| `weekly-audit-missing-alpine-321-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | -| `weekly-audit-missing-alpine-321-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | -| `weekly-audit-missing-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | `3.23-4.5` (bug fix: was wrong) | -| `weekly-audit-missing-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | `3.23-4.5` (bug fix) | -| `weekly-audit-missing-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | -| `weekly-audit-missing-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | `3.23-4.5` | -| `weekly-audit-missing-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | `jammy-4.4.3` | -| `weekly-audit-missing-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | `jammy-4.4.3` | -| `weekly-audit-missing-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | `noble-4.4.3` | -| `weekly-audit-missing-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | `noble-4.4.3` | -| `weekly-audit-missing-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | `8-4.4.3` | -| `weekly-audit-missing-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | `8-4.4.3` | -| `weekly-audit-missing-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | `9-4.4.3` | -| `weekly-audit-missing-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | `9-4.4.3` | -| `weekly-audit-missing-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | `10-4.5.3` | -| `weekly-audit-missing-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | `10-4.5.3` | - -### Worked example: `.crow/weekly-audit-missing-alpine-322-amd64.yaml` (includes bug fix) - -- [ ] **Step 4.1: Edit image tag** - -Use `Edit`: - -``` -old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 -new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 -``` - -Note: this both drops the R version AND fixes the OS-version mismatch (was 3.23, should be 3.22). - -- [ ] **Step 4.2: Add `R_VERSION` env var** - -Use `Edit` (anchor on `R_LIBS_USER:`, which appears in every weekly-audit-missing file): - -``` -old_string: R_LIBS_USER: /mnt/cache/R-pkgs -new_string: R_LIBS_USER: /mnt/cache/R-pkgs - R_VERSION: 4.5.3 -``` - -- [ ] **Step 4.3: Substitute R path** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -- [ ] **Step 4.4: Validate this file** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/weekly-audit-missing-alpine-322-amd64.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -``` - -Expected: no output. - -### Apply the same three-step pattern to the remaining 15 files - -For each file, use its row in the table above to get the new image and `R_VERSION`. -The `old_string` for the image tag edit is `image: reg.devxy.io/rpkgs/build-env-`, where `` is the "Old tag" column. - -- [ ] **Step 4.5: Apply to `weekly-audit-missing-alpine-321-amd64.yaml`** (new image alpine:3.23, R_VERSION 4.5.3, old tag suffix `-4.5`) -- [ ] **Step 4.6: Apply to `weekly-audit-missing-alpine-321-arm64.yaml`** (alpine:3.23, 4.5.3, old `-4.5`) -- [ ] **Step 4.7: Apply to `weekly-audit-missing-alpine-322-arm64.yaml`** (alpine:3.22, 4.5.3, old `-4.5` — image bug fix) -- [ ] **Step 4.8: Apply to `weekly-audit-missing-alpine-323-amd64.yaml`** (alpine:3.23, 4.5.3, old `-4.5`) -- [ ] **Step 4.9: Apply to `weekly-audit-missing-alpine-323-arm64.yaml`** (alpine:3.23, 4.5.3, old `-4.5`) -- [ ] **Step 4.10: Apply to `weekly-audit-missing-ubuntu-2204-amd64.yaml`** (ubuntu:jammy, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.11: Apply to `weekly-audit-missing-ubuntu-2204-arm64.yaml`** (ubuntu:jammy, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.12: Apply to `weekly-audit-missing-ubuntu-2404-amd64.yaml`** (ubuntu:noble, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.13: Apply to `weekly-audit-missing-ubuntu-2404-arm64.yaml`** (ubuntu:noble, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.14: Apply to `weekly-audit-missing-redhat-8-amd64.yaml`** (redhat:8, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.15: Apply to `weekly-audit-missing-redhat-8-arm64.yaml`** (redhat:8, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.16: Apply to `weekly-audit-missing-redhat-9-amd64.yaml`** (redhat:9, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.17: Apply to `weekly-audit-missing-redhat-9-arm64.yaml`** (redhat:9, 4.4.3, old `-4.4.3`) -- [ ] **Step 4.18: Apply to `weekly-audit-missing-redhat-10-amd64.yaml`** (redhat:10, 4.5.3, old `-4.5.3`) -- [ ] **Step 4.19: Apply to `weekly-audit-missing-redhat-10-arm64.yaml`** (redhat:10, 4.5.3, old `-4.5.3`) - -- [ ] **Step 4.20: Validate all 16 files** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/weekly-audit-missing-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/weekly-audit-missing-*.yaml -grep -nE 'R_VERSION:' .crow/weekly-audit-missing-*.yaml | wc -l -``` - -Expected: first two return no output; the third returns `16`. - -Also verify the alpine bug fix took effect: - -```bash -grep -E 'image:' .crow/weekly-audit-missing-alpine-*.yaml -``` - -Expected: - -``` -.crow/weekly-audit-missing-alpine-321-amd64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 -.crow/weekly-audit-missing-alpine-321-arm64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 -.crow/weekly-audit-missing-alpine-322-amd64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 -.crow/weekly-audit-missing-alpine-322-arm64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 -.crow/weekly-audit-missing-alpine-323-amd64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 -.crow/weekly-audit-missing-alpine-323-arm64.yaml: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 -``` - -- [ ] **Step 4.21: Commit** - -```bash -git add .crow/weekly-audit-missing-*.yaml -git commit -m "refactor(ci): use multi-R-version images in weekly-audit-missing workflows - -Drop the R-version suffix from each image tag, add an explicit -R_VERSION env var per file, and invoke R via -/opt/R/\${R_VERSION}/bin/R at every call site. - -Also fixes the alpine-322 audit image, which was previously pointing -at alpine:3.23 instead of alpine:3.22. The alpine-321 audits stay on -alpine:3.23 since no 3.21 image exists in the new scheme — they only -query S3/CRAN, so the container OS does not affect correctness." -``` - ---- - -## Task 5: update-package-index workflows (14 files, pattern 1) - -This task folds in the **package-index image bug fix**: every `update-package-index-*` file currently uses `build-env-ubuntu:noble-4.4` (or `noble-4.5` in the redhat-10 case) regardless of which platform's package index it uploads. -After the refactor, each file uses the image that matches its own platform per the mapping table. - -The first step (`Upload PACKAGES files`) needs the refactor; the second step (`Purge CDN cache`) uses `alpine:3.23` directly, has no R calls, and is unchanged. - -**Files (modify):** - -| File | New image | `R_VERSION` | -|---------------------------------------------------|--------------------------------------------|-------------| -| `update-package-index-alpine-322-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| `update-package-index-alpine-322-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| `update-package-index-alpine-323-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| `update-package-index-alpine-323-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| `update-package-index-ubuntu-2204-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | -| `update-package-index-ubuntu-2204-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy`| 4.4.3 | -| `update-package-index-ubuntu-2404-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | -| `update-package-index-ubuntu-2404-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-ubuntu:noble`| 4.4.3 | -| `update-package-index-redhat-8-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| `update-package-index-redhat-8-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| `update-package-index-redhat-9-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| `update-package-index-redhat-9-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| `update-package-index-redhat-10-amd64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | -| `update-package-index-redhat-10-arm64.yaml` | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | - -### Worked example: `.crow/update-package-index-alpine-322-amd64.yaml` - -The current image is `build-env-ubuntu:noble-4.4` (a *wrong* OS); we repoint to `build-env-alpine:3.22` (the matching OS) and add R_VERSION. - -- [ ] **Step 5.1: Edit image tag** - -Use `Edit`: - -``` -old_string: image: reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4 -new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.22 -``` - -- [ ] **Step 5.2: Add `R_VERSION` env var** - -Use `Edit` (anchor on `R_LIBS_USER:`, which appears in every update-package-index file): - -``` -old_string: R_LIBS_USER: /mnt/cache/R-pkgs -new_string: R_LIBS_USER: /mnt/cache/R-pkgs - R_VERSION: 4.5.3 -``` - -- [ ] **Step 5.3: Substitute R path** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -- [ ] **Step 5.4: Validate this file** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/update-package-index-alpine-322-amd64.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -``` - -Expected: no output. - -### Apply the same three-step pattern to the remaining 13 files - -Old image tag for every file in this task except `update-package-index-redhat-10-amd64.yaml` is `reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4`. -For `update-package-index-redhat-10-amd64.yaml`, the old image tag is `reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.5` (verify with `grep image: .crow/update-package-index-redhat-10-amd64.yaml` before editing). - -- [ ] **Step 5.5: Apply to `update-package-index-alpine-322-arm64.yaml`** (new alpine:3.22, R_VERSION 4.5.3, old `noble-4.4`) -- [ ] **Step 5.6: Apply to `update-package-index-alpine-323-amd64.yaml`** (alpine:3.23, 4.5.3, old `noble-4.4`) -- [ ] **Step 5.7: Apply to `update-package-index-alpine-323-arm64.yaml`** (alpine:3.23, 4.5.3, old `noble-4.4`) -- [ ] **Step 5.8: Apply to `update-package-index-ubuntu-2204-amd64.yaml`** (ubuntu:jammy, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.9: Apply to `update-package-index-ubuntu-2204-arm64.yaml`** (ubuntu:jammy, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.10: Apply to `update-package-index-ubuntu-2404-amd64.yaml`** (ubuntu:noble, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.11: Apply to `update-package-index-ubuntu-2404-arm64.yaml`** (ubuntu:noble, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.12: Apply to `update-package-index-redhat-8-amd64.yaml`** (redhat:8, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.13: Apply to `update-package-index-redhat-8-arm64.yaml`** (redhat:8, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.14: Apply to `update-package-index-redhat-9-amd64.yaml`** (redhat:9, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.15: Apply to `update-package-index-redhat-9-arm64.yaml`** (redhat:9, 4.4.3, old `noble-4.4`) -- [ ] **Step 5.16: Apply to `update-package-index-redhat-10-amd64.yaml`** (redhat:10, 4.5.3, old `noble-4.5` — note the `4.5` not `4.4`!) -- [ ] **Step 5.17: Apply to `update-package-index-redhat-10-arm64.yaml`** (redhat:10, 4.5.3, old `noble-4.4`) - -- [ ] **Step 5.18: Validate all 14 files** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/update-package-index-*.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/update-package-index-*.yaml -grep -nE '^\s*R_VERSION:' .crow/update-package-index-*.yaml | wc -l -``` - -Expected: first two return no output; the third returns `14`. - -Verify each file's image matches its platform: - -```bash -grep -E '^\s*image: reg.devxy.io/rpkgs/build-env' .crow/update-package-index-*.yaml -``` - -Expected: each file's image OS/version matches its platform suffix (alpine-322 → alpine:3.22, ubuntu-2404 → ubuntu:noble, redhat-10 → redhat:10, etc.). - -- [ ] **Step 5.19: Commit** - -```bash -git add .crow/update-package-index-*.yaml -git commit -m "refactor(ci): use multi-R-version images in update-package-index workflows - -Drop the R-version suffix from each image tag, add an explicit -R_VERSION env var per file, and invoke R via -/opt/R/\${R_VERSION}/bin/R at every call site. - -Also repoints every update-package-index workflow at the image that -matches its own platform (was previously pinned to -build-env-ubuntu:noble-4.4 / noble-4.5 regardless of platform)." -``` - ---- - -## Task 6: archive-missed-packages workflow (1 file) - -**File (modify):** `.crow/archive-missed-packages.yaml` - -The image OS doesn't matter for this workflow (it only writes to S3 + Postgres). -It currently uses `build-env-alpine:3.23-4.5`; the new image keeps alpine:3.23 and picks R 4.5.3 explicitly. -Note: this file has no `R_LIBS_USER` env var, so anchor the `R_VERSION` insertion on `GIT_USER: pat-s` (a line that *is* present). - -- [ ] **Step 6.1: Edit image tag** - -Use `Edit`: - -``` -old_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 -new_string: image: reg.devxy.io/rpkgs/build-env-alpine:3.23 -``` - -- [ ] **Step 6.2: Add `R_VERSION` env var** - -Use `Edit` (anchor on `GIT_USER:`): - -``` -old_string: GIT_USER: pat-s -new_string: GIT_USER: pat-s - R_VERSION: 4.5.3 -``` - -- [ ] **Step 6.3: Substitute R path** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -- [ ] **Step 6.4: Validate** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/archive-missed-packages.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -grep -nE 'build-env-.*:[^[:space:]]*-[0-9]' .crow/archive-missed-packages.yaml -``` - -Expected: both return no output. - -- [ ] **Step 6.5: Commit** - -```bash -git add .crow/archive-missed-packages.yaml -git commit -m "refactor(ci): use multi-R-version image in archive-missed-packages - -Drop the R-version suffix from the image tag and invoke R via the -explicit /opt/R/\${R_VERSION}/bin/R path. The image OS does not -matter for this workflow; it stays on alpine:3.23." -``` - ---- - -## Task 7: build-r-minor-sensitive-packages workflow (1 file) - -**File (modify):** `.crow/build-r-minor-sensitive-packages.yaml` - -This is the only workflow on the `docker.io/devxygmbh/` registry, with lowercase matrix variables. -Per the spec decision: keep the registry, drop `-${r_version}` from the tag, update the matrix to use full patch versions, and substitute the explicit R path (including `R CMD INSTALL`). - -- [ ] **Step 7.1: Bump matrix to full-patch R versions** - -Use `Edit`: - -``` -old_string: - os: alpine - os_version: 3.21 - r_version: 4.5 - - os: alpine - os_version: 3.21 - r_version: 4.4 -new_string: - os: alpine - os_version: 3.21 - r_version: 4.5.3 - - os: alpine - os_version: 3.21 - r_version: 4.4.3 -``` - -- [ ] **Step 7.2: Edit image tag** - -Use `Edit`: - -``` -old_string: image: "docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}-${r_version}" -new_string: image: "docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}" -``` - -- [ ] **Step 7.3: Substitute `R CMD INSTALL` invocation** - -Use `Edit`: - -``` -old_string: git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft && R CMD INSTALL --library=/tmp/R-libs /tmp/bincraft && R -q -e 'packageVersion("bincraft")' -new_string: git clone -q https://codefloe.com/rpkgs/bincraft.git /tmp/bincraft && /opt/R/${r_version}/bin/R CMD INSTALL --library=/tmp/R-libs /tmp/bincraft && /opt/R/${r_version}/bin/R -q -e 'packageVersion("bincraft")' -``` - -- [ ] **Step 7.4: Substitute the remaining R invocation** - -Use `Edit`: - -``` -old_string: $XVFB -- R -q -e -new_string: $XVFB -- /opt/R/${r_version}/bin/R -q -e -``` - -- [ ] **Step 7.5: Validate** - -```bash -grep -nE '(^|[^/])R(script)? ' .crow/build-r-minor-sensitive-packages.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:#' -grep -nE 'rpkgs-build-env-.*:[^[:space:]]*-[0-9]' .crow/build-r-minor-sensitive-packages.yaml -``` - -Expected: both return no output. - -- [ ] **Step 7.6: Commit** - -```bash -git add .crow/build-r-minor-sensitive-packages.yaml -git commit -m "refactor(ci): use multi-R-version image in build-r-minor-sensitive-packages - -Drop -\${r_version} from the docker.io/devxygmbh tag and invoke R -via the explicit /opt/R/\${r_version}/bin/R path (including -R CMD INSTALL). Bumps the matrix r_version values from 4.5/4.4 to -the full-patch 4.5.3/4.4.3, matching the rest of the refactor's -'always full patch' rule." -``` - ---- - -## Task 8: Justfile (3 recipes) - -**File (modify):** `Justfile` - -Three recipes use `docker run … reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} …`. -Drop `-{{R_VERSION}}` from each image tag and substitute `/opt/R/{{R_VERSION}}/bin/R` for every `R ` inside the `bash -c '…'` strings. - -The example comment lines above each recipe still mention `4.5.0` and `3.21` (which no longer have matching images). -Update those examples to a current platform/R combination so they remain runnable. - -- [ ] **Step 8.1: Update `build-all` recipe and its example comment** - -Use `Edit`: - -``` -old_string: # just build-all alpine 3.21 arm64 4.5.0 odbc 1 -build-all OS OS_VERSION ARCH R_VERSION PACKAGE NCPUS: - docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} bash -c 'R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' -new_string: # just build-all alpine 3.22 arm64 4.5.3 odbc 1 -build-all OS OS_VERSION ARCH R_VERSION PACKAGE NCPUS: - docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} bash -c '/opt/R/{{R_VERSION}}/bin/R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && /opt/R/{{R_VERSION}}/bin/R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' -``` - -- [ ] **Step 8.2: Update `build-single` recipe and its example comments** - -Use `Edit`: - -``` -old_string: # just build-single alpine 3.21 arm64 4.5.0 odbc 1.5.0 1 -# just build-single alpine 3.22 arm64 4.5.0 sf latest 1 -# just build-single ubuntu noble arm64 4.2.3 rlang 1.1.6 1 -build-single OS OS_VERSION ARCH R_VERSION PACKAGE TAG NCPUS: - docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} bash -c 'R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", tag = \"{{TAG}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' -new_string: # just build-single alpine 3.22 arm64 4.5.3 odbc 1.5.0 1 -# just build-single alpine 3.22 arm64 4.5.3 sf latest 1 -# just build-single ubuntu noble arm64 4.4.3 rlang 1.1.6 1 -build-single OS OS_VERSION ARCH R_VERSION PACKAGE TAG NCPUS: - docker run --rm -it --platform linux/{{ARCH}} -v ./:/package -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" -e NCPUS={{NCPUS}} --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} bash -c '/opt/R/{{R_VERSION}}/bin/R -q -e "install.packages(\"pak\", repos = sprintf(\"https://r-lib.github.io/p/pak/stable/%s/%s/%s\", .Platform\$pkgType, R.Version()\$os, R.Version()\$arch))" && /opt/R/{{R_VERSION}}/bin/R -q -e "pak::pak(\"git::https://codefloe.com/rpkgs/bincraft.git\")" && /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::build_binary_package(\"{{PACKAGE}}\", tag = \"{{TAG}}\", platform = \"{{OS}}\", force=TRUE, s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)"' -``` - -- [ ] **Step 8.3: Update `process-updates` recipe and its example comment** - -Use `Edit`: - -``` -old_string: # just process-updates redhat 9 arm64 4.4.3 'lubridate::interval(lubridate::today() - 4, lubridate::today() - 4)' -process-updates OS OS_VERSION ARCH R_VERSION interval: - docker run --rm -it --platform linux/{{ARCH}} -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} R -q -e "bincraft::process_cran_updates(interval = {{interval}}, platform = \"{{OS}}\", s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" -new_string: # just process-updates redhat 9 arm64 4.4.3 'lubridate::interval(lubridate::today() - 4, lubridate::today() - 4)' -process-updates OS OS_VERSION ARCH R_VERSION interval: - docker run --rm -it --platform linux/{{ARCH}} -e AWS_ACCESS_KEY_ID="$HETZNER_S3_ACCESS_KEY_K3S" -e AWS_SECRET_ACCESS_KEY="$HETZNER_S3_SECRET_KEY_K3S" -e PGPASS="$PGPASS" --pull=always reg.devxy.io/rpkgs/build-env-{{OS}}:{{OS_VERSION}} /opt/R/{{R_VERSION}}/bin/R -q -e "bincraft::process_cran_updates(interval = {{interval}}, platform = \"{{OS}}\", s3_endpoint = \"https://hel1.your-objectstorage.com\", s3_region = \"hel1\", s3_bucket = \"devxy-r-package-binaries-hel1\", s3_access_key_id = Sys.getenv(\"HETZNER_S3_ACCESS_KEY_K3S\"), s3_secret_access_key = Sys.getenv(\"HETZNER_S3_SECRET_KEY_K3S\"), metadata_db_host = \"r-binaries.devxy.io\", metadata_db_name = \"build_metadata\", metadata_db_table = \"single_builds\", metadata_db_user = \"rpkgs\", metadata_db_password = Sys.getenv(\"PGPASS\"), metadata_db_sslmode = \"require\", metadata_db_port = 15432, archive = TRUE, upload = TRUE, store_build_metadata = TRUE)" -``` - -- [ ] **Step 8.4: Validate** - -```bash -grep -nE 'build-env-.*\{\{OS_VERSION\}\}-' Justfile -grep -nE "(^|[^/])R " Justfile | grep -v '/opt/R/' -``` - -Expected: both return no output. - -- [ ] **Step 8.5: Commit** - -```bash -git add Justfile -git commit -m "refactor(justfile): use multi-R-version images in build/process recipes - -Drop -{{R_VERSION}} from the image tag and invoke R via the explicit -/opt/R/{{R_VERSION}}/bin/R path in build-all, build-single, and -process-updates. Updates example comments to use current -platform/R combinations." -``` - ---- - -## Task 9: Commented-out build-all-versions-install-deps.yaml in repo root (1 file) - -**File (modify):** `build-all-versions-install-deps.yaml` (the *commented-out* template at repo root, not the active files under `.crow/`). - -Keep the example in sync with the active workflows so it remains a faithful template. -Every line in this file is prefixed with `# ` (block-comment); the substitutions still happen inside the comments. - -- [ ] **Step 9.1: Edit image tag (inside comment)** - -Use `Edit`: - -``` -old_string: # image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} -new_string: # image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} -``` - -- [ ] **Step 9.2: Substitute R path inside commented commands** - -Use `Edit` with `replace_all: true`: - -``` -old_string: R -q -e -new_string: /opt/R/${R_VERSION}/bin/R -q -e -``` - -(Three `R -q -e` lines are inside the commented commands block.) - -- [ ] **Step 9.3: Validate** - -```bash -grep -nE '(^|[^/])R(script)? ' build-all-versions-install-deps.yaml | grep -v '/opt/R/' | grep -v '^[^:]*:[0-9]*:# *#' -``` - -Expected: no output (filters out lines that are nested-commented). - -- [ ] **Step 9.4: Commit** - -```bash -git add build-all-versions-install-deps.yaml -git commit -m "refactor: keep commented build-all-versions-install-deps example in sync - -Mirror the multi-R-version image refactor in the commented-out -template so the example remains faithful to active .crow workflows." -``` - ---- - -## Task 10: Final repo-wide validation - -No code edits — just a comprehensive grep sweep across every file the previous tasks touched. -Any failures discovered here mean a previous task missed an edit; go back and fix the offending file, commit separately, then re-run this validation. - -- [ ] **Step 10.1: Verify no bare R/Rscript invocations remain in any workflow** - -Run: - -```bash -grep -rnE '(^|[^/])R(script)? ' .crow/ Justfile build-all-versions-install-deps.yaml | grep -v '/opt/R/' | grep -vE '^[^:]*:[0-9]+:\s*#' -``` - -Expected: no output. - -If output appears, inspect each match. False positives are possible only for content unrelated to R invocation (e.g., a yaml key starting with "R" or text inside an R code string). -True positives are missed substitutions — fix and recommit. - -- [ ] **Step 10.2: Verify no old-style image tags remain** - -Run: - -```bash -grep -rnE 'build-env-[a-z]+:[^[:space:]]*-[0-9]+\.[0-9]' .crow/ Justfile build-all-versions-install-deps.yaml -``` - -Expected: no output. - -- [ ] **Step 10.3: Verify every pattern-1 workflow declares `R_VERSION`** - -Pattern-1 workflows hard-code the image tag and therefore need an explicit `R_VERSION:` env var. -Pattern-2 workflows (the four `build-all-versions-*` files) receive `R_VERSION` from `--var` and should NOT have it in their `environment:` block. - -Count files in each group: - -```bash -# Pattern-1 files that MUST have R_VERSION: in their environment block. -# Total expected: 14 (process-updates) + 14 (weekly-rebuild) + 16 (weekly-audit) -# + 14 (update-package-index) + 1 (archive-missed-packages) = 59 -ls .crow/process-updates-*.yaml .crow/weekly-rebuild-missing-*.yaml .crow/weekly-audit-missing-*.yaml .crow/update-package-index-*.yaml .crow/archive-missed-packages.yaml | wc -l -# Expected: 59 - -grep -lE '^\s+R_VERSION:' .crow/process-updates-*.yaml .crow/weekly-rebuild-missing-*.yaml .crow/weekly-audit-missing-*.yaml .crow/update-package-index-*.yaml .crow/archive-missed-packages.yaml | wc -l -# Expected: 59 - -# Pattern-2 files that MUST NOT have a top-level R_VERSION: env var -grep -nE '^\s+R_VERSION:' .crow/build-all-versions-*.yaml -# Expected: no output -``` - -- [ ] **Step 10.4: Spot-check one file end-to-end** - -Read `.crow/process-updates-alpine-322-amd64.yaml` and visually confirm: - -1. `image: reg.devxy.io/rpkgs/build-env-alpine:3.22` (no `-4.5`) -2. `R_VERSION: 4.5.3` appears in the `environment:` block -3. Every `R …` line in `commands:` is prefixed by `/opt/R/${R_VERSION}/bin/` - -Repeat for `.crow/update-package-index-redhat-10-amd64.yaml` (the one with the old `noble-4.5` tag). -Repeat for `.crow/build-r-minor-sensitive-packages.yaml` (the lowercase-var, docker.io-registry file). - -- [ ] **Step 10.5: Verify smoke-test list is ready** - -Confirm the following workflows exist and are unchanged in shape; they are the targets for post-merge smoke runs (one per workflow type, per spec §Validation): - -```bash -ls -1 \ - .crow/process-updates-alpine-322-amd64.yaml \ - .crow/weekly-rebuild-missing-redhat-9-amd64.yaml \ - .crow/weekly-audit-missing-ubuntu-2204-amd64.yaml \ - .crow/update-package-index-redhat-10-amd64.yaml \ - .crow/archive-missed-packages.yaml \ - .crow/build-all-versions-amd64.yaml \ - .crow/build-all-versions-install-deps-amd64.yaml \ - .crow/build-r-minor-sensitive-packages.yaml -``` - -Expected: all eight files listed, no errors. -Smoke runs are out of scope for this plan (they happen after the PR merges). - -- [ ] **Step 10.6: Final no-op commit only if any fix-up was needed** - -If steps 10.1–10.5 surfaced any issues that required edits, commit those fixes here: - -```bash -git add -A -git commit -m "fix(ci): catch missed substitutions from multi-R-version refactor" -``` - -If everything was clean, no commit is needed for this step. - ---- - -## Notes for the executing engineer - -- **No tests to run.** This refactor changes CI workflow files; correctness is validated by `grep` checks at each task boundary and by smoke runs after merge. -- **Order doesn't matter between tasks 1–7.** Each task is independent and self-committing. Tasks 8–9 (Justfile, commented file) are also independent. Task 10 is final and depends on all others being complete. -- **If `Edit` complains that an `old_string` isn't unique:** add more surrounding context to disambiguate. The Edit tool requires the `old_string` to match exactly one location in the file. -- **`replace_all` safety:** the tokens we use it on (`R -q -e`, `R CMD INSTALL`, etc.) were verified by grep to appear only inside workflow command lines, never inside YAML structure or unrelated content. If a future workflow violates that assumption, switch to per-line targeted edits. -- **Don't squash commits.** Each task produces a logically coherent commit; keeping them separate makes `git bisect` useful if a smoke run regresses. diff --git a/docs/superpowers/specs/2026-04-11-weekly-missing-binaries-design.md b/docs/superpowers/specs/2026-04-11-weekly-missing-binaries-design.md deleted file mode 100644 index 8ddb71b..0000000 --- a/docs/superpowers/specs/2026-04-11-weekly-missing-binaries-design.md +++ /dev/null @@ -1,246 +0,0 @@ -# Weekly Missing Binaries Audit & Rebuild - -## Goal - -A weekly CI workflow that identifies CRAN packages whose latest release version has no binary available, reports them in Forgejo issues grouped by OS family and arch, and rebuilds those that have no prior build failure recorded in the database. - -## Architecture Overview - -Two independent workflow sets, each with one file per platform/arch combo (14 files each), plus a shared R script and an excluded-packages config file. - -``` -weekly-audit-missing-*-*.yaml (14 files) - │ - ▼ -local/weekly-missing-binaries-audit.R - │ - ├── Updates Forgejo issues (3 issues, one per OS family) - └── Writes RDS files to /mnt/cache/packages/ - -weekly-rebuild-missing-*-*.yaml (14 files) - │ - ▼ - Reads RDS, builds missing packages via bincraft::build_binary_package() -``` - -The audit and build workflows are fully independent. -Either can be triggered on its own via cron or manually. - -## Platforms - -All current platform/arch combinations: - -| Platform | Arch | Image | Codename | -|-------------|-------|-------------------------------------------------|------------| -| ubuntu-2204 | amd64 | reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 | jammy | -| ubuntu-2204 | arm64 | reg.devxy.io/rpkgs/build-env-ubuntu:jammy-4.4.3 | jammy | -| ubuntu-2404 | amd64 | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | noble | -| ubuntu-2404 | arm64 | reg.devxy.io/rpkgs/build-env-ubuntu:noble-4.4.3 | noble | -| alpine-321 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | alpine321 | -| alpine-321 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.21-4.5 | alpine321 | -| alpine-322 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | alpine322 | -| alpine-322 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 | alpine322 | -| alpine-323 | amd64 | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | alpine323 | -| alpine-323 | arm64 | reg.devxy.io/rpkgs/build-env-alpine:3.23-4.5 | alpine323 | -| redhat-8 | amd64 | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | rhel8 | -| redhat-8 | arm64 | reg.devxy.io/rpkgs/build-env-redhat:8-4.4.3 | rhel8 | -| redhat-9 | amd64 | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | rhel9 | -| redhat-9 | arm64 | reg.devxy.io/rpkgs/build-env-redhat:9-4.4.3 | rhel9 | - -## Component 1: Excluded Packages Config - -**File:** `local/excluded-packages.json` - -A JSON array of objects with `package` and `reason` fields: - -```json -[ - {"package": "RInno", "reason": "windows-only"}, - {"package": "KeyboardSimulator", "reason": "windows-only"}, - {"package": "doBy", "reason": "hang"}, - {"package": "frailtypack", "reason": "hang"}, - ... -] -``` - -This file is the single source of truth for packages that should be skipped. -Both the audit script and rebuild workflows read from it. - -The existing `build-all-versions-*.yaml` workflows retain their inline lists for now (migration is out of scope). - -## Component 2: Audit R Script - -**File:** `local/weekly-missing-binaries-audit.R` - -**Environment variables consumed:** -- `PLATFORM` — e.g. `ubuntu-2204`, `alpine-321`, `redhat-9` -- `ARCH` — `amd64` or `arm64` -- `B2_S3_ACCESS_KEY`, `B2_S3_SECRET_KEY` — S3 credentials -- `PGPASS` — PostgreSQL password -- `FORGEJO_TOKEN` — API token for issue updates - -The workflow commands (not the R script) also use: -- `REPO_RO_TOKEN` — for `git clone` in the workflow commands - -**Logic:** - -1. Parse `PLATFORM` to derive OS family (`Ubuntu`, `Alpine`, `Red Hat`) and S3 codename (e.g. `ubuntu-2204` -> `jammy`, `redhat-9` -> `rhel9`). -2. Fetch CRAN release packages via `tools::CRAN_package_db()` — extract `Package` and `Version`. -3. List S3 tarballs at `devxy-rpkgs-binaries/{arch}/{codename}/latest/src/contrib/` and parse `{name}_{version}.tar.gz`. -4. Find packages where the CRAN release version is missing from S3. -5. Read `local/excluded-packages.json` and remove those packages from the missing list. -6. Query the `single_builds` DB table: for each missing package+version+platform+arch, check if `error_occurred = TRUE`. Split into: - - **Rebuildable:** missing, not excluded, no prior failure for this version - - **Known failures:** missing, not excluded, but has a recorded failure for this version -7. Write the rebuildable package list (names only) to `/mnt/cache/packages/weekly_rebuild_{platform}_{arch}.rds`. -8. Update the Forgejo issue for this OS family. - -**Issue update logic:** - -- Issue title: `Missing package binaries for latest version ()` where OS family is `Ubuntu`, `Alpine`, or `Red Hat`. -- Search for existing open issue via `GET /api/v1/repos/devxy/build-cran-binaries/issues?type=issues&state=open&q=`. Match by exact title. -- If found, read the existing body, replace the section for this platform/arch, and `PATCH` the issue. -- If not found, `POST` a new issue with just this platform/arch section. - -**Issue body format:** - -```markdown -_Last updated: 2026-04-11_ - -## ubuntu-2204 - -### amd64 (12 missing, 8 to rebuild) -- ggplot2 (3.5.2) -- dplyr (1.1.5) -- ... - -#### Known build failures -- somepkg (1.0.0) - -### arm64 (5 missing, 5 to rebuild) -- ... - -## ubuntu-2404 - -### amd64 (3 missing, 3 to rebuild) -- ... - -### arm64 (0 missing) -All binaries available. - ---- - -## Excluded packages -doBy (hang), frailtypack (hang), RInno (windows-only), ... -``` - -Each audit workflow run updates only its own platform/arch section within the issue. -The "Excluded packages" section and "Last updated" timestamp are rewritten on every run. - -**Section replacement strategy:** -The script parses the existing issue body as markdown, finds the `## {platform}` + `### {arch}` section, replaces it, and writes back the full body. -If the section doesn't exist yet, it's appended under the correct `## {platform}` header (or a new one is created). - -## Component 3: Audit Workflows - -**Files:** 14 files, named `weekly-audit-missing-{platform}-{arch}.yaml` - -Example: `.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml` - -**Trigger:** -```yaml -when: - - event: cron - cron: weekly-audit-missing-ubuntu-2204-amd64 - - event: manual - evaluate: 'task == "weekly-audit-missing-ubuntu-2204-amd64"' -``` - -**Step:** Lightweight — clones repo, installs bincraft + dependencies, runs the audit R script. - -**Container:** Uses the platform-appropriate build image (needed for correct platform identification), but with minimal resource requests since no building happens. - -**Resources:** ~2Gi memory, 2 CPUs. - -## Component 4: Rebuild Workflows - -**Files:** 14 files, named `weekly-rebuild-missing-{platform}-{arch}.yaml` - -Example: `.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml` - -**Trigger:** -```yaml -when: - - event: cron - cron: weekly-rebuild-missing-ubuntu-2204-amd64 - - event: manual - evaluate: 'task == "weekly-rebuild-missing-ubuntu-2204-amd64"' -``` - -**Step:** - -1. Clone repo, install bincraft. -2. Read `local/excluded-packages.json` as a safety net. -3. Read `/mnt/cache/packages/weekly_rebuild_{platform}_{arch}.rds`. If missing or empty, exit 0. -4. Filter out excluded packages (double-check). -5. Iterate and call `bincraft::build_binary_package()` for each package with `tag_limit = 1L`. - Same S3/DB parameters as existing build workflows. -6. Uses `xvfb-run` / `xwfb-run` for graphical packages (same pattern as existing builds). - -**Resources:** Same as `process-updates` workflows — 5Gi request, 18Gi limit, 3 CPUs. - -**Cache volume:** Maps `${ARCH}-binaries-r-dep-cache-${PLATFORM}:/mnt/cache` (same volumes as existing builds, so the RDS files written by audit are visible). - -## Secrets Required - -All existing secrets are reused: -- `B2_S3_ACCESS_KEY`, `B2_S3_SECRET_KEY` — S3 access -- `PGPASS` — PostgreSQL -- `REPO_RO_TOKEN` — Git clone -- `GITHUB_PAT` — For bincraft GitHub mirror access - -New secret needed: -- `FORGEJO_TOKEN` — API token for creating/updating issues on git.devxy.io - -## Cron Schedule - -The audit and rebuild workflows each get their own cron names. -The cron schedule itself is configured in the Crow/Woodpecker server, not in the YAML. -Intended cadence: once per week (e.g. Sunday morning). - -## File Inventory - -| File | Type | Description | -|------|------|-------------| -| `local/excluded-packages.json` | Config | Excluded packages with reasons | -| `local/weekly-missing-binaries-audit.R` | R script | Audit logic, parameterized by env vars | -| `.crow/weekly-audit-missing-ubuntu-2204-amd64.yaml` | Workflow | Audit for ubuntu-2204/amd64 | -| `.crow/weekly-audit-missing-ubuntu-2204-arm64.yaml` | Workflow | Audit for ubuntu-2204/arm64 | -| `.crow/weekly-audit-missing-ubuntu-2404-amd64.yaml` | Workflow | Audit for ubuntu-2404/amd64 | -| `.crow/weekly-audit-missing-ubuntu-2404-arm64.yaml` | Workflow | Audit for ubuntu-2404/arm64 | -| `.crow/weekly-audit-missing-alpine-321-amd64.yaml` | Workflow | Audit for alpine-321/amd64 | -| `.crow/weekly-audit-missing-alpine-321-arm64.yaml` | Workflow | Audit for alpine-321/arm64 | -| `.crow/weekly-audit-missing-alpine-322-amd64.yaml` | Workflow | Audit for alpine-322/amd64 | -| `.crow/weekly-audit-missing-alpine-322-arm64.yaml` | Workflow | Audit for alpine-322/arm64 | -| `.crow/weekly-audit-missing-alpine-323-amd64.yaml` | Workflow | Audit for alpine-323/amd64 | -| `.crow/weekly-audit-missing-alpine-323-arm64.yaml` | Workflow | Audit for alpine-323/arm64 | -| `.crow/weekly-audit-missing-redhat-8-amd64.yaml` | Workflow | Audit for redhat-8/amd64 | -| `.crow/weekly-audit-missing-redhat-8-arm64.yaml` | Workflow | Audit for redhat-8/arm64 | -| `.crow/weekly-audit-missing-redhat-9-amd64.yaml` | Workflow | Audit for redhat-9/amd64 | -| `.crow/weekly-audit-missing-redhat-9-arm64.yaml` | Workflow | Audit for redhat-9/arm64 | -| `.crow/weekly-rebuild-missing-ubuntu-2204-amd64.yaml` | Workflow | Rebuild for ubuntu-2204/amd64 | -| `.crow/weekly-rebuild-missing-ubuntu-2204-arm64.yaml` | Workflow | Rebuild for ubuntu-2204/arm64 | -| `.crow/weekly-rebuild-missing-ubuntu-2404-amd64.yaml` | Workflow | Rebuild for ubuntu-2404/amd64 | -| `.crow/weekly-rebuild-missing-ubuntu-2404-arm64.yaml` | Workflow | Rebuild for ubuntu-2404/arm64 | -| `.crow/weekly-rebuild-missing-alpine-321-amd64.yaml` | Workflow | Rebuild for alpine-321/amd64 | -| `.crow/weekly-rebuild-missing-alpine-321-arm64.yaml` | Workflow | Rebuild for alpine-321/arm64 | -| `.crow/weekly-rebuild-missing-alpine-322-amd64.yaml` | Workflow | Rebuild for alpine-322/amd64 | -| `.crow/weekly-rebuild-missing-alpine-322-arm64.yaml` | Workflow | Rebuild for alpine-322/arm64 | -| `.crow/weekly-rebuild-missing-alpine-323-amd64.yaml` | Workflow | Rebuild for alpine-323/amd64 | -| `.crow/weekly-rebuild-missing-alpine-323-arm64.yaml` | Workflow | Rebuild for alpine-323/arm64 | -| `.crow/weekly-rebuild-missing-redhat-8-amd64.yaml` | Workflow | Rebuild for redhat-8/amd64 | -| `.crow/weekly-rebuild-missing-redhat-8-arm64.yaml` | Workflow | Rebuild for redhat-8/arm64 | -| `.crow/weekly-rebuild-missing-redhat-9-amd64.yaml` | Workflow | Rebuild for redhat-9/amd64 | -| `.crow/weekly-rebuild-missing-redhat-9-arm64.yaml` | Workflow | Rebuild for redhat-9/arm64 | - -**Total: 29 new files** (1 JSON config + 1 R script + 14 audit workflows + 14 rebuild workflows + the design doc itself) diff --git a/docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md b/docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md deleted file mode 100644 index 482b89a..0000000 --- a/docs/superpowers/specs/2026-05-25-multi-r-version-images-design.md +++ /dev/null @@ -1,242 +0,0 @@ -# Refactor build workflows to multi-R-version images - -## Goal - -The container images at `reg.devxy.io/rpkgs/build-env-*` are moving from a one-R-version-per-tag model to a multi-R-version-per-tag model. -The image tag now encodes only the OS version (e.g. `build-env-alpine:3.23`), and each image ships several R installs under `/opt/R//`. -Workflows and recipes must select an R version explicitly by calling `/opt/R/${R_VERSION}/bin/R` instead of relying on `R`/`Rscript` from `PATH`. - -## Scope - -In scope: - -- Every `.crow/*.yaml` workflow that references a `build-env-*` image (64 files). -- `Justfile` recipes that run `docker run` against a `build-env-*` image (3 recipes). -- The commented-out `build-all-versions-install-deps.yaml` in the repo root (kept consistent so the example doesn't go stale). -- Three correctness bug fixes that the user asked to roll into the same change: - - The six `weekly-audit-missing-alpine-{321,322,323}-{amd64,arm64}.yaml` files all incorrectly use `alpine:3.23-4.5`; each should use its own alpine image. - - The fourteen `update-package-index-*.yaml` files all use `build-env-ubuntu:noble-4.4` regardless of the platform they index; each should use its own platform's image. - - `process-updates-ubuntu-2404-{amd64,arm64}.yaml` use `noble-4.4` while the audit and rebuild counterparts use `noble-4.4.3`; align to 4.4.3. - -Out of scope: - -- `local/build-all.R` and other R scripts run *inside* a container with `Rscript`. Once R is launched, child processes inherit `R.home()`; the scripts themselves need no change. -- `docker/`, `benchmark/`. -- Historical docs in `docs/superpowers/plans/` and `docs/superpowers/specs/` that reference old image tags. -- Any workflow restructuring beyond image and R-path changes plus the three bug fixes above. - -## Image and R-path scheme - -New image tag: - -``` -reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} -``` - -`R_VERSION` is no longer encoded in the tag. -Each image contains R installs under `/opt/R//`, accessed via: - -- `/opt/R/${R_VERSION}/bin/R` -- `/opt/R/${R_VERSION}/bin/Rscript` - -`R_VERSION` is always a full patch string (e.g. `4.5.3`, `4.4.3`), never a minor (`4.5`). - -## Platform → image + R_VERSION mapping - -| Platform | New image | `R_VERSION` | -|--------------|-------------------------------------------------|-------------| -| alpine-322 | `reg.devxy.io/rpkgs/build-env-alpine:3.22` | 4.5.3 | -| alpine-323 | `reg.devxy.io/rpkgs/build-env-alpine:3.23` | 4.5.3 | -| ubuntu-2204 | `reg.devxy.io/rpkgs/build-env-ubuntu:jammy` | 4.4.3 | -| ubuntu-2404 | `reg.devxy.io/rpkgs/build-env-ubuntu:noble` | 4.4.3 | -| redhat-8 | `reg.devxy.io/rpkgs/build-env-redhat:8` | 4.4.3 | -| redhat-9 | `reg.devxy.io/rpkgs/build-env-redhat:9` | 4.4.3 | -| redhat-10 | `reg.devxy.io/rpkgs/build-env-redhat:10` | 4.5.3 | - -The `alpine-321` platform has no matching new image; its two audit-only workflows fall back to `build-env-alpine:3.23` with `R_VERSION=4.5.3` (rationale in the "Edge cases" section). - -## How workflows reference R - -Two patterns appear in the repo today: - -1. **Hard-coded image, no `R_VERSION` env var.** The R version is implicit in the image tag. -2. **Parameterised image via matrix/`--var`.** `R_VERSION` is already an environment variable; the image tag interpolates `${R_VERSION}`. - -After the refactor: - -- Pattern (1) workflows gain a single `R_VERSION:` entry in their `environment:` block. All `R …` and `Rscript …` invocations in the `commands:` block become `/opt/R/${R_VERSION}/bin/R …` / `/opt/R/${R_VERSION}/bin/Rscript …`. -- Pattern (2) workflows keep their existing `R_VERSION` value source (caller-supplied `--var`); only the image tag and the R invocations change. - -No `PATH` munging, no wrapper script, no shell aliasing. -Every R call site is explicit about which R is invoked. - -### Example: pattern (1) before → after - -Before (excerpt from `process-updates-alpine-322-amd64.yaml`): - -```yaml -- name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-alpine:3.22-4.5 - environment: - PLATFORM: alpine-322 - ARCH: amd64 - # ... - commands: - - R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - R -q -e 'packageVersion("bincraft")' - - xvfb-run R -q -e "..." -``` - -After: - -```yaml -- name: 'Processing Updates' - image: reg.devxy.io/rpkgs/build-env-alpine:3.22 - environment: - PLATFORM: alpine-322 - ARCH: amd64 - R_VERSION: 4.5.3 - # ... - commands: - - /opt/R/${R_VERSION}/bin/R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraft.git")' - - /opt/R/${R_VERSION}/bin/R -q -e 'packageVersion("bincraft")' - - xvfb-run /opt/R/${R_VERSION}/bin/R -q -e "..." -``` - -### Example: pattern (2) before → after - -Before (excerpt from `build-all-versions-amd64.yaml`): - -```yaml -- name: 'Build binaries' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}-${R_VERSION} - commands: - - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 - - R -q -e "bincraft::process_unarchived_pkgs(...)" -``` - -After: - -```yaml -- name: 'Build binaries' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} - commands: - - $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- /opt/R/${R_VERSION}/bin/Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 - - /opt/R/${R_VERSION}/bin/R -q -e "bincraft::process_unarchived_pkgs(...)" -``` - -`R_VERSION` (e.g. `4.5.3`) is already supplied by the `crow pipeline create --var` invocations documented in the file header. - -## Files touched - -### A. `.crow/build-all-versions-*.yaml` (4 files, pattern 2) - -- `.crow/build-all-versions-amd64.yaml` -- `.crow/build-all-versions-arm64.yaml` -- `.crow/build-all-versions-install-deps-amd64.yaml` -- `.crow/build-all-versions-install-deps-arm64.yaml` - -Change: drop `-${R_VERSION}` from the image tag; substitute the explicit R path in every `R`/`Rscript` invocation. -`R_VERSION` already arrives via `--var`. - -### B. `.crow/process-updates-*.yaml` (14 files, pattern 1) - -- `process-updates-alpine-322-{amd64,arm64}.yaml` -- `process-updates-alpine-323-{amd64,arm64}.yaml` -- `process-updates-ubuntu-2204-{amd64,arm64}.yaml` -- `process-updates-ubuntu-2404-{amd64,arm64}.yaml` -- `process-updates-redhat-8-{amd64,arm64}.yaml` -- `process-updates-redhat-9-{amd64,arm64}.yaml` -- `process-updates-redhat-10-{amd64,arm64}.yaml` - -Change: image swap per mapping table; add `R_VERSION:` env var; substitute R path in every `R`/`Rscript`/`xvfb-run R` invocation. -The two `ubuntu-2404` files also bump from `4.4` to `4.4.3` (bug fix; see "Edge cases"). - -### C. `.crow/weekly-rebuild-missing-*.yaml` (14 files, pattern 1) - -One per platform/arch listed in the mapping table. Same treatment as B. - -### D. `.crow/weekly-audit-missing-*.yaml` (16 files, pattern 1) - -Same treatment as B, *plus* repointing each alpine audit file to its own alpine image: - -| File | New image | `R_VERSION` | -|-------------------------------------------------|--------------------------------------------|-------------| -| `weekly-audit-missing-alpine-321-amd64.yaml` | `build-env-alpine:3.23` (no 3.21 image) | 4.5.3 | -| `weekly-audit-missing-alpine-321-arm64.yaml` | `build-env-alpine:3.23` (no 3.21 image) | 4.5.3 | -| `weekly-audit-missing-alpine-322-amd64.yaml` | `build-env-alpine:3.22` | 4.5.3 | -| `weekly-audit-missing-alpine-322-arm64.yaml` | `build-env-alpine:3.22` | 4.5.3 | -| `weekly-audit-missing-alpine-323-amd64.yaml` | `build-env-alpine:3.23` | 4.5.3 | -| `weekly-audit-missing-alpine-323-arm64.yaml` | `build-env-alpine:3.23` | 4.5.3 | - -The non-alpine audit files follow the mapping table directly. - -### E. `.crow/update-package-index-*.yaml` (14 files, pattern 1) - -Each currently uses `build-env-ubuntu:noble-4.4` regardless of which platform's package index it uploads. Repoint each to its own platform's image and R_VERSION per the mapping table. - -Files: - -- `update-package-index-alpine-322-{amd64,arm64}.yaml` -- `update-package-index-alpine-323-{amd64,arm64}.yaml` -- `update-package-index-ubuntu-2204-{amd64,arm64}.yaml` -- `update-package-index-ubuntu-2404-{amd64,arm64}.yaml` -- `update-package-index-redhat-8-{amd64,arm64}.yaml` -- `update-package-index-redhat-9-{amd64,arm64}.yaml` -- `update-package-index-redhat-10-{amd64,arm64}.yaml` - -The second step in each (`Purge CDN cache`) runs on `alpine:3.23` and does not invoke R; it is unchanged. - -### F. `.crow/archive-missed-packages.yaml` (1 file) - -Currently uses `build-env-alpine:3.23-4.5`. The image OS doesn't matter for this workflow (it only writes to S3 + Postgres). New: `build-env-alpine:3.23` + `R_VERSION: 4.5.3`. Same R-path substitution as elsewhere. - -### G. `.crow/build-r-minor-sensitive-packages.yaml` (1 file) - -Special case: uses `docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}-${r_version}` (lowercase matrix vars; different registry). - -Decision (user-confirmed): keep the `docker.io/devxygmbh/` registry. Drop the `-${r_version}` suffix from the image tag, leaving `docker.io/devxygmbh/rpkgs-build-env-${os}:${os_version}`. Substitute every `R`/`Rscript` for `/opt/R/${r_version}/bin/R` / `/opt/R/${r_version}/bin/Rscript`. - -The workflow's matrix continues to use `r_version: 4.5` / `4.4`. To remain consistent with the rest of the refactor's "always full patch" rule, the matrix values should be updated to `4.5.3` and `4.4.3` respectively (matching alpine-321's R 4.5.3 and the historical 4.4.3 patch). - -### H. `Justfile` (3 recipes) - -- `build-all OS OS_VERSION ARCH R_VERSION PACKAGE NCPUS` -- `build-single OS OS_VERSION ARCH R_VERSION PACKAGE TAG NCPUS` -- `process-updates OS OS_VERSION ARCH R_VERSION interval` - -Change in each: drop `-{{R_VERSION}}` from the image tag, and replace every `R `/`R -q -e` inside the `bash -c '…'` string with `/opt/R/{{R_VERSION}}/bin/R `/`/opt/R/{{R_VERSION}}/bin/R -q -e`. -The example comments above each recipe (`# just build-all alpine 3.21 arm64 4.5.0 …`) should be updated to use a current platform/R combination (e.g. `alpine 3.22 amd64 4.5.3`). - -### I. `build-all-versions-install-deps.yaml` (commented-out, repo root) - -Apply the same edits as the active `.crow/build-all-versions-install-deps-*.yaml` files so the commented-out example remains a faithful template. - -## Edge cases and bug fixes folded in - -1. **Alpine audit images.** All six `weekly-audit-missing-alpine-{321,322,323}-{amd64,arm64}.yaml` files currently point at `alpine:3.23-4.5`. After the refactor, each one points at the image that matches its own alpine version. `alpine-321` has no matching image in the new scheme, so its two files use `build-env-alpine:3.23` (the audit workflow reads `PLATFORM` from env and queries S3/CRAN; the container's own OS does not affect correctness). -2. **Package-index workflows.** All fourteen `update-package-index-*.yaml` files are repointed to their own platform's image, matching the rest of the per-platform workflows. -3. **Ubuntu-2404 R version.** `process-updates-ubuntu-2404-{amd64,arm64}.yaml` move from `noble-4.4` to `build-env-ubuntu:noble` + `R_VERSION: 4.4.3`, matching the audit and rebuild counterparts. - -## Validation - -There is no automated test suite for workflow files in this repo. Validation is: - -1. **Static checks per file**: after edit, grep each touched workflow for leftover bare `R `, `Rscript `, `R -q`, `R -e`, `R CMD` invocations. Any hit that is not part of a longer path (`/opt/R/…/bin/R`) is a regression. -2. **Image tag check**: grep for `build-env-` lines and confirm no tag still contains `-${R_VERSION}`, `-4.4`, `-4.4.3`, `-4.5`, or `-4.5.3`. -3. **Smoke runs**: trigger one workflow per shape on a feature branch and confirm green: - - `process-updates-alpine-322-amd64.yaml` - - `weekly-rebuild-missing-redhat-9-amd64.yaml` - - `weekly-audit-missing-ubuntu-2204-amd64.yaml` - - `update-package-index-redhat-10-amd64.yaml` - - `archive-missed-packages.yaml` - - `build-all-versions-amd64.yaml` (with its `install-deps` predecessor) - - `build-r-minor-sensitive-packages.yaml` - -The `Justfile` recipes are exercised by running each once locally against a current platform. - -## Risks - -- **Wrong `R_VERSION` in a file**: typo in the platform→version mapping causes `/opt/R//bin/R: not found`. Mitigated by the static grep in validation and by smoke-running one workflow per shape. -- **`build-r-minor-sensitive-packages.yaml` assumes new images exist at `docker.io/devxygmbh/`**: if the multi-R image is only published to `reg.devxy.io/rpkgs/`, this workflow will fail on the first pull. If that turns out to be the case, switch to option (a) — repoint to `reg.devxy.io/rpkgs/` — as a follow-up. -- **R subprocesses inside scripts**: `pak`, `future`, and similar libraries spawn child R processes via `R.home()`, which is set to the parent's install. No additional action needed. -- 2.54.0 From 6e62ea460407739bbd4d85e10e171aa4a0d9c141 Mon Sep 17 00:00:00 2001 From: pat-s Date: Tue, 26 May 2026 10:49:16 +0200 Subject: [PATCH 16/16] fix(ci): quote parameterized image: values in build-all-versions workflows Strict YAML parsers reject the colon separating ${OS} and ${OS_VERSION} in an unquoted scalar (it looks like a mapping value). Wrap the whole image value in double quotes to make it an unambiguous string. Mirrors the convention already used by build-r-minor-sensitive-packages.yaml. --- .crow/build-all-versions-amd64.yaml | 2 +- .crow/build-all-versions-arm64.yaml | 2 +- .crow/build-all-versions-install-deps-amd64.yaml | 2 +- .crow/build-all-versions-install-deps-arm64.yaml | 2 +- build-all-versions-install-deps.yaml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.crow/build-all-versions-amd64.yaml b/.crow/build-all-versions-amd64.yaml index 2766243..11ed544 100644 --- a/.crow/build-all-versions-amd64.yaml +++ b/.crow/build-all-versions-amd64.yaml @@ -39,7 +39,7 @@ depends_on: steps: - name: 'Build binaries' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} + image: "reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}" pull: true environment: RED_HAT_DEV_PW: diff --git a/.crow/build-all-versions-arm64.yaml b/.crow/build-all-versions-arm64.yaml index 8de103d..76ae323 100644 --- a/.crow/build-all-versions-arm64.yaml +++ b/.crow/build-all-versions-arm64.yaml @@ -54,7 +54,7 @@ depends_on: steps: - name: 'Build binaries' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} + image: "reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}" pull: true environment: RED_HAT_DEV_PW: diff --git a/.crow/build-all-versions-install-deps-amd64.yaml b/.crow/build-all-versions-install-deps-amd64.yaml index f3d61f0..fadb101 100644 --- a/.crow/build-all-versions-install-deps-amd64.yaml +++ b/.crow/build-all-versions-install-deps-amd64.yaml @@ -10,7 +10,7 @@ labels: steps: - name: 'Install deps and bincraft' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} + image: "reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}" pull: true environment: REPO_RO_TOKEN: diff --git a/.crow/build-all-versions-install-deps-arm64.yaml b/.crow/build-all-versions-install-deps-arm64.yaml index e6e65ec..f0415af 100644 --- a/.crow/build-all-versions-install-deps-arm64.yaml +++ b/.crow/build-all-versions-install-deps-arm64.yaml @@ -9,7 +9,7 @@ labels: steps: - name: 'Install deps and bincraft' - image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} + image: "reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}" pull: true environment: REPO_RO_TOKEN: diff --git a/build-all-versions-install-deps.yaml b/build-all-versions-install-deps.yaml index afcbb58..1f3a3d6 100644 --- a/build-all-versions-install-deps.yaml +++ b/build-all-versions-install-deps.yaml @@ -17,7 +17,7 @@ # steps: # - name: 'Install common R deps' -# image: reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION} +# image: "reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}" # pull: true # environment: # REPO_RO_TOKEN: -- 2.54.0