sink(stdout(), type = "message") options(crayon.enabled = TRUE, future.globals.onReference = NULL) args <- commandArgs(trailingOnly = TRUE) split_into <- as.integer(args[1]) split_index <- as.integer(args[2]) ncpus <- as.integer(args[3]) options(Ncpus = ncpus) # Load bincraft eagerly to avoid lazy-load memory spike during first build call library(bincraft, quietly = TRUE) library(future) plan("sequential") # Read precomputed package+version pairs pkgs <- readRDS("/mnt/cache/packages/pkgs_to_build.rds") sprintf("Total# of remaining package versions: %s", nrow(pkgs)) # Split into chunks for this worker chunks <- split(pkgs, cut(seq_len(nrow(pkgs)), split_into, labels = FALSE)) chunk <- chunks[[split_index]] sprintf("# of package versions for this job: %s", nrow(chunk)) # Exclude known problematic packages (single source of truth) exclude <- jsonlite::fromJSON("local/excluded-packages.json")[["package"]] chunk <- chunk[!chunk$Package %in% exclude, ] # Read pre-computed S3 listing from install-deps step # This avoids loading s3fs/reticulate/Python in the build container, # saving significant memory for pak subprocess forks s3_cache <- readRDS("/mnt/cache/packages/s3_cache.rds") sprintf("S3 cache: %s files", length(s3_cache)) n <- nrow(chunk) mapply(function(pkg, ver, i) { cat(sprintf("[%d/%d] %s_%s\n", i, n, pkg, ver)) bincraft::build_binary_package( pkg, tag = ver, 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"), s3_package_cache = s3_cache, 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 ) }, chunk$Package, chunk$Version, seq_len(n))