refactor: migrate package installation from pak to uvr
bincraft dropped pak in favour of uvr, so the pipelines, helper scripts and images in this repo move with it. - add local/uvr-install.sh as the single replacement for pak::pak(); it bootstraps a pinned uvr, mints a throwaway project under TMPDIR and runs `uvr add --no-install` + `uvr sync --library`, because `uvr add` refuses to run outside a project and only `sync` honours --library - install bincraft via its Forgejo spec (forgejo::codefloe.com/rpkgs/ bincraft@<tag>) instead of a git:: URL, keeping the git ls-remote tag resolution - pass UVR_R_BIN/UVR_TARGET_LIB from install-bincraft.R so the per-R-minor passes target their own R and library - replace R_PKG_CACHE_DIR with UVR_CACHE_DIR/UVR_PACKAGES_DIR on the persistent volume, preserving the amd64-off/arm64-on split - drop trim_pkgcache_metadata() and its test; uvr's cache does not grow the way pkgcache's _metadata dir did - let uvr install system requirements from its vendored r-system-requirements rules, replacing pak::sysreqs_db_update() - migrate the shiny app image, the alpine reprex and the CRAN loading test; ship uvr-install.sh in the build-one image - track the uvr pin with renovate
This commit is contained in:
parent
fe2289af56
commit
f3c18b6805
1 changed files with 327 additions and 245 deletions
90
local/uvr-install.sh
Executable file
90
local/uvr-install.sh
Executable file
|
|
@ -0,0 +1,90 @@
|
|||
#!/bin/sh
|
||||
# Install R packages into the CI library with uvr (https://github.com/nbafrank/uvr).
|
||||
#
|
||||
# Usage:
|
||||
# local/uvr-install.sh httr2 jsonlite
|
||||
# local/uvr-install.sh forgejo::codefloe.com/rpkgs/bincraft@v4.4.3
|
||||
#
|
||||
# Replaces `pak::pak(...)`. uvr is project-scoped: `uvr add` refuses to run
|
||||
# outside a project and always writes to `.uvr/library/`, and only
|
||||
# `uvr sync --library` can target an existing library. The project is therefore
|
||||
# minted in a scratch directory under TMPDIR and thrown away afterwards; that
|
||||
# also keeps `uvr init`'s `.Rprofile` out of the repo checkout, where it would
|
||||
# hijack `.libPaths()` for every other R call in the pipeline.
|
||||
#
|
||||
# Pruning is a no-op here: uvr disables it whenever `--library` is passed,
|
||||
# precisely because such a target may be shared (`/mnt/cache/R-pkgs` holds
|
||||
# bincraft and its dependencies alongside whatever this script installs).
|
||||
#
|
||||
# System dependencies come from uvr's vendored r-system-requirements rules, so
|
||||
# `pak::sysreqs_db_update()` and `PKG_SYSREQS_PLATFORM` are no longer needed.
|
||||
#
|
||||
# Environment:
|
||||
# UVR_R_BIN R interpreter to install for; set by install-bincraft.R so
|
||||
# the per-R-minor passes target their own R, not the primary
|
||||
# R_VERSION fallback interpreter selector (/opt/R/<version>/bin/R)
|
||||
# UVR_TARGET_LIB target library; defaults to R_LIBS_USER, then to the
|
||||
# active R's .libPaths()[1] (which is where pak wrote)
|
||||
# UVR_INSTALL_DIR where the uvr binary lands (default /usr/local/bin)
|
||||
|
||||
set -eu
|
||||
|
||||
# renovate: datasource=github-releases depName=nbafrank/uvr
|
||||
UVR_PIN="v0.4.4"
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
echo "usage: $0 <pkg-spec>..." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# The build images keep R under /opt/R/<version> and off PATH. uvr resolves the
|
||||
# interpreter via PATH and never downloads one unless `uvr r install` is run, so
|
||||
# put the requested R first.
|
||||
r_bin="${UVR_R_BIN:-}"
|
||||
if [ -z "$r_bin" ] && [ -n "${R_VERSION:-}" ] && [ -x "/opt/R/${R_VERSION}/bin/R" ]; then
|
||||
r_bin="/opt/R/${R_VERSION}/bin/R"
|
||||
fi
|
||||
if [ -n "$r_bin" ]; then
|
||||
PATH="$(dirname "$r_bin"):$PATH"
|
||||
export PATH
|
||||
else
|
||||
r_bin="$(command -v R)"
|
||||
fi
|
||||
|
||||
target_lib="${UVR_TARGET_LIB:-${R_LIBS_USER:-}}"
|
||||
if [ -z "$target_lib" ]; then
|
||||
target_lib="$("$r_bin" --no-echo --no-save -e 'cat(.libPaths()[1])')"
|
||||
fi
|
||||
if [ -z "$target_lib" ]; then
|
||||
echo "error: could not determine a target library; set UVR_TARGET_LIB" >&2
|
||||
exit 2
|
||||
fi
|
||||
mkdir -p "$target_lib"
|
||||
|
||||
# Pin the manifest to the active R so the lockfile's R stays in step with the
|
||||
# library's R sentinel. Without that, uvr can decide the library is ABI-stale
|
||||
# and wipe it -- and this target is shared with bincraft. uvr only discovers R
|
||||
# via PATH/R_HOME (it does not scan /opt/R), so the R put on PATH above is the
|
||||
# only candidate this constraint can resolve to.
|
||||
# shellcheck disable=SC2016 # $major/$minor are R expressions, not shell vars
|
||||
r_full="$("$r_bin" --no-echo --no-save -e 'cat(paste(R.version$major, R.version$minor, sep = "."))')"
|
||||
|
||||
install_dir="${UVR_INSTALL_DIR:-/usr/local/bin}"
|
||||
uvr_bin="${install_dir}/uvr"
|
||||
if [ ! -x "$uvr_bin" ]; then
|
||||
echo "Bootstrapping uvr ${UVR_PIN} into ${install_dir}"
|
||||
UVR_INSTALL_DIR="$install_dir" UVR_VERSION="$UVR_PIN" \
|
||||
sh -c 'curl -fsSL https://raw.githubusercontent.com/nbafrank/uvr/main/install.sh | sh'
|
||||
fi
|
||||
|
||||
project_dir="${TMPDIR:-/tmp}/uvr-ci-$$"
|
||||
rm -rf "$project_dir"
|
||||
mkdir -p "$project_dir"
|
||||
trap 'rm -rf "$project_dir"' EXIT
|
||||
cd "$project_dir"
|
||||
|
||||
"$uvr_bin" init --here --r-version "$r_full"
|
||||
# --no-install: resolve and lock only. The install happens in the sync below,
|
||||
# which is the only command that honours --library.
|
||||
"$uvr_bin" add --no-install "$@"
|
||||
"$uvr_bin" sync --library "$target_lib" --install-system-deps
|
||||
Loading…
Reference in a new issue