Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
1b6e2b506e |
|||
|
8afa584da3 |
76 changed files with 536 additions and 8698 deletions
|
|
@ -28,6 +28,14 @@ matrix:
|
|||
ARCH: amd64
|
||||
- CODENAME: redhat-10
|
||||
ARCH: arm64
|
||||
- CODENAME: alpine321
|
||||
ARCH: amd64
|
||||
- CODENAME: alpine321
|
||||
ARCH: arm64
|
||||
- CODENAME: alpine322
|
||||
ARCH: amd64
|
||||
- CODENAME: alpine322
|
||||
ARCH: arm64
|
||||
- CODENAME: alpine323
|
||||
ARCH: amd64
|
||||
- CODENAME: alpine323
|
||||
|
|
|
|||
|
|
@ -1,76 +0,0 @@
|
|||
# Auto-apply registry patches (issue #115, step 3 automation).
|
||||
# Classifies `single_builds` failures and, for the top-N auto-proposable
|
||||
# candidates by failure volume, writes the registry entries onto the reused
|
||||
# `auto/registry-patch-proposals` branch and opens/updates a single PR.
|
||||
# Nothing merges: the `trial-build-registry` pipeline is the merge gate, and a
|
||||
# human reviews the PR. Novel source diffs / unknown signatures are never
|
||||
# proposed. Global across platforms, so a single job -- no matrix.
|
||||
#
|
||||
# FORGEJO_TOKEN is used for both the branch push and opening the PR (no separate
|
||||
# write-scoped secret needed). Register the `auto-apply-patches` cron in the crow
|
||||
# UI, or run manually:
|
||||
# crow pipeline create --branch main \
|
||||
# --var auto_apply_patches=true devxy/build-cran-binaries
|
||||
#
|
||||
# The gate variable is `auto_apply_patches`, named after the pipeline: a manual
|
||||
# run instantiates every pipeline in `.crow/`, so one without its own gate runs
|
||||
# on *any* manual trigger in this repo. This one pushes a branch and opens a PR,
|
||||
# so it must stay off unless it is what was asked for.
|
||||
variables:
|
||||
auto_apply_patches:
|
||||
description: 'Run the auto-patch proposer. Also gates this pipeline.'
|
||||
options:
|
||||
- 'true'
|
||||
- 'false'
|
||||
default: 'false'
|
||||
patch_limit:
|
||||
description: 'Max candidates to propose per run (top by failure volume).'
|
||||
default: '10'
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'auto_apply_patches == "true"'
|
||||
- event: cron
|
||||
cron: auto-apply-patches
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-amd64
|
||||
|
||||
steps:
|
||||
- name: 'Auto-apply registry patches'
|
||||
image: reg.devxy.io/rpkgs/build-env-alpine:3.24
|
||||
pull: true
|
||||
environment:
|
||||
PGPASS:
|
||||
from_secret: PGPASS
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
FORGEJO_TOKEN:
|
||||
from_secret: FORGEJO_TOKEN
|
||||
GIT_USER: devxy-bot
|
||||
GIT_EMAIL: bot@devxy.io
|
||||
PATCH_LIMIT: ${patch_limit}
|
||||
R_VERSION: 4.5.3
|
||||
R_LIBS_USER: /mnt/cache/R-pkgs
|
||||
commands:
|
||||
- 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-*
|
||||
- UVR_R_BIN=/opt/R/$R_VERSION/bin/R local/uvr-install.sh RPostgres httr2 jsonlite
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/propose-patches.R --open-pr --limit $PATCH_LIMIT
|
||||
backend_options:
|
||||
kubernetes:
|
||||
resources:
|
||||
requests:
|
||||
memory: 1Gi
|
||||
cpu: 2000m
|
||||
limits:
|
||||
memory: 2Gi
|
||||
cpu: 2000m
|
||||
tolerations:
|
||||
- key: 'CI'
|
||||
operator: 'Equal'
|
||||
value: 'true'
|
||||
effect: 'NoSchedule'
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
# Populate the ABI classifier cache for packages that predate the per-minor scheme.
|
||||
#
|
||||
# bincraft decides whether a flat binary may be carried into a per-minor index
|
||||
# from its risky-package set. That set is now the union of the per-minor tarball
|
||||
# scan and the `abi_classification` cache, but the cache only holds verdicts for
|
||||
# packages that passed through the build pipeline after the scheme existed.
|
||||
# Everything older has no verdict, and no verdict means "carry it" - which is how
|
||||
# a base64enc built under R 4.4.3 reached R 4.6 clients and died at dyn.load()
|
||||
# on SETLENGTH.
|
||||
#
|
||||
# The verdict is computed from the package source, so it does not depend on OS,
|
||||
# arch or R minor: one run populates the cache for every slot. The arch/codename
|
||||
# below only choose which flat index to enumerate.
|
||||
#
|
||||
# Re-running is cheap. Cached verdicts are returned without touching the network,
|
||||
# so a second run costs one query per package and downloads only what is still
|
||||
# unclassified.
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries --var backfill_abi=run
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the default
|
||||
# must be a value the `when` clause rejects.
|
||||
backfill_abi:
|
||||
description: "Set to 'run' to classify the flat index into the ABI cache."
|
||||
options:
|
||||
- none
|
||||
- run
|
||||
default: none
|
||||
BACKFILL_ARCH:
|
||||
description: 'Arch of the flat index to enumerate.'
|
||||
options:
|
||||
- amd64
|
||||
- arm64
|
||||
default: amd64
|
||||
BACKFILL_CODENAME:
|
||||
description: 'Codename of the flat index to enumerate.'
|
||||
default: resolute
|
||||
BACKFILL_LIMIT:
|
||||
description: 'Classify at most this many packages (0 = no limit).'
|
||||
default: '0'
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'backfill_abi == "run"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-amd64
|
||||
|
||||
steps:
|
||||
- name: 'Classify the flat index into the ABI cache'
|
||||
image: reg.devxy.io/rpkgs/build-env-ubuntu:resolute
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
PGPASS:
|
||||
from_secret: PGPASS
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
GITHUB_PAT:
|
||||
from_secret: GITHUB_PAT
|
||||
GIT_USER: pat-s
|
||||
# Pipeline variables are substituted into the YAML, not exported, so they
|
||||
# have to be bound here to be readable as env vars in the script below.
|
||||
BACKFILL_ARCH: ${BACKFILL_ARCH}
|
||||
BACKFILL_CODENAME: ${BACKFILL_CODENAME}
|
||||
BACKFILL_LIMIT: ${BACKFILL_LIMIT}
|
||||
R_LIBS_USER: /tmp/R-pkgs
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p /tmp/R-pkgs
|
||||
- /opt/R/4.5.3/bin/Rscript local/install-bincraft.R
|
||||
- |
|
||||
set -eu
|
||||
LIMIT=""
|
||||
if [ "$$BACKFILL_LIMIT" != "0" ]; then
|
||||
LIMIT="$$BACKFILL_LIMIT"
|
||||
fi
|
||||
/opt/R/4.5.3/bin/Rscript local/backfill-abi-classification.R \
|
||||
"$$BACKFILL_ARCH" "$$BACKFILL_CODENAME" $$LIMIT
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 4Gi
|
||||
cpu: 1000m
|
||||
|
|
@ -1,176 +0,0 @@
|
|||
# Record, per flat-slot object, whether it loads under every supported R minor.
|
||||
#
|
||||
# `union_index_records()` keeps a carried flat record when that object is
|
||||
# recorded safe and drops it otherwise. Objects uploaded before that record
|
||||
# existed have no verdict, so they are dropped: a full re-index removed roughly
|
||||
# 2000 records per per-minor index (16398 across the 4.4 indexes, 20076 across
|
||||
# 4.5, 15532 across 4.6), each one resolving to CRAN source for clients the
|
||||
# routing serves correctly.
|
||||
#
|
||||
# This inspects what is already in the bucket and writes the verdict, which is
|
||||
# what restores that coverage. Decided by symbols rather than heuristics: a
|
||||
# binary fails at dyn.load() under minor M exactly when it references a symbol M
|
||||
# does not export, and the volatile set is derived by diffing the R builds in
|
||||
# the image.
|
||||
#
|
||||
# Re-running is cheap; recorded objects are skipped.
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries --var flat_safety=all
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the default
|
||||
# must match no matrix row.
|
||||
flat_safety:
|
||||
description: "Inspect target: a specific <os>-<arch>, 'all' for every slot, or 'none'."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
- redhat-9-arm64
|
||||
- redhat-10-amd64
|
||||
- redhat-10-arm64
|
||||
- ubuntu-2204-amd64
|
||||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
FLAT_SAFETY_LIMIT:
|
||||
description: 'Inspect at most this many objects per slot (0 = no limit).'
|
||||
default: '0'
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'flat_safety == "all" || flat_safety == "${OS}-${ARCH}"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Inspect flat objects and record safety'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
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
|
||||
# uvr resolves bincraft's dependencies through the GitHub API, including
|
||||
# the pat-s/cranlike@s3 fork. Unauthenticated it is rate limited, and the
|
||||
# failure is not loud: uvr warns, falls back to the registry copy of
|
||||
# cranlike, and the index write then dies on `unused argument (built =
|
||||
# built)` because upstream has no such parameter. Intermittent by nature,
|
||||
# since it depends on the rate-limit window.
|
||||
GITHUB_PAT:
|
||||
from_secret: GITHUB_PAT
|
||||
GIT_USER: pat-s
|
||||
R_LIBS_USER: /tmp/R-pkgs
|
||||
FLAT_SAFETY_ARCH: ${ARCH}
|
||||
FLAT_SAFETY_LIMIT: ${FLAT_SAFETY_LIMIT}
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p /tmp/R-pkgs
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- |
|
||||
set -eu
|
||||
LIMIT=""
|
||||
if [ "$$FLAT_SAFETY_LIMIT" != "0" ]; then
|
||||
LIMIT="$$FLAT_SAFETY_LIMIT"
|
||||
fi
|
||||
# The codename comes from the image's /etc/os-release, exactly as the
|
||||
# re-index step derives it, so it cannot drift from the matrix.
|
||||
CODENAME=$(/opt/R/$R_VERSION/bin/Rscript -e 'cat(bincraft::set_codename(NULL))')
|
||||
echo "slot: $$FLAT_SAFETY_ARCH/$$CODENAME"
|
||||
/opt/R/$R_VERSION/bin/Rscript local/backfill-flat-safety.R \
|
||||
"$$FLAT_SAFETY_ARCH" "$$CODENAME" $$LIMIT
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 4Gi
|
||||
cpu: 1000m
|
||||
|
|
@ -3,33 +3,29 @@
|
|||
# Variables are declared so the manual-run form exposes them (crow #1165);
|
||||
# they are merged with build-all-versions' identical declarations.
|
||||
variables:
|
||||
# Gates this pipeline. A manual pipeline creation instantiates every file in
|
||||
# .crow/, and a declared default is applied even when the run never passed
|
||||
# this variable, so the default must be a value that matches no matrix row.
|
||||
target_arch:
|
||||
description: 'Architecture to build, or "none" to run nothing.'
|
||||
description: 'Architecture to build.'
|
||||
options:
|
||||
- none
|
||||
- amd64
|
||||
- arm64
|
||||
default: none
|
||||
default: amd64
|
||||
OS:
|
||||
description: 'Base OS image name.'
|
||||
description: "Base OS image name."
|
||||
options:
|
||||
- alpine
|
||||
- redhat
|
||||
- ubuntu
|
||||
default: alpine
|
||||
OS_VERSION:
|
||||
description: 'OS image tag. Must match OS (alpine: 3.24; redhat: 8/9/10; ubuntu: jammy/noble).'
|
||||
description: "OS image tag. Must match OS (alpine: 3.24; redhat: 8/9/10; ubuntu: jammy/noble)."
|
||||
options:
|
||||
- '3.24'
|
||||
- '8'
|
||||
- '9'
|
||||
- '10'
|
||||
- 'jammy'
|
||||
- 'noble'
|
||||
default: '3.24'
|
||||
- "3.24"
|
||||
- "8"
|
||||
- "9"
|
||||
- "10"
|
||||
- "jammy"
|
||||
- "noble"
|
||||
default: "3.24"
|
||||
R_VERSION:
|
||||
description: 'Primary R version under /opt/R.'
|
||||
options:
|
||||
|
|
@ -70,24 +66,23 @@ steps:
|
|||
from_secret: B2_S3_SECRET_KEY
|
||||
PGPASS:
|
||||
from_secret: PGPASS
|
||||
R_PKG_CACHE_DIR: /mnt/cache/pkgcache
|
||||
R_LIBS_USER: /mnt/cache/R-pkgs
|
||||
# Keep uvr's downloads and extracted-package entries on the persistent
|
||||
# volume instead of the container-local ~/.uvr default.
|
||||
UVR_CACHE_DIR: /mnt/cache/uvr/cache
|
||||
UVR_PACKAGES_DIR: /mnt/cache/uvr/packages
|
||||
CCACHE_DIR: /mnt/cache/ccache
|
||||
volumes:
|
||||
- ${ARCH}-binaries-r-dep-cache-${OS}-${OS_VERSION//./}:/mnt/cache
|
||||
commands:
|
||||
# one-time full wipe to fix corrupted .so files from previous failed builds
|
||||
# - rm -rf /mnt/cache/R-pkgs
|
||||
- mkdir -p /mnt/cache/uvr/cache /mnt/cache/uvr/packages /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages
|
||||
# Clear churny pkgcache metadata left by a prior crashed run (the "patched"
|
||||
# repo mints a new hash per PACKAGES change -> unbounded pkgs-*.rds/patched-*).
|
||||
# Keep pkg/ downloads and the stable CRAN/BioC/INLA repo dirs.
|
||||
- rm -rf /mnt/cache/pkgcache/R/pkgcache/_metadata/patched-* /mnt/cache/pkgcache/R/pkgcache/_metadata/pkgs-*.rds || true
|
||||
- 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 .
|
||||
# Pin the same bincraft version the build steps use, so the precomputed
|
||||
# snapshot and the per-agent library stay consistent across the pipeline.
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- UVR_R_BIN=/opt/R/$R_VERSION/bin/R local/uvr-install.sh RPostgres s3fs data.table future jsonlite
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'packageVersion("bincraft")'
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'pak::sysreqs_db_update(); source("local/install-bincraft.R"); pak::pak(c("RPostgres", "s3fs", "data.table", "future", "jsonlite")); 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'); saveRDS(pkgs[r_minor_sensitive == TRUE], '/mnt/cache/packages/r_minor_sensitive_pkgs.rds'); sprintf('Precomputed %s package versions (%s r-minor-sensitive)', nrow(pkgs), nrow(pkgs[r_minor_sensitive == TRUE]))"
|
||||
backend_options:
|
||||
docker:
|
||||
|
|
|
|||
|
|
@ -4,44 +4,33 @@
|
|||
# image and cache volume. Placement is via the group label (rpkgs-amd64/rpkgs-arm64).
|
||||
# Skip list lives in local/excluded-packages.json (read by local/build-all.R).
|
||||
variables:
|
||||
# Gates this pipeline. A manual pipeline creation instantiates every file in
|
||||
# .crow/, and a declared default is applied even when the run never passed
|
||||
# this variable, so the default must be a value that matches no matrix row.
|
||||
target_arch:
|
||||
description: 'Architecture to build, or "none" to run nothing.'
|
||||
description: 'Architecture to build.'
|
||||
options:
|
||||
- none
|
||||
- amd64
|
||||
- arm64
|
||||
default: none
|
||||
default: amd64
|
||||
OS:
|
||||
description: 'Base OS image name.'
|
||||
description: "Base OS image name."
|
||||
options:
|
||||
- alpine
|
||||
- redhat
|
||||
- ubuntu
|
||||
default: alpine
|
||||
OS_VERSION:
|
||||
description: 'OS image tag. Must match OS (alpine: 3.24; redhat: 8/9/10; ubuntu: jammy/noble).'
|
||||
description: "OS image tag. Must match OS (alpine: 3.24; redhat: 8/9/10; ubuntu: jammy/noble)."
|
||||
options:
|
||||
- '3.23'
|
||||
- '3.24'
|
||||
- '8'
|
||||
- '9'
|
||||
- '10'
|
||||
- 'jammy'
|
||||
- 'noble'
|
||||
- 'resolute'
|
||||
default: '3.24'
|
||||
- "3.22"
|
||||
- "3.23"
|
||||
- "3.24"
|
||||
- "8"
|
||||
- "9"
|
||||
- "10"
|
||||
- "jammy"
|
||||
- "noble"
|
||||
- "resolute"
|
||||
default: "3.24"
|
||||
R_VERSION:
|
||||
# The slot's *primary* R minor: what `local/build-all.R` builds into the
|
||||
# generic slot. The loop below already runs `--sensitive-only` for every
|
||||
# other installed minor, so filling a non-primary minor's gap needs this
|
||||
# left alone, not changed.
|
||||
#
|
||||
# 4.6.0 was briefly offered here (#183) and removed: selecting it for a
|
||||
# slot whose generic binaries are 4.5-built would publish 4.6 binaries
|
||||
# into the generic slot and break every 4.5 client.
|
||||
description: 'Primary R version under /opt/R.'
|
||||
options:
|
||||
- 4.5.3
|
||||
|
|
@ -58,49 +47,38 @@ labels:
|
|||
platform: linux/${ARCH}
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
# Empty UVR_CACHE_DIR/UVR_PACKAGES_DIR fall back to uvr's container-local
|
||||
# ~/.uvr defaults; amd64 deliberately does not persist them (as with the
|
||||
# pkgcache dir it replaces), arm64 does.
|
||||
matrix:
|
||||
include:
|
||||
- ARCH: amd64
|
||||
UVR_CACHE_DIR: ''
|
||||
UVR_PACKAGES_DIR: ''
|
||||
R_PKG_CACHE_DIR: ''
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 1
|
||||
- ARCH: amd64
|
||||
UVR_CACHE_DIR: ''
|
||||
UVR_PACKAGES_DIR: ''
|
||||
R_PKG_CACHE_DIR: ''
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 2
|
||||
- ARCH: amd64
|
||||
UVR_CACHE_DIR: ''
|
||||
UVR_PACKAGES_DIR: ''
|
||||
R_PKG_CACHE_DIR: ''
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 3
|
||||
- ARCH: amd64
|
||||
UVR_CACHE_DIR: ''
|
||||
UVR_PACKAGES_DIR: ''
|
||||
R_PKG_CACHE_DIR: ''
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 4
|
||||
- ARCH: arm64
|
||||
UVR_CACHE_DIR: /mnt/cache/uvr/cache
|
||||
UVR_PACKAGES_DIR: /mnt/cache/uvr/packages
|
||||
R_PKG_CACHE_DIR: /mnt/cache/pkgcache
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 1
|
||||
- ARCH: arm64
|
||||
UVR_CACHE_DIR: /mnt/cache/uvr/cache
|
||||
UVR_PACKAGES_DIR: /mnt/cache/uvr/packages
|
||||
R_PKG_CACHE_DIR: /mnt/cache/pkgcache
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 2
|
||||
- ARCH: arm64
|
||||
UVR_CACHE_DIR: /mnt/cache/uvr/cache
|
||||
UVR_PACKAGES_DIR: /mnt/cache/uvr/packages
|
||||
R_PKG_CACHE_DIR: /mnt/cache/pkgcache
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 3
|
||||
- ARCH: arm64
|
||||
UVR_CACHE_DIR: /mnt/cache/uvr/cache
|
||||
UVR_PACKAGES_DIR: /mnt/cache/uvr/packages
|
||||
R_PKG_CACHE_DIR: /mnt/cache/pkgcache
|
||||
SPLIT_INTO: 4
|
||||
SPLIT_INDEX: 4
|
||||
|
||||
|
|
@ -129,10 +107,8 @@ steps:
|
|||
from_secret: GITHUB_PAT
|
||||
# normal env vars
|
||||
GIT_USER: pat-s
|
||||
# set the location of uvr's caches, which persist the R package
|
||||
# dependencies needed to install the packages themselves
|
||||
UVR_CACHE_DIR: ${UVR_CACHE_DIR}
|
||||
UVR_PACKAGES_DIR: ${UVR_PACKAGES_DIR}
|
||||
# set the location of the 'pkgcache' cache dir which persists the R package dependencies needed to install the packages themselves
|
||||
R_PKG_CACHE_DIR: ${R_PKG_CACHE_DIR}
|
||||
R_LIBS_USER: /mnt/cache/R-pkgs
|
||||
CCACHE_DIR: /mnt/cache/ccache
|
||||
NCPUS: 2
|
||||
|
|
@ -140,7 +116,12 @@ steps:
|
|||
- ${ARCH}-binaries-r-dep-cache-${OS}-${OS_VERSION//./}:/mnt/cache
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p /mnt/cache/uvr/cache /mnt/cache/uvr/packages /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages
|
||||
# Clear churny pkgcache metadata left by a prior crashed run (the "patched"
|
||||
# repo mints a new hash per PACKAGES change -> unbounded pkgs-*.rds/patched-*).
|
||||
# Keep pkg/ downloads and the stable CRAN/BioC/INLA repo dirs. Within-run
|
||||
# growth is bounded separately by trim_pkgcache_metadata() in build-all.R.
|
||||
- rm -rf /mnt/cache/pkgcache/R/pkgcache/_metadata/patched-* /mnt/cache/pkgcache/R/pkgcache/_metadata/pkgs-*.rds || true
|
||||
- mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages
|
||||
# The primary pass must not rely on build-all-versions-install-deps having
|
||||
# run on *this* agent: depends_on only orders the steps, but the cache
|
||||
# volume is per-agent, so a job landing on an agent where install-deps did
|
||||
|
|
@ -149,11 +130,7 @@ steps:
|
|||
# install). Pin bincraft here, exactly like the R-minor pass below.
|
||||
- rm -rf /mnt/cache/R-pkgs/00LOCK-*
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
# The dependency-prep job may run on another agent whose cache volume is
|
||||
# not visible here. Install the packages needed to recompute the snapshot
|
||||
# and query build metadata in every build job.
|
||||
- UVR_R_BIN=/opt/R/$R_VERSION/bin/R local/uvr-install.sh RPostgres s3fs data.table future jsonlite
|
||||
- XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS="-a"; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi
|
||||
- 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 -- /opt/R/$R_VERSION/bin/Rscript local/build-all.R $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1
|
||||
- |
|
||||
PRIMARY_MINOR=$(echo "$R_VERSION" | cut -d. -f1-2)
|
||||
|
|
@ -165,10 +142,7 @@ steps:
|
|||
LIB="/mnt/cache/R-pkgs-$RMINOR"
|
||||
mkdir -p "$LIB"
|
||||
R_LIBS_USER="$LIB" "$(dirname "$RBIN")/Rscript" local/install-bincraft.R || true
|
||||
R_LIBS_USER="$LIB" UVR_R_BIN="$RBIN" local/uvr-install.sh RPostgres || true
|
||||
R_LIBS_USER="$LIB" $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- "$(dirname "$RBIN")/Rscript" local/build-all.R --sensitive-only $SPLIT_INTO $SPLIT_INDEX $NCPUS 2>&1 || true
|
||||
# Also build current packages whose required dependency tree needs a newer R.
|
||||
R_LIBS_USER="$LIB" $XVFB $XVFB_ARGS -n $SPLIT_INDEX -- "$(dirname "$RBIN")/Rscript" local/build-newer-r.R "$R_VERSION" $SPLIT_INTO $SPLIT_INDEX
|
||||
done
|
||||
# archive missed packages; first arg is the codename (e.g. "alpine324"),
|
||||
# derived via bincraft like the upload step, not paste(OS, OS_VERSION).
|
||||
|
|
|
|||
|
|
@ -3,18 +3,16 @@
|
|||
# Routing is preserved 1:1:
|
||||
# - cron: each existing `process-cran-updates-<os>-<arch>` cron fires only
|
||||
# its matching matrix row (via the per-row `cron:` name filter).
|
||||
# - manual: pick a target from the `process_cran_updates` dropdown;
|
||||
# "all" fans out every os/arch as parallel matrix workflows.
|
||||
# - manual: pick a target from the `process_cran_updates` dropdown
|
||||
# ("all" = every os/arch).
|
||||
# Arch placement is handled by the group label (rpkgs-amd64, rpkgs-arm64).
|
||||
variables:
|
||||
# Gates this pipeline. A manual pipeline creation instantiates every file in
|
||||
# .crow/, and a declared default is applied even when the run never passed
|
||||
# this variable, so the default must be a value that matches no matrix row.
|
||||
process_cran_updates:
|
||||
description: "Manual run target: a specific <os>-<arch>, 'all' to run every os/arch in parallel, or 'none' to run nothing."
|
||||
description: "Manual run target: a specific <os>-<arch>, or 'all' for every os/arch."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-322-amd64
|
||||
- alpine-322-arm64
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
|
|
@ -31,7 +29,7 @@ variables:
|
|||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
default: all
|
||||
|
||||
when:
|
||||
- event: cron
|
||||
|
|
@ -46,102 +44,114 @@ labels:
|
|||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-322
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
OS_ID: alpine322
|
||||
PROCESS_NEW: "FALSE"
|
||||
- OS: alpine-322
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
OS_ID: alpine322
|
||||
PROCESS_NEW: "FALSE"
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
IMG: alpine:3.24
|
||||
OS_ID: alpine323
|
||||
PROCESS_NEW: 'FALSE'
|
||||
PROCESS_NEW: "FALSE"
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
IMG: alpine:3.24
|
||||
OS_ID: alpine323
|
||||
PROCESS_NEW: 'FALSE'
|
||||
PROCESS_NEW: "FALSE"
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
OS_ID: alpine324
|
||||
PROCESS_NEW: 'FALSE'
|
||||
PROCESS_NEW: "FALSE"
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
OS_ID: alpine324
|
||||
PROCESS_NEW: 'FALSE'
|
||||
PROCESS_NEW: "FALSE"
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
OS_ID: rhel8
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
OS_ID: rhel8
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
OS_ID: rhel9
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
OS_ID: rhel9
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
OS_ID: rhel10
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
OS_ID: rhel10
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
OS_ID: jammy
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
OS_ID: jammy
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
OS_ID: noble
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
OS_ID: noble
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: ubuntu:resolute
|
||||
OS_ID: resolute
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: ubuntu:resolute
|
||||
OS_ID: resolute
|
||||
PROCESS_NEW: 'TRUE'
|
||||
PROCESS_NEW: "TRUE"
|
||||
|
||||
steps:
|
||||
- name: 'Processing Updates'
|
||||
|
|
@ -172,10 +182,8 @@ steps:
|
|||
NTFY_AUTH: TRUE
|
||||
NTFY_PASSWORD:
|
||||
from_secret: ntfy_token
|
||||
# set the location of uvr's caches, which persist the R package
|
||||
# dependencies needed to install the packages themselves
|
||||
UVR_CACHE_DIR: /mnt/cache/uvr/cache
|
||||
UVR_PACKAGES_DIR: /mnt/cache/uvr/packages
|
||||
# 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: ${R_VERSION}
|
||||
CCACHE_DIR: /mnt/cache/ccache
|
||||
|
|
@ -186,13 +194,12 @@ steps:
|
|||
INTERVAL: lubridate::interval(lubridate::today() - 6, lubridate::today() - 3)
|
||||
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-* /mnt/cache/R-pkgs/bincraft
|
||||
- mkdir -p /mnt/cache/uvr/cache /mnt/cache/uvr/packages /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages
|
||||
- rm -rf /mnt/cache/R-pkgs/00LOCK-* /mnt/cache/R-pkgs/bincraft /mnt/cache/R-pkgs/pkgcache /mnt/cache/pkgcache/R/pkgcache
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- UVR_R_BIN=/opt/R/$R_VERSION/bin/R local/uvr-install.sh RPostgres
|
||||
- /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
|
||||
# rhel-10 ships xwfb-run (Xwayland) instead of xvfb-run; prefer it and start weston, else fall back to xvfb-run
|
||||
- XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS="-a"; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi
|
||||
- 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
|
||||
# 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 $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 = '${OS}', process_updated = TRUE, process_new = ${PROCESS_NEW}, process_removed = TRUE, patches = 'local/patches', r_minor_detection = 'classifier',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)"
|
||||
- |
|
||||
|
|
@ -205,10 +212,7 @@ steps:
|
|||
LIB="/mnt/cache/R-pkgs-$RMINOR"
|
||||
mkdir -p "$LIB"
|
||||
R_LIBS_USER="$LIB" "$(dirname "$RBIN")/Rscript" local/install-bincraft.R || true
|
||||
R_LIBS_USER="$LIB" UVR_R_BIN="$RBIN" local/uvr-install.sh RPostgres || true
|
||||
R_LIBS_USER="$LIB" $XVFB $XVFB_ARGS -- "$(dirname "$RBIN")/R" -q -e "options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = NULL); bincraft::process_cran_updates(interval = $INTERVAL, platform = '${OS}', process_updated = TRUE, process_new = FALSE, process_removed = FALSE, patches = 'local/patches', r_minor_detection = 'classifier',r_minor_sensitive_only = 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)" || true
|
||||
# Also build current packages whose required dependency tree needs a newer R.
|
||||
R_LIBS_USER="$LIB" $XVFB $XVFB_ARGS -- "$(dirname "$RBIN")/Rscript" local/build-newer-r.R "$R_VERSION"
|
||||
done
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'library(bincraft); upload_package_index(codename = "${OS_ID}", 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"))'
|
||||
- |
|
||||
|
|
|
|||
|
|
@ -1,242 +0,0 @@
|
|||
# Remove flat-slot binaries recorded unable to load under some R minor, then
|
||||
# re-index.
|
||||
#
|
||||
# The list comes from `abi_flat_safety`, so it names the objects the binaries
|
||||
# themselves report as broken, not the ones a source heuristic suspects. That
|
||||
# distinction is the whole cost of the operation: the heuristic calls 93% of
|
||||
# compiled packages risky and would delete roughly 3000 objects per slot to fix
|
||||
# about 230.
|
||||
#
|
||||
# `upload_single_binary()` has written a non-portable package only to the
|
||||
# per-minor slot since v5.3.0, so this is a one-time cleanup of what was
|
||||
# uploaded before that. The flat slot is what every client that cannot be
|
||||
# routed by R minor receives, and such a binary was built under whichever R was
|
||||
# primary at the time, so it dies at load under any minor that dropped a symbol
|
||||
# it uses:
|
||||
#
|
||||
# base64enc.so: undefined symbol: SETLENGTH
|
||||
#
|
||||
# Deleting the flat object does not create a hole. The source fallback
|
||||
# republishes the CRAN source under the same key, so the package stays
|
||||
# installable everywhere and compiles against the client's own R, while routed
|
||||
# clients keep getting the per-minor binary.
|
||||
#
|
||||
# Dry run unless PRUNE_APPLY is 'yes'. Start with an explicit package list:
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries \
|
||||
# --var prune_flat=ubuntu-2604-amd64 \
|
||||
# --var PRUNE_PACKAGES="base64enc lobstr" \
|
||||
# --var PRUNE_APPLY=yes
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the default
|
||||
# must match no matrix row.
|
||||
prune_flat:
|
||||
description: "Prune target: a specific <os>-<arch>, 'all' for every slot, or 'none'."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
- redhat-9-arm64
|
||||
- redhat-10-amd64
|
||||
- redhat-10-arm64
|
||||
- ubuntu-2204-amd64
|
||||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
PRUNE_PACKAGES:
|
||||
description: 'Space-separated package names. Empty means every package the classifier cache calls risky.'
|
||||
default: ''
|
||||
PRUNE_APPLY:
|
||||
description: "Set to 'yes' to actually delete. Anything else is a dry run."
|
||||
options:
|
||||
- 'no'
|
||||
- 'yes'
|
||||
default: 'no'
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'prune_flat == "all" || prune_flat == "${OS}-${ARCH}"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
CODENAME: alpine323
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
CODENAME: alpine323
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
CODENAME: alpine324
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
CODENAME: alpine324
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
CODENAME: rhel8
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
CODENAME: rhel8
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
CODENAME: rhel9
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
CODENAME: rhel9
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
CODENAME: rhel10
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
CODENAME: rhel10
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
CODENAME: jammy
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
CODENAME: jammy
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
CODENAME: noble
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
CODENAME: noble
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
CODENAME: resolute
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
CODENAME: resolute
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Prune stale flat binaries'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
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
|
||||
GIT_USER: pat-s
|
||||
R_LIBS_USER: /tmp/R-pkgs
|
||||
# Pipeline variables are substituted into the YAML, not exported, so they
|
||||
# have to be bound here to be readable as env vars in the script below.
|
||||
PRUNE_ARCH: ${ARCH}
|
||||
PRUNE_CODENAME: ${CODENAME}
|
||||
PRUNE_PACKAGES: ${PRUNE_PACKAGES}
|
||||
PRUNE_APPLY: ${PRUNE_APPLY}
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p /tmp/R-pkgs
|
||||
- /opt/R/4.5.3/bin/Rscript local/install-bincraft.R
|
||||
- |
|
||||
set -eu
|
||||
APPLY=""
|
||||
if [ "$$PRUNE_APPLY" = "yes" ]; then
|
||||
APPLY="--apply"
|
||||
fi
|
||||
/opt/R/4.5.3/bin/Rscript local/prune-stale-flat-binaries.R \
|
||||
"$$PRUNE_ARCH" "$$PRUNE_CODENAME" $$APPLY $$PRUNE_PACKAGES
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 3Gi
|
||||
cpu: 1000m
|
||||
|
||||
# Deleting objects without re-indexing is worse than leaving them: the
|
||||
# published index keeps naming files that no longer exist, so every client
|
||||
# gets a 404 instead of a working source fallback. The re-index is what
|
||||
# republishes them as CRAN source, so it belongs in the same run.
|
||||
- name: 'Re-index the slot'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
B2_S3_ACCESS_KEY:
|
||||
from_secret: B2_S3_ACCESS_KEY
|
||||
B2_S3_SECRET_KEY:
|
||||
from_secret: B2_S3_SECRET_KEY
|
||||
PGPASS:
|
||||
from_secret: PGPASS
|
||||
R_LIBS_USER: /tmp/R-pkgs
|
||||
PRUNE_APPLY: ${PRUNE_APPLY}
|
||||
commands:
|
||||
- |
|
||||
set -eu
|
||||
if [ "$$PRUNE_APPLY" != "yes" ]; then
|
||||
echo "Dry run: nothing was deleted, so there is nothing to re-index."
|
||||
exit 0
|
||||
fi
|
||||
/opt/R/4.5.3/bin/R -q -e 'library(bincraft); upload_package_index(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"))'
|
||||
for RBIN in /opt/R/[0-9]*/bin/R; do
|
||||
RMINOR=$(basename "$(dirname "$(dirname "$RBIN")")" | cut -d. -f1-2)
|
||||
/opt/R/4.5.3/bin/R -q -e "library(bincraft); upload_package_index(r_minor = '$RMINOR', 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'))" || true
|
||||
done
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 3Gi
|
||||
cpu: 1000m
|
||||
|
||||
# The edge caches indexes for ~370 days, so without this the deletion is
|
||||
# invisible to clients and they keep being handed the removed binary.
|
||||
- name: 'Purge CDN cache'
|
||||
image: reg.devxy.io/docker.io/library/alpine:3.24
|
||||
environment:
|
||||
BUNNYNET_API_KEY:
|
||||
from_secret: BUNNYNET_API_KEY
|
||||
# Same zones as reindex.yaml: the production pull zone id, the alliance
|
||||
# hostname and the staging zone, which shares the B2 origin.
|
||||
BUNNY_PULLZONES: '3857050 cran.allianceswisspass.devxy.io cran-rpkgs-test.b-cdn.net'
|
||||
PRUNE_APPLY: ${PRUNE_APPLY}
|
||||
commands:
|
||||
- |
|
||||
set -eu
|
||||
if [ "$$PRUNE_APPLY" != "yes" ]; then
|
||||
echo "Dry run: nothing changed at the origin, so no purge is needed."
|
||||
exit 0
|
||||
fi
|
||||
apk add --no-cache -q bash curl jq
|
||||
bash scripts/purge_cdn_zone.sh "$BUNNYNET_API_KEY" $BUNNY_PULLZONES
|
||||
|
|
@ -1,214 +0,0 @@
|
|||
# Rebuild specific packages into a per-R-minor slot.
|
||||
#
|
||||
# The per-minor scheme only ever covered packages that passed through the build
|
||||
# pipeline after it existed. A package built into the flat slot before that, and
|
||||
# never updated on CRAN since, is never reclassified and never gets a per-minor
|
||||
# copy - so the union index serves its flat binary to every minor. When that
|
||||
# binary references a symbol the client's R no longer exports, the install fails
|
||||
# at dyn.load():
|
||||
#
|
||||
# base64enc.so: undefined symbol: SETLENGTH
|
||||
#
|
||||
# base64enc calls SETLENGTH, its flat binary was built under R 4.4.3, and R 4.6
|
||||
# does not export SETLENGTH. There was no way to rebuild one package into one
|
||||
# minor from CI, only `just rebuild` from a workstation with the S3 and Postgres
|
||||
# credentials to hand. This adds that path.
|
||||
#
|
||||
# `--sensitive-only` is deliberately NOT passed. That flag gates on the source
|
||||
# classifier, which misses Rcpp: the repair therefore skipped Rcpp entirely,
|
||||
# leaving its 4.5-built flat binary as the only copy and breaking every R 4.4
|
||||
# client on the slot.
|
||||
#
|
||||
# Since bincraft v5.3.0 the destination is decided by the built binary's symbols
|
||||
# in `upload_single_binary()`, so building unconditionally is safe: a package
|
||||
# that needs a per-minor slot lands there, and one that does not lands in the
|
||||
# flat slot. Skipping before the build is what removed that decision.
|
||||
#
|
||||
# Trigger with the slot and an explicit package list:
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries \
|
||||
# --var rebuild_abi_gap=ubuntu-2604-amd64 \
|
||||
# --var ABI_PACKAGES="base64enc@0.1-6 lobstr@1.2.1" \
|
||||
# --var ABI_R_MINOR=4.6
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the
|
||||
# default must match no matrix row.
|
||||
rebuild_abi_gap:
|
||||
description: "Rebuild target: a specific <os>-<arch>, 'all' for every slot, or 'none'."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
- redhat-9-arm64
|
||||
- redhat-10-amd64
|
||||
- redhat-10-arm64
|
||||
- ubuntu-2204-amd64
|
||||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
ABI_PACKAGES:
|
||||
description: 'Space-separated package@version list, e.g. "base64enc@0.1-6 lobstr@1.2.1".'
|
||||
default: ''
|
||||
ABI_R_MINOR:
|
||||
description: 'The R minor to build into.'
|
||||
options:
|
||||
- '4.4'
|
||||
- '4.5'
|
||||
- '4.6'
|
||||
default: '4.6'
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'rebuild_abi_gap == "all" || rebuild_abi_gap == "${OS}-${ARCH}"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Rebuild packages into the per-minor slot'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
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
|
||||
# Pipeline variables are substituted into the YAML, not exported, so they
|
||||
# have to be bound here to be readable as env vars in the script below.
|
||||
ABI_PACKAGES: ${ABI_PACKAGES}
|
||||
ABI_R_MINOR: ${ABI_R_MINOR}
|
||||
UVR_CACHE_DIR: /tmp/uvr/cache
|
||||
UVR_PACKAGES_DIR: /tmp/uvr/packages
|
||||
CCACHE_DIR: /tmp/ccache
|
||||
NCPUS: 2
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p $UVR_CACHE_DIR $UVR_PACKAGES_DIR $CCACHE_DIR
|
||||
- |
|
||||
set -eu
|
||||
if [ -z "$$ABI_PACKAGES" ]; then
|
||||
echo "ABI_PACKAGES is empty; nothing to rebuild." >&2
|
||||
exit 1
|
||||
fi
|
||||
RBIN=$(ls -d /opt/R/$${ABI_R_MINOR}*/bin 2>/dev/null | head -1)
|
||||
if [ -z "$$RBIN" ]; then
|
||||
echo "R $$ABI_R_MINOR is not installed in this image." >&2
|
||||
exit 1
|
||||
fi
|
||||
# Container-local library: this workflow mounts no shared cache volume,
|
||||
# so it cannot disturb the build pipeline's per-agent caches.
|
||||
LIB="/tmp/R-pkgs-$$ABI_R_MINOR"
|
||||
mkdir -p "$$LIB"
|
||||
export R_LIBS_USER="$$LIB"
|
||||
rm -rf "$$LIB"/00LOCK-*
|
||||
"$$RBIN/Rscript" local/install-bincraft.R
|
||||
rc=0
|
||||
for spec in $$ABI_PACKAGES; do
|
||||
pkg=$${spec%@*}
|
||||
ver=$${spec#*@}
|
||||
if [ "$$pkg" = "$$ver" ]; then
|
||||
echo "malformed spec '$$spec'; expected package@version" >&2
|
||||
rc=1
|
||||
continue
|
||||
fi
|
||||
echo "=== rebuilding $$pkg $$ver into $$ABI_R_MINOR ==="
|
||||
"$$RBIN/Rscript" local/build-one.R "$$pkg" "$$ver" || rc=1
|
||||
done
|
||||
exit $$rc
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 5Gi
|
||||
cpu: 1000m
|
||||
|
|
@ -1,198 +0,0 @@
|
|||
# Re-index every slot without rebuilding anything.
|
||||
#
|
||||
# `weekly-rebuild-reindex` exists to run after `weekly-rebuild-missing`, so it
|
||||
# depends on that workflow and shares its gate: triggering it manually also
|
||||
# starts hours of package rebuilds. That is the wrong tool when only the index
|
||||
# needs regenerating - after a bincraft release that changes how the index is
|
||||
# written, for instance, where the objects in the bucket are already correct
|
||||
# and only `PACKAGES*` is stale.
|
||||
#
|
||||
# This workflow does the index half on its own. It installs the latest bincraft
|
||||
# release, republishes the generic and per-R-minor indexes for each slot, and
|
||||
# purges the edge. No package is built.
|
||||
#
|
||||
# Trigger with the `reindex` variable set to `all` or to a single
|
||||
# `<os>-<arch>`, e.g.
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries --var reindex=all
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the
|
||||
# default must match no matrix row.
|
||||
reindex:
|
||||
description: "Re-index target: a specific <os>-<arch>, 'all' for every slot, or 'none'."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
- redhat-9-arm64
|
||||
- redhat-10-amd64
|
||||
- redhat-10-arm64
|
||||
- ubuntu-2204-amd64
|
||||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'reindex == "all" || reindex == "${OS}-${ARCH}"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Re-index the slot'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
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
|
||||
# The index build reads the ABI classifier cache to decide which packages
|
||||
# may be carried from the flat slot into a per-minor one. Without the
|
||||
# password that query fails, and it fails soft, so the run still succeeds
|
||||
# while quietly using an empty risky set: exactly the state the cache was
|
||||
# added to fix. It logs one connection error per slot.
|
||||
PGPASS:
|
||||
from_secret: PGPASS
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
# uvr resolves bincraft's dependencies through the GitHub API, including
|
||||
# the pat-s/cranlike@s3 fork. Unauthenticated it is rate limited, and the
|
||||
# failure is not loud: uvr warns, falls back to the registry copy of
|
||||
# cranlike, and the index write then dies on `unused argument (built =
|
||||
# built)` because upstream has no such parameter. Intermittent by nature,
|
||||
# since it depends on the rate-limit window.
|
||||
GITHUB_PAT:
|
||||
from_secret: GITHUB_PAT
|
||||
GIT_USER: pat-s
|
||||
R_LIBS_USER: /mnt/cache/R-pkgs
|
||||
R_VERSION: ${R_VERSION}
|
||||
PLATFORM: ${OS}
|
||||
ARCH: ${ARCH}
|
||||
commands:
|
||||
- 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-*
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
# The codename is detected from the image's /etc/os-release.
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'library(bincraft); upload_package_index(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"))'
|
||||
- |
|
||||
for RBIN in /opt/R/[0-9]*/bin/R; do
|
||||
RMINOR=$(basename "$(dirname "$(dirname "$RBIN")")" | cut -d. -f1-2)
|
||||
/opt/R/$R_VERSION/bin/R -q -e "library(bincraft); upload_package_index(r_minor = '$RMINOR', 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'))" || true
|
||||
done
|
||||
|
||||
- name: Purge CDN cache
|
||||
image: reg.devxy.io/docker.io/library/alpine:3.24
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
BUNNYNET_API_KEY:
|
||||
from_secret: BUNNYNET_API_KEY
|
||||
# cran.rpkgs.com and cran.allianceswisspass.devxy.io are on separate
|
||||
# Bunny pull zones, so both must be purged after the shared origin changes.
|
||||
# The staging zone is listed too. It shares the B2 origin, so an index
|
||||
# it still holds is a stale copy of the same object, and its
|
||||
# cache_expiration_time is the same ~370 days: without a purge here it
|
||||
# serves pre-reindex indexes indefinitely and any verification run
|
||||
# against it measures the past.
|
||||
BUNNY_PULLZONES: '3857050 cran.allianceswisspass.devxy.io cran-rpkgs-test.b-cdn.net'
|
||||
commands:
|
||||
- apk add --no-cache -q bash curl jq
|
||||
# Crow carries the checkout from the re-index step into this step.
|
||||
- bash scripts/purge_cdn_zone.sh "$BUNNYNET_API_KEY" $BUNNY_PULLZONES
|
||||
# Runs on every row rather than on one designated slot: a cron fires only
|
||||
# its own slot's row, so gating on a named slot would leave every other
|
||||
# slot unpurged. A manual "all" run therefore purges the zone 18 times,
|
||||
# which is a cheap API call and rare.
|
||||
#
|
||||
# Run it even when the re-index above failed: the objects were still
|
||||
# replaced, and a stale edge is exactly what keeps them hidden.
|
||||
when:
|
||||
- status: [success, failure]
|
||||
|
|
@ -1,109 +0,0 @@
|
|||
### Manual repair of a slot whose PACKAGES index advertises a broken `Built`
|
||||
### stamp (e.g. `Built: R 4.5.0; NA; ...`).
|
||||
#
|
||||
# uvr matches the stamp's platform triple plus R minor to decide binary vs
|
||||
# source, so an unusable triple turns a whole slot source-only. See
|
||||
# local/repair-built-stamp.R for why this patches PACKAGES.db in place instead
|
||||
# of forcing a full reparse.
|
||||
#
|
||||
# Run with `dry_run: true` first: it reports how many entries are broken per
|
||||
# slot and changes nothing. Pick the R version the slot should advertise, which
|
||||
# is the R_VERSION its entry in .crow/process-updates.yaml uses.
|
||||
#
|
||||
# The gate variable is `repair_built_stamp`, not `target_arch`: `target_arch` is
|
||||
# what build-all-versions and build-all-versions-install-deps gate on, so a
|
||||
# manual run passing it would start a full rebuild alongside this repair. Every
|
||||
# pipeline here gates on a variable named after itself for exactly that reason.
|
||||
#
|
||||
# crow pipeline create --branch main \
|
||||
# --var repair_built_stamp=arm64 --var OS=alpine --var OS_VERSION=3.23 \
|
||||
# --var R_VERSION=4.5.3 --var dry_run=true devxy/build-cran-binaries
|
||||
variables:
|
||||
# Gates this pipeline. A manual pipeline creation instantiates every file in
|
||||
# .crow/, and a declared default is applied even when the run never passed
|
||||
# this variable, so the default must be a value that matches no matrix row.
|
||||
repair_built_stamp:
|
||||
description: 'Architecture of the slot to repair, or "none" to run nothing.'
|
||||
options:
|
||||
- none
|
||||
- amd64
|
||||
- arm64
|
||||
default: none
|
||||
OS:
|
||||
description: 'Base OS image name.'
|
||||
options:
|
||||
- alpine
|
||||
- redhat
|
||||
- ubuntu
|
||||
default: alpine
|
||||
OS_VERSION:
|
||||
description: 'OS image tag. Must match OS (alpine: 3.23/3.24; redhat: 8/9/10; ubuntu: jammy/noble/resolute).'
|
||||
options:
|
||||
- '3.23'
|
||||
- '3.24'
|
||||
- '8'
|
||||
- '9'
|
||||
- '10'
|
||||
- 'jammy'
|
||||
- 'noble'
|
||||
- 'resolute'
|
||||
default: '3.23'
|
||||
R_VERSION:
|
||||
description: 'R version whose stamp the slot should advertise.'
|
||||
options:
|
||||
- 4.5.3
|
||||
- 4.4.3
|
||||
default: 4.5.3
|
||||
dry_run:
|
||||
description: 'Report what would change without writing anything.'
|
||||
options:
|
||||
- 'true'
|
||||
- 'false'
|
||||
default: 'true'
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'repair_built_stamp == "${ARCH}"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
platform: linux/${ARCH}
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- ARCH: amd64
|
||||
- ARCH: arm64
|
||||
|
||||
steps:
|
||||
- name: 'Repair Built stamp'
|
||||
image: 'reg.devxy.io/rpkgs/build-env-${OS}:${OS_VERSION}'
|
||||
pull: true
|
||||
environment:
|
||||
B2_S3_ACCESS_KEY:
|
||||
from_secret: B2_S3_ACCESS_KEY
|
||||
B2_S3_SECRET_KEY:
|
||||
from_secret: B2_S3_SECRET_KEY
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
GIT_USER: pat-s
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'packageVersion("bincraft")'
|
||||
- |
|
||||
if [ "$dry_run" = "false" ]; then
|
||||
/opt/R/$R_VERSION/bin/Rscript local/repair-built-stamp.R "$ARCH" --apply
|
||||
else
|
||||
/opt/R/$R_VERSION/bin/Rscript local/repair-built-stamp.R "$ARCH"
|
||||
fi
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 2Gi
|
||||
cpu: 1000m
|
||||
limits:
|
||||
memory: 8Gi
|
||||
cpu: 2000m
|
||||
|
|
@ -1,173 +0,0 @@
|
|||
# Rebuild every flat object recorded as unable to load under some R minor.
|
||||
#
|
||||
# The list comes from `abi_flat_safety`, written by the flat-safety backfill
|
||||
# from the binaries themselves, so it names exactly the objects that fail at
|
||||
# dyn.load() somewhere rather than everything a source heuristic suspects. The
|
||||
# heuristic calls 93% of compiled packages risky; the binaries say 4.3%.
|
||||
#
|
||||
# Each object is rebuilt under every R minor installed in the image, with no
|
||||
# `--sensitive-only` gate. Since bincraft v5.3.0 the destination is decided by
|
||||
# the built binary's symbols in `upload_single_binary()`, so a package needing a
|
||||
# per-minor slot lands there and a portable one lands in the flat slot. Gating
|
||||
# on the source classifier is what let Rcpp slip through and break every R 4.4
|
||||
# client on the slot.
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries --var repair_unsafe=all
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the default
|
||||
# must match no matrix row.
|
||||
repair_unsafe:
|
||||
description: "Repair target: a specific <os>-<arch>, 'all' for every slot, or 'none'."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
- redhat-9-arm64
|
||||
- redhat-10-amd64
|
||||
- redhat-10-arm64
|
||||
- ubuntu-2204-amd64
|
||||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'repair_unsafe == "all" || repair_unsafe == "${OS}-${ARCH}"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Rebuild objects recorded unsafe'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
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_LIBS_USER: /tmp/R-pkgs
|
||||
NCPUS: 2
|
||||
REPAIR_ARCH: ${ARCH}
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p /tmp/R-pkgs
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- |
|
||||
set -eu
|
||||
CODENAME=$(/opt/R/$R_VERSION/bin/Rscript -e 'cat(bincraft::set_codename(NULL))')
|
||||
/opt/R/$R_VERSION/bin/Rscript local/list-unsafe-flat-objects.R \
|
||||
"$$REPAIR_ARCH" "$$CODENAME" > /tmp/unsafe.txt
|
||||
echo "objects to rebuild: $(wc -l < /tmp/unsafe.txt)"
|
||||
rc=0
|
||||
for RBIN in /opt/R/[0-9]*/bin/R; do
|
||||
RV=$(basename "$(dirname "$(dirname "$$RBIN")")")
|
||||
RMINOR=$(echo "$$RV" | cut -d. -f1-2)
|
||||
echo "=== rebuilding under R $$RV ==="
|
||||
LIB="/tmp/R-pkgs-$$RMINOR"
|
||||
mkdir -p "$$LIB"
|
||||
R_LIBS_USER="$$LIB" "$(dirname "$$RBIN")/Rscript" local/install-bincraft.R || true
|
||||
while read -r pkg ver; do
|
||||
[ -z "$$pkg" ] && continue
|
||||
R_LIBS_USER="$$LIB" "$(dirname "$$RBIN")/Rscript" \
|
||||
local/build-one.R "$$pkg" "$$ver" || rc=1
|
||||
done < /tmp/unsafe.txt
|
||||
done
|
||||
exit $$rc
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 5Gi
|
||||
cpu: 1000m
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
# Delete a retired slot's objects from the bucket.
|
||||
#
|
||||
# The config half is a commit, so it runs on a workstation:
|
||||
# just retire-slot <codename> --apply
|
||||
#
|
||||
# This half needs the B2 credentials, which only exist in CI.
|
||||
# `local/retire-slot.R` refuses any slot still listed in `local.rpkgs_slots`,
|
||||
# so this cannot delete a live slot. Both architectures go together.
|
||||
#
|
||||
# Dry run unless RETIRE_APPLY is 'yes':
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries --branch main \
|
||||
# --var retire_slot=alpine322 --var RETIRE_APPLY=yes
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the
|
||||
# default must be a value the script never accepts.
|
||||
retire_slot:
|
||||
description: "Codename of the slot to retire (e.g. alpine322), or 'none'."
|
||||
default: none
|
||||
RETIRE_APPLY:
|
||||
description: "Set to 'yes' to delete. Anything else reports and changes nothing."
|
||||
options:
|
||||
- 'no'
|
||||
- 'yes'
|
||||
default: 'no'
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'retire_slot != "none"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-amd64
|
||||
|
||||
steps:
|
||||
- name: 'Delete the retired slot from the bucket'
|
||||
image: reg.devxy.io/rpkgs/build-env-alpine:3.24
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
B2_S3_ACCESS_KEY:
|
||||
from_secret: B2_S3_ACCESS_KEY
|
||||
B2_S3_SECRET_KEY:
|
||||
from_secret: B2_S3_SECRET_KEY
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
R_LIBS_USER: /tmp/R-pkgs
|
||||
# Pipeline variables are substituted into the YAML, not exported, so they
|
||||
# have to be bound here to be readable as env vars in the script below.
|
||||
RETIRE_SLOT: ${retire_slot}
|
||||
RETIRE_APPLY: ${RETIRE_APPLY}
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p /tmp/R-pkgs
|
||||
- /opt/R/4.5.3/bin/Rscript local/install-bincraft.R
|
||||
- |
|
||||
set -eu
|
||||
APPLY=""
|
||||
if [ "$$RETIRE_APPLY" = "yes" ]; then
|
||||
APPLY="--apply"
|
||||
fi
|
||||
/opt/R/4.5.3/bin/Rscript local/retire-slot.R "$$RETIRE_SLOT" --assets-only $$APPLY
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 2Gi
|
||||
cpu: 1000m
|
||||
|
|
@ -1,152 +0,0 @@
|
|||
# Merge gate for the auto-patch PR (issue #115, step 3).
|
||||
# For each platform, trial-builds every registry entry the auto-patch branch
|
||||
# ADDS (vs main) in that platform's own `reg.devxy.io/rpkgs/build-env-*` image,
|
||||
# with the registry applied. A row with no new entries for its platform is a
|
||||
# fast no-op. The pipeline is green only if every new entry builds, so it gates
|
||||
# the PR before merge. Nothing is uploaded/archived/recorded.
|
||||
#
|
||||
# The repo uses no `pull_request` triggers, so this runs manually against the
|
||||
# branch (or on a cron); point it at the auto-patch branch via `patch_branch`:
|
||||
# crow pipeline create --branch main --var trial_build_registry=true \
|
||||
# --var patch_branch=auto/registry-patch-proposals devxy/build-cran-binaries
|
||||
#
|
||||
# The gate variable is `trial_build_registry`, named after the pipeline: a
|
||||
# manual run instantiates every pipeline in `.crow/`, so one without its own
|
||||
# gate runs on *any* manual trigger in this repo. This one starts a build per
|
||||
# matrix row on both arches, which is far too expensive to fire by accident.
|
||||
variables:
|
||||
trial_build_registry:
|
||||
description: 'Trial-build the branch new registry entries. Also gates this pipeline.'
|
||||
options:
|
||||
- 'true'
|
||||
- 'false'
|
||||
default: 'false'
|
||||
patch_branch:
|
||||
description: 'Branch whose new registry entries to trial-build.'
|
||||
default: auto/registry-patch-proposals
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'trial_build_registry == "true"'
|
||||
- event: cron
|
||||
cron: trial-build-registry
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Trial-build new registry entries'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
B2_S3_ACCESS_KEY:
|
||||
from_secret: B2_S3_ACCESS_KEY
|
||||
B2_S3_SECRET_KEY:
|
||||
from_secret: B2_S3_SECRET_KEY
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
GITHUB_PAT:
|
||||
from_secret: GITHUB_PAT
|
||||
PLATFORM: ${OS}
|
||||
ARCH: ${ARCH}
|
||||
R_VERSION: ${R_VERSION}
|
||||
R_LIBS_USER: /mnt/cache/R-pkgs
|
||||
# Surface the real compiler error when an isolated patched build fails,
|
||||
# instead of bincraft's opaque "System command 'R' failed" (needs bincraft
|
||||
# with BINCRAFT_VERBOSE_PATCH_BUILD support; harmless on older versions).
|
||||
BINCRAFT_VERBOSE_PATCH_BUILD: 'TRUE'
|
||||
commands:
|
||||
# Clone main, then check out the auto-patch branch if it exists. When the
|
||||
# proposer had no candidates it never (re)creates that branch, so a missing
|
||||
# branch means "nothing to verify" -- no-op cleanly instead of failing the
|
||||
# clone.
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- git fetch -q origin main
|
||||
- 'if git ls-remote --exit-code --heads origin ${patch_branch} >/dev/null 2>&1; then git fetch -q origin ${patch_branch} && git checkout -q FETCH_HEAD; else echo "No ${patch_branch} branch; no pending auto-patch proposals to verify."; exit 0; fi'
|
||||
- mkdir -p /mnt/cache/R-pkgs
|
||||
- rm -rf /mnt/cache/R-pkgs/00LOCK-*
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/trial-build-registry.R origin/main
|
||||
backend_options:
|
||||
kubernetes:
|
||||
resources:
|
||||
requests:
|
||||
memory: 2Gi
|
||||
cpu: 2000m
|
||||
limits:
|
||||
memory: 4Gi
|
||||
cpu: 2000m
|
||||
tolerations:
|
||||
- key: 'CI'
|
||||
operator: 'Equal'
|
||||
value: 'true'
|
||||
effect: 'NoSchedule'
|
||||
|
|
@ -1,146 +0,0 @@
|
|||
# Install a fixed set of packages from a published slot under every R minor the
|
||||
# image carries, through each URL form the website tells people to configure,
|
||||
# and check that each one loads.
|
||||
#
|
||||
# This is the end-to-end counterpart to the ABI bookkeeping: `abi_flat_safety`
|
||||
# records what the binaries say about themselves, this proves what a client
|
||||
# actually receives once the CDN, the per-minor indexes and the `Path:` field
|
||||
# have had their say. It runs on the build agents rather than a workstation so
|
||||
# arm64 is covered on real hardware.
|
||||
#
|
||||
# crow pipeline create devxy/build-cran-binaries --var verify_routing=all
|
||||
|
||||
variables:
|
||||
# A manual pipeline creation instantiates every file in .crow/, so the default
|
||||
# must match no matrix row.
|
||||
verify_routing:
|
||||
description: "Verify target: a specific <os>-<arch>, 'all' for every slot, or 'none'."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
- redhat-9-arm64
|
||||
- redhat-10-amd64
|
||||
- redhat-10-arm64
|
||||
- ubuntu-2204-amd64
|
||||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'verify_routing == "all" || verify_routing == "${OS}-${ARCH}"'
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Verify routing serves loadable binaries'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
VERIFY_ARCH: ${ARCH}
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- |
|
||||
set -eu
|
||||
CODENAME=$(/opt/R/$R_VERSION/bin/Rscript -e 'cat(bincraft::set_codename(NULL))')
|
||||
rc=0
|
||||
for RBIN in /opt/R/[0-9]*/bin/R; do
|
||||
RV=$(basename "$(dirname "$(dirname "$$RBIN")")")
|
||||
for FORM in arch generic flat; do
|
||||
echo "=== R $$RV via $$FORM ==="
|
||||
"$(dirname "$$RBIN")/Rscript" local/verify-repo-routing.R \
|
||||
"$$VERIFY_ARCH" "$$CODENAME" "$$FORM" || rc=1
|
||||
done
|
||||
done
|
||||
exit $$rc
|
||||
backend_options:
|
||||
docker:
|
||||
resources:
|
||||
requests:
|
||||
memory: 4Gi
|
||||
cpu: 1000m
|
||||
|
|
@ -3,22 +3,20 @@
|
|||
# Routing is preserved 1:1:
|
||||
# - cron: each existing `weekly-audit-missing-<os>-<arch>` cron fires only
|
||||
# its matching matrix row (via the per-row `cron:` name filter).
|
||||
# - manual: pick a target from the `weekly_audit_missing` dropdown;
|
||||
# "all" fans out every os/arch as parallel matrix workflows.
|
||||
# - manual: pick a target from the `weekly_audit_missing` dropdown
|
||||
# ("all" = every os/arch).
|
||||
# Arch placement is via the group label (rpkgs-amd64, rpkgs-arm64).
|
||||
variables:
|
||||
# Gates this pipeline. A manual pipeline creation instantiates every file in
|
||||
# .crow/, and a declared default is applied even when the run never passed
|
||||
# this variable, so the default must be a value that matches no matrix row.
|
||||
weekly_audit_missing:
|
||||
description: "Manual run target: a specific <os>-<arch>, 'all' to run every os/arch in parallel, or 'none' to run nothing."
|
||||
description: "Manual run target: a specific <os>-<arch>, or 'all' for every os/arch."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-321-amd64
|
||||
- alpine-321-arm64
|
||||
- alpine-322-amd64
|
||||
- alpine-322-arm64
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
|
|
@ -29,9 +27,7 @@ variables:
|
|||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
default: all
|
||||
|
||||
when:
|
||||
- event: cron
|
||||
|
|
@ -46,19 +42,27 @@ labels:
|
|||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
- OS: alpine-321
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
- OS: alpine-321
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-322
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-322
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
|
|
@ -102,14 +106,6 @@ matrix:
|
|||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Audit missing binaries'
|
||||
|
|
@ -136,8 +132,7 @@ steps:
|
|||
- 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-*
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- UVR_R_BIN=/opt/R/$R_VERSION/bin/R local/uvr-install.sh RPostgres httr2 jsonlite
|
||||
- /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:
|
||||
docker:
|
||||
|
|
|
|||
|
|
@ -1,33 +1,18 @@
|
|||
# Weekly failure-triage proposals (issue #115, steps 3 + 4).
|
||||
# Classifies the recorded `single_builds` failures and:
|
||||
# 1. posts/updates a Forgejo issue with the auto-proposable registry entries
|
||||
# (human reviews, trial-builds, and opens the PR -- nothing merges),
|
||||
# 2. posts/updates a second Forgejo issue with the classifier's blind spots
|
||||
# (unclassified failures = candidates for new signatures, and groups
|
||||
# blocked on a dependency), and prints the feedback-loop metrics to the log.
|
||||
# 1. posts/updates a Forgejo tracking issue with the auto-proposable registry
|
||||
# entries (human reviews, trial-builds, and opens the PR -- nothing merges), and
|
||||
# 2. prints the feedback-loop metrics (signature hit rate, proposed-vs-merged,
|
||||
# retirement candidates) to the run log.
|
||||
# Global across platforms (the classifier groups over all of single_builds), so
|
||||
# a single job -- no matrix. Clones read-only; the only writes are the two
|
||||
# Forgejo issues via FORGEJO_TOKEN.
|
||||
# a single job -- no matrix. Clones read-only; the only write is the Forgejo
|
||||
# issue via FORGEJO_TOKEN.
|
||||
#
|
||||
# Run manually with:
|
||||
# crow pipeline create --branch main \
|
||||
# --var weekly_patch_proposals=true devxy/build-cran-binaries
|
||||
#
|
||||
# The gate variable is `weekly_patch_proposals`, named after the pipeline: a
|
||||
# manual run instantiates every pipeline in `.crow/`, so one without its own
|
||||
# gate runs on *any* manual trigger in this repo. This one posts and edits
|
||||
# Forgejo issues, so an unrelated manual run must not fire it.
|
||||
variables:
|
||||
weekly_patch_proposals:
|
||||
description: 'Run the weekly failure triage. Also gates this pipeline.'
|
||||
options:
|
||||
- 'true'
|
||||
- 'false'
|
||||
default: 'false'
|
||||
|
||||
# Register the cron in the crow UI as `weekly-patch-proposals`, or run manually:
|
||||
# woodpecker-cli pipeline create --var task=weekly-patch-proposals --branch=main 7
|
||||
when:
|
||||
- event: manual
|
||||
evaluate: 'weekly_patch_proposals == "true"'
|
||||
evaluate: 'task == "weekly-patch-proposals"'
|
||||
- event: cron
|
||||
cron: weekly-patch-proposals
|
||||
|
||||
|
|
@ -53,9 +38,9 @@ steps:
|
|||
- 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-*
|
||||
- UVR_R_BIN=/opt/R/$R_VERSION/bin/R local/uvr-install.sh RPostgres httr2 jsonlite
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'pak::pak(c("httr2", "jsonlite"))'
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/propose-patches.R --open-issue
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/proposal-tracking.R --open-issue
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/proposal-tracking.R
|
||||
backend_options:
|
||||
kubernetes:
|
||||
resources:
|
||||
|
|
|
|||
|
|
@ -1,34 +1,21 @@
|
|||
# Consolidated weekly-rebuild-missing pipeline (all platforms, both arches).
|
||||
# Three matrix rows per OS/arch, one per shard of that slot's rebuild list.
|
||||
# One matrix row per OS/arch replaces the former per-platform files.
|
||||
# Routing is preserved 1:1:
|
||||
# - cron: each existing `weekly-rebuild-missing-<os>-<arch>` cron fires only
|
||||
# its matching matrix rows (via the per-row `cron:` name filter),
|
||||
# which is now all three shards of that slot.
|
||||
# - manual: pick a target from the `weekly_rebuild_missing` dropdown;
|
||||
# "all" fans out every os/arch and shard as parallel matrix
|
||||
# workflows, while a single <os>-<arch> runs its three shards.
|
||||
# its matching matrix row (via the per-row `cron:` name filter).
|
||||
# - manual: `weekly_rebuild_missing` dropdown, default "all" (matches the
|
||||
# previous bare manual trigger that ran every os/arch); pick a
|
||||
# single <os>-<arch> to run just one.
|
||||
# Arch placement is handled by the group label (rpkgs-amd64, rpkgs-arm64).
|
||||
#
|
||||
# The shard picks up its own slice and re-derives what is still outstanding
|
||||
# from the bucket, so a restart resumes rather than replaying; see
|
||||
# local/rebuild-missing.R.
|
||||
#
|
||||
# Re-indexing and the CDN purge deliberately do NOT live here. Three shards
|
||||
# writing one slot's PACKAGES concurrently would race, so they moved to
|
||||
# .crow/weekly-rebuild-reindex.yaml, which depends on this pipeline.
|
||||
variables:
|
||||
# Gates this pipeline. A manual pipeline creation instantiates every file in
|
||||
# .crow/, and a declared default is applied even when the run never passed
|
||||
# this variable, so the default must be a value that matches no matrix row.
|
||||
weekly_rebuild_missing:
|
||||
description: "Manual run target: a specific <os>-<arch>, 'all' to run every os/arch in parallel, or 'none' to run nothing."
|
||||
description: "Manual run target: a specific <os>-<arch>, or 'all' for every os/arch."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-322-amd64
|
||||
- alpine-322-arm64
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
|
|
@ -39,9 +26,7 @@ variables:
|
|||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
default: all
|
||||
|
||||
when:
|
||||
- event: cron
|
||||
|
|
@ -56,294 +41,62 @@ labels:
|
|||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: alpine-324
|
||||
- OS: alpine-322
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: alpine-324
|
||||
- OS: alpine-322
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: alpine-324
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 1
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 2
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
SPLIT_INTO: 3
|
||||
SPLIT_INDEX: 3
|
||||
|
||||
steps:
|
||||
- name: 'Rebuild missing binaries'
|
||||
|
|
@ -368,30 +121,23 @@ steps:
|
|||
FORGEJO_TOKEN:
|
||||
from_secret: FORGEJO_TOKEN
|
||||
GIT_USER: pat-s
|
||||
UVR_CACHE_DIR: /mnt/cache/uvr/cache
|
||||
UVR_PACKAGES_DIR: /mnt/cache/uvr/packages
|
||||
R_PKG_CACHE_DIR: /mnt/cache/pkgcache
|
||||
R_LIBS_USER: /mnt/cache/R-pkgs
|
||||
R_VERSION: ${R_VERSION}
|
||||
CCACHE_DIR: /mnt/cache/ccache
|
||||
PLATFORM: ${OS}
|
||||
ARCH: ${ARCH}
|
||||
NCPUS: 2
|
||||
SPLIT_INTO: ${SPLIT_INTO}
|
||||
SPLIT_INDEX: ${SPLIT_INDEX}
|
||||
# Wall clock after which the shard stops cleanly instead of having to be
|
||||
# killed. A kill matches neither `success` nor `failure`, so it would skip
|
||||
# the dependent re-index and leave rebuilt binaries behind a stale edge.
|
||||
REBUILD_BUDGET_HOURS: 20
|
||||
commands:
|
||||
- git clone -q https://pat-s:$$REPO_RO_TOKEN@git.devxy.io/devxy/build-cran-binaries.git .
|
||||
- mkdir -p /mnt/cache/uvr/cache /mnt/cache/uvr/packages /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages
|
||||
- mkdir -p /mnt/cache/pkgcache /mnt/cache/R-pkgs /mnt/cache/ccache /mnt/cache/packages
|
||||
- rm -rf /mnt/cache/R-pkgs/00LOCK-*
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'packageVersion("bincraft")'
|
||||
- XVFB=$(command -v xwfb-run 2>/dev/null || command -v xvfb-run); XVFB_ARGS="-a"; if command -v xwfb-run >/dev/null 2>&1; then dnf install -y -q weston 2>/dev/null; XVFB_ARGS="-c weston"; fi
|
||||
- UVR_R_BIN=/opt/R/$R_VERSION/bin/R local/uvr-install.sh httr2
|
||||
- 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
|
||||
- /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 -n $SPLIT_INDEX -- /opt/R/$R_VERSION/bin/Rscript local/rebuild-missing.R $SPLIT_INTO $SPLIT_INDEX $REBUILD_BUDGET_HOURS 2>&1
|
||||
- $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, patches = 'local/patches', 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:
|
||||
docker:
|
||||
resources:
|
||||
|
|
|
|||
|
|
@ -1,201 +0,0 @@
|
|||
# Re-index and purge after weekly-rebuild-missing.
|
||||
#
|
||||
# weekly-rebuild-missing runs three shards per slot. Each of them replaces
|
||||
# objects in place, so the slot's index still advertises the old MD5 and, for
|
||||
# anything that had been served from source, no Built stamp. Re-indexing from
|
||||
# inside a shard would mean three concurrent `upload_package_index()` calls on
|
||||
# one prefix: `cranlike::update_PACKAGES()` lists the live bucket, so an early
|
||||
# lister that uploads last publishes an index missing its siblings' work.
|
||||
#
|
||||
# So it happens exactly once per slot, here, after every shard has finished.
|
||||
# `runs_on: [success, failure]` keeps that true when a shard fails; only an
|
||||
# explicit cancel skips it, and this pipeline can then be triggered on its own.
|
||||
|
||||
variables:
|
||||
# Mirrors the gate on weekly-rebuild-missing so a manual run re-indexes
|
||||
# exactly the slots it rebuilt. A manual pipeline creation instantiates every
|
||||
# file in .crow/, so the default must match no matrix row.
|
||||
weekly_rebuild_missing:
|
||||
description: "Manual run target: a specific <os>-<arch>, 'all' to run every os/arch in parallel, or 'none' to run nothing."
|
||||
options:
|
||||
- none
|
||||
- all
|
||||
- alpine-323-amd64
|
||||
- alpine-323-arm64
|
||||
- alpine-324-amd64
|
||||
- alpine-324-arm64
|
||||
- redhat-8-amd64
|
||||
- redhat-8-arm64
|
||||
- redhat-9-amd64
|
||||
- redhat-9-arm64
|
||||
- redhat-10-amd64
|
||||
- redhat-10-arm64
|
||||
- ubuntu-2204-amd64
|
||||
- ubuntu-2204-arm64
|
||||
- ubuntu-2404-amd64
|
||||
- ubuntu-2404-arm64
|
||||
- ubuntu-2604-amd64
|
||||
- ubuntu-2604-arm64
|
||||
default: none
|
||||
|
||||
when:
|
||||
- event: cron
|
||||
cron: weekly-rebuild-missing-${OS}-${ARCH}
|
||||
- event: manual
|
||||
evaluate: 'weekly_rebuild_missing == "all" || weekly_rebuild_missing == "${OS}-${ARCH}"'
|
||||
|
||||
depends_on:
|
||||
- weekly-rebuild-missing
|
||||
|
||||
runs_on: [success, failure]
|
||||
|
||||
skip_clone: true
|
||||
|
||||
labels:
|
||||
group: rpkgs-${ARCH}
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- OS: alpine-323
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-323
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.23
|
||||
- OS: alpine-324
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: alpine-324
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: alpine:3.24
|
||||
- OS: redhat-8
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-8
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:8
|
||||
- OS: redhat-9
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-9
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: redhat:9
|
||||
- OS: redhat-10
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: redhat-10
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.5.3
|
||||
IMG: redhat:10
|
||||
- OS: ubuntu-2204
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2204
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:jammy
|
||||
- OS: ubuntu-2404
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2404
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:noble
|
||||
- OS: ubuntu-2604
|
||||
ARCH: amd64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
- OS: ubuntu-2604
|
||||
ARCH: arm64
|
||||
R_VERSION: 4.4.3
|
||||
IMG: ubuntu:resolute
|
||||
|
||||
steps:
|
||||
- name: 'Re-index the slot'
|
||||
image: reg.devxy.io/rpkgs/build-env-${IMG}
|
||||
pull: true
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
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
|
||||
# The index build reads the ABI classifier cache to decide which packages
|
||||
# may be carried from the flat slot into a per-minor one. Without the
|
||||
# password that query fails, and it fails soft, so the run still succeeds
|
||||
# while quietly using an empty risky set: exactly the state the cache was
|
||||
# added to fix. It logs one connection error per slot.
|
||||
PGPASS:
|
||||
from_secret: PGPASS
|
||||
REPO_RO_TOKEN:
|
||||
from_secret: REPO_RO_TOKEN
|
||||
# uvr resolves bincraft's dependencies through the GitHub API, including
|
||||
# the pat-s/cranlike@s3 fork. Unauthenticated it is rate limited, and the
|
||||
# failure is not loud: uvr warns, falls back to the registry copy of
|
||||
# cranlike, and the index write then dies on `unused argument (built =
|
||||
# built)` because upstream has no such parameter. Intermittent by nature,
|
||||
# since it depends on the rate-limit window.
|
||||
GITHUB_PAT:
|
||||
from_secret: GITHUB_PAT
|
||||
GIT_USER: pat-s
|
||||
R_LIBS_USER: /mnt/cache/R-pkgs
|
||||
R_VERSION: ${R_VERSION}
|
||||
PLATFORM: ${OS}
|
||||
ARCH: ${ARCH}
|
||||
commands:
|
||||
- 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-*
|
||||
- /opt/R/$R_VERSION/bin/Rscript local/install-bincraft.R
|
||||
# The codename is detected from the image's /etc/os-release.
|
||||
- /opt/R/$R_VERSION/bin/R -q -e 'library(bincraft); upload_package_index(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"))'
|
||||
- |
|
||||
for RBIN in /opt/R/[0-9]*/bin/R; do
|
||||
RMINOR=$(basename "$(dirname "$(dirname "$RBIN")")" | cut -d. -f1-2)
|
||||
/opt/R/$R_VERSION/bin/R -q -e "library(bincraft); upload_package_index(r_minor = '$RMINOR', 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'))" || true
|
||||
done
|
||||
|
||||
- name: Purge CDN cache
|
||||
image: reg.devxy.io/docker.io/library/alpine:3.24
|
||||
environment:
|
||||
OTEL_R_TRACES_EXPORTER: none
|
||||
OTEL_R_LOGS_EXPORTER: none
|
||||
OTEL_R_METRICS_EXPORTER: none
|
||||
BUNNYNET_API_KEY:
|
||||
from_secret: BUNNYNET_API_KEY
|
||||
# cran.rpkgs.com and cran.allianceswisspass.devxy.io are on separate
|
||||
# Bunny pull zones, so both must be purged after the shared origin changes.
|
||||
# The staging zone is listed too. It shares the B2 origin, so an index
|
||||
# it still holds is a stale copy of the same object, and its
|
||||
# cache_expiration_time is the same ~370 days: without a purge here it
|
||||
# serves pre-reindex indexes indefinitely and any verification run
|
||||
# against it measures the past.
|
||||
BUNNY_PULLZONES: '3857050 cran.allianceswisspass.devxy.io cran-rpkgs-test.b-cdn.net'
|
||||
commands:
|
||||
- apk add --no-cache -q bash curl jq
|
||||
# Crow carries the checkout from the re-index step into this step.
|
||||
- bash scripts/purge_cdn_zone.sh "$BUNNYNET_API_KEY" $BUNNY_PULLZONES
|
||||
# Runs on every row rather than on one designated slot: a cron fires only
|
||||
# its own slot's row, so gating on a named slot would leave every other
|
||||
# slot unpurged. A manual "all" run therefore purges the zone 18 times,
|
||||
# which is a cheap API call and rare.
|
||||
#
|
||||
# Run it even when the re-index above failed: the objects were still
|
||||
# replaced, and a stale edge is exactly what keeps them hidden.
|
||||
when:
|
||||
- status: [success, failure]
|
||||
|
|
@ -7,39 +7,30 @@ exclude: |
|
|||
benchmark/|
|
||||
docker/reprex/
|
||||
)
|
||||
# The `^local/patches/.*\.patch$` excludes below keep unified diffs byte-exact:
|
||||
# a context line for a blank line is a single space, and stripping it (or
|
||||
# appending a newline) makes `git apply` reject the patch, which surfaces as
|
||||
# "patch did not apply cleanly" at build time rather than as a lint failure
|
||||
# here. The exclusions are per-hook, not global, so `validate patch registry`
|
||||
# still runs when a patch changes.
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v6.0.0
|
||||
hooks:
|
||||
- id: end-of-file-fixer
|
||||
exclude: ^local/patches/.*\.patch$
|
||||
- id: trailing-whitespace
|
||||
exclude: ^local/patches/.*\.patch$
|
||||
args:
|
||||
- --markdown-linebreak-ext=md
|
||||
- repo: https://github.com/DavidAnson/markdownlint-cli2
|
||||
rev: v0.23.3
|
||||
rev: v0.23.0
|
||||
hooks:
|
||||
- id: markdownlint-cli2
|
||||
- repo: https://github.com/rbubley/mirrors-prettier
|
||||
rev: v3.9.10
|
||||
rev: v3.9.4
|
||||
hooks:
|
||||
- id: prettier
|
||||
- repo: https://github.com/posit-dev/air-pre-commit
|
||||
rev: 0.12.0
|
||||
rev: 0.10.0
|
||||
hooks:
|
||||
- id: air-format
|
||||
- repo: https://github.com/editorconfig-checker/editorconfig-checker
|
||||
rev: v4.0.2
|
||||
rev: v3.8.0
|
||||
hooks:
|
||||
- id: editorconfig-checker
|
||||
exclude: ^local/patches/.*\.patch$
|
||||
- repo: https://github.com/adrienverge/yamllint.git
|
||||
rev: v1.38.0
|
||||
hooks:
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue