From d2fc0c960007f6ef0ba4ee366716ad8bdf72a2e1 Mon Sep 17 00:00:00 2001 From: pat-s Date: Fri, 12 Jun 2026 16:08:46 +0200 Subject: [PATCH] ci: build last four minor R versions instead of only the latest Derive the latest patch release of each of the last four minor R versions from posit's versions.json and build any that are missing from S3, so older supported minors stay available rather than only the newest stable. Replace the awk regex existence check with a literal index() match; the unescaped version dots made e.g. 4.4.3 spuriously match 4.3.3. --- .crow/build.yaml | 52 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/.crow/build.yaml b/.crow/build.yaml index 57478f7..921f9d3 100644 --- a/.crow/build.yaml +++ b/.crow/build.yaml @@ -114,15 +114,26 @@ steps: kubernetes.io/arch: "${ARCH}" - - name: Get latest R version + - name: Get R versions to build image: reg.devxy.io/docker.io/library/alpine:3.23 privileged: true commands: - ip link set dev eth0 mtu 1280 2>/dev/null || true - for i in 1 2 3 4 5; do apk add -q --no-cache curl jq && break; sleep 5; done - - curl -sf https://formulae.brew.sh/api/formula/r.json | jq -er '.versions.stable' > r-version-to-build.txt - # - echo "4.1.3" > r-version-to-build.txt - - cat r-version-to-build.txt + # Latest patch release of each of the last 4 minor R versions (e.g. 4.6.0, 4.5.3, 4.4.3, 4.3.3). + - | + curl -sf https://cdn.posit.co/r/versions.json | jq -r ' + .r_versions + | map(select(test("^[0-9]+\\.[0-9]+\\.[0-9]+$"))) + | group_by(split(".")[0:2] | join(".")) + | map(max_by(split(".") | map(tonumber))) + | sort_by(split(".") | map(tonumber)) + | reverse + | .[0:4] + | .[]' > r-versions-to-build.txt + # To pin specific versions for testing, overwrite the file, e.g.: + # - printf '4.1.3\n' > r-versions-to-build.txt + - cat r-versions-to-build.txt backend_options: kubernetes: resources: @@ -136,19 +147,23 @@ steps: kubernetes.io/arch: "${ARCH}" - - name: Check if files for R version already exist in s3 + - name: Check which R versions already exist in s3 image: reg.devxy.io/docker.io/library/alpine:3.23 privileged: true commands: - ip link set dev eth0 mtu 1280 2>/dev/null || true - for i in 1 2 3 4 5; do apk add -q --no-cache curl && break; sleep 5; done - | - VERSION=$(cat r-version-to-build.txt) - curl -s "https://s3.eu-central-003.backblazeb2.com/devxy-r-builds?prefix=${PLATFORM_ID}/" | \ - grep -oE '[^<]+' | sed 's/<[^>]*>//g' | \ - awk -v arch="${ARCH_ID}" -v ver="${VERSION}" \ - '$0 ~ arch && $0 ~ ver {print substr($NF, 3, 5)}' > r-version-s3.txt - - cat r-version-s3.txt + LISTING=$(curl -s "https://s3.eu-central-003.backblazeb2.com/devxy-r-builds?prefix=${PLATFORM_ID}/" | \ + grep -oE '[^<]+' | sed 's/<[^>]*>//g') + : > r-versions-existing.txt + for VERSION in $(cat r-versions-to-build.txt); do + if printf '%s\n' "$LISTING" | \ + awk -v arch="${ARCH_ID}" -v ver="$VERSION" 'index($0, arch) && index($0, ver) { found=1 } END { exit !found }'; then + echo "$VERSION" >> r-versions-existing.txt + fi + done + - echo "Already present in s3:"; cat r-versions-existing.txt backend_options: kubernetes: nodeSelector: @@ -164,9 +179,20 @@ steps: commands: | ip link set dev eth0 mtu 1280 2>/dev/null || true # docker info - if ! grep -qF "$(cat r-version-to-build.txt)" r-version-s3.txt; then + TO_BUILD="" + for VERSION in $(cat r-versions-to-build.txt); do + if grep -qxF "$VERSION" r-versions-existing.txt; then + echo "R $VERSION already exists for ${PLATFORM} (${ARCH_ID}), skipping" + else + TO_BUILD="$TO_BUILD $VERSION" + fi + done + if [ -n "$TO_BUILD" ]; then for i in 1 2 3 4 5; do apk add -q --no-cache make just docker-compose && break; sleep 5; done - just build-r-${PLATFORM} $(cat r-version-to-build.txt) + for VERSION in $TO_BUILD; do + echo "Building R $VERSION for ${PLATFORM}" + just build-r-${PLATFORM} "$VERSION" + done fi backend_options: kubernetes: -- 2.54.0