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
3 changed files with 327 additions and 245 deletions
|
|
@ -1,7 +1,15 @@
|
|||
FROM devxygmbh/r-alpine:4.4-3.20 AS build
|
||||
|
||||
# ARG GITHUB_PAT
|
||||
RUN R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/stable/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))'
|
||||
RUN apk add --no-cache curl ca-certificates \
|
||||
&& curl -fsSL https://raw.githubusercontent.com/nbafrank/uvr/main/install.sh \
|
||||
| UVR_INSTALL_DIR=/usr/local/bin sh
|
||||
|
||||
# One uvr project drives both dependency installs below. UVR_LIBRARY points the
|
||||
# syncs at the image's R library instead of the project-local .uvr/library/, so
|
||||
# `Rscript app.R` finds the packages without a uvr-aware .Rprofile.
|
||||
ENV UVR_LIBRARY=/usr/lib/R/library
|
||||
RUN mkdir -p /uvr && cd /uvr && uvr init --here
|
||||
|
||||
COPY --link ./DESCRIPTION .
|
||||
COPY --link ./R ./R
|
||||
|
|
@ -11,13 +19,19 @@ COPY --link ./shiny/app.R /app/app.R
|
|||
|
||||
RUN ls -la
|
||||
|
||||
# install R package deps
|
||||
RUN R -q -e 'pak::pak()'
|
||||
# install R package deps. uvr has no equivalent of bare `pak::pak()`, which
|
||||
# reads the DESCRIPTION in the working directory, so extract the dependency
|
||||
# names and hand them to `uvr add`.
|
||||
RUN R -q --no-echo -e "d <- read.dcf('DESCRIPTION'); f <- intersect(colnames(d), c('Depends', 'Imports', 'LinkingTo')); p <- trimws(sub('[(].*', '', unlist(strsplit(paste(d[, f], collapse = ','), ',')))); writeLines(setdiff(p[nzchar(p)], c('R', rownames(installed.packages()))), '/tmp/deps.txt')" \
|
||||
&& cd /uvr && xargs -r uvr add --no-install < /tmp/deps.txt \
|
||||
&& uvr sync --install-system-deps
|
||||
|
||||
RUN R CMD INSTALL --no-docs --without-keep.source .
|
||||
|
||||
# install shiny app deps
|
||||
RUN R -q -e "install.packages('renv'); pkgs <- renv::dependencies('/app/app.R')[['Package']]; pkgs = setdiff(pkgs, 'bincraft'); pak::pak(pkgs)"
|
||||
RUN R -q -e "install.packages('renv'); pkgs <- renv::dependencies('/app/app.R')[['Package']]; pkgs = setdiff(pkgs, 'bincraft'); writeLines(pkgs, '/tmp/app-deps.txt')" \
|
||||
&& cd /uvr && xargs -r uvr add --no-install < /tmp/app-deps.txt \
|
||||
&& uvr sync --install-system-deps
|
||||
|
||||
ENV PGPASS=""
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,10 @@ ARG CACHEBUST
|
|||
WORKDIR /work
|
||||
COPY build-one.R /work/build-one.R
|
||||
# Resolve and install the latest bincraft release dynamically (no hardcoded pin).
|
||||
# uvr-install.sh lands under /work/local/ because install-bincraft.R looks for it
|
||||
# there when the working directory is not a repo checkout.
|
||||
COPY install-bincraft.R /work/install-bincraft.R
|
||||
COPY uvr-install.sh /work/local/uvr-install.sh
|
||||
# Ship the patch registry so build-one.R's `patches = "local/patches"` resolves
|
||||
# (build context is `local/`, CWD is /work).
|
||||
COPY patches /work/local/patches
|
||||
|
|
|
|||
|
|
@ -1,10 +1,14 @@
|
|||
docker run --rm -it --platform linux/arm64 alpine sh
|
||||
|
||||
apk add --no-cache R R-dev g++
|
||||
apk add --no-cache R R-dev g++ curl ca-certificates
|
||||
|
||||
R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/devel/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))'
|
||||
curl -fsSL https://raw.githubusercontent.com/nbafrank/uvr/main/install.sh | UVR_INSTALL_DIR=/usr/local/bin sh
|
||||
|
||||
R -q -e 'pak::pak(c("gert", "purrr"))'
|
||||
# `uvr add` always writes to .uvr/library/; only `uvr sync` honours UVR_LIBRARY,
|
||||
# so add without installing and let the sync place the packages.
|
||||
export UVR_LIBRARY=/usr/lib/R/library
|
||||
mkdir -p /uvr && cd /uvr && uvr init --here
|
||||
uvr add --no-install gert purrr && uvr sync --install-system-deps
|
||||
|
||||
R
|
||||
|
||||
|
|
@ -22,14 +26,20 @@ unlink(sprintf("%s/%s", tempdir(), "tmp1"), force = TRUE, recursive = TRUE)
|
|||
tag <- all_tags$name
|
||||
package_name <- rep(package_name, length(tag))
|
||||
|
||||
# uvr has no `pak::local_install_deps()`; read the DESCRIPTION of the checkout
|
||||
# and `uvr add` the dependency names instead.
|
||||
purrr::walk2(package_name[1], tag, \(x, y) {
|
||||
print(y)
|
||||
system("git config --global advice.detachedHead false")
|
||||
src <- sprintf("/tmp/%s_%s", x[1], y)
|
||||
system2("git", args = c(
|
||||
"clone", "-q", sprintf("--branch=%s", tail(y, 1)),
|
||||
sprintf("https://github.com/cran/%s", x[1]), sprintf("/tmp/%s_%s", x[1], y)
|
||||
sprintf("https://github.com/cran/%s", x[1]), src
|
||||
))
|
||||
pak::local_install_deps(sprintf("/tmp/%s_%s", x[1], y))
|
||||
d <- read.dcf(file.path(src, "DESCRIPTION"))
|
||||
f <- intersect(colnames(d), c("Depends", "Imports", "LinkingTo"))
|
||||
deps <- trimws(sub("[(].*", "", unlist(strsplit(paste(d[, f], collapse = ","), ","))))
|
||||
deps <- setdiff(deps[nzchar(deps)], "R")
|
||||
system2("uvr", c("add", "--no-install", deps))
|
||||
system2("uvr", c("sync", "--install-system-deps"))
|
||||
})
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue