always inject error as character into DB

This commit is contained in:
Patrick Schratz 2024-07-25 00:52:16 +02:00
commit af04f7938e
Signed by: pat-s
GPG key ID: 3C6318841EF78925
3 changed files with 17 additions and 7 deletions

View file

@ -29,6 +29,9 @@ steps:
# rscript_startup arg: required to pass down global option to future workers https://github.com/HenrikBengtsson/future/issues/134#issuecomment-2245666169
- git clone https://pat-s:$$git_ro_token@git.devxy.io/devxy/arm64-r-binaries.git && cd arm64-r-binaries
- R -q -e 'install.packages(".", repos = NULL, quiet = FALSE); packageVersion("rBinaries")'
# manually install some packages into the cache so that some builds don't fail
# Hmisc -> ABCanalysis
- R -q -e 'pak::pak("Hmisc")'
- R -q -e 'options(crayon.enabled = TRUE, Ncpus = 4, future.globals.onReference = "error"); pkgs = tools::CRAN_package_db()[[1]][1:500]; library(rBinaries); future::plan("multisession", workers = 4, rscript_startup = quote(options(crayon.enabled = TRUE))); foo = lapply(pkgs, function(x) build_binary_package(x, build_for_minor=FALSE, debug = FALSE, force = TRUE))'
backend_options:
kubernetes:

View file

@ -88,26 +88,29 @@ build_binary_package <- function(package_name, tag = NULL, codename = NULL,
tryCatch(
{
p()
store_build_metadata(x, y, platform, error_occurred = FALSE, force = force)
dump <- build_single_tag(x, y, dir_out_bin, local_clone_dir, platform = platform, debug = debug)
store_build_metadata(x, y, platform, error_occurred = FALSE, force = force)
con <- DBI::dbConnect(RPostgres::Postgres(),
dbname = "build_metadata", host = "postgres-arm-binaries-r.devxy.io",
port = 15432, user = "arm_binaries", password = Sys.getenv("PGPASS")
)
# here we check if build_duration is empty and take this as an indicator that the build failed. I.e. we set error_occurred = TRUE
val <- dbGetQuery(con, sprintf("SELECT build_duration FROM single_builds WHERE package_name = '%s' and tag = '%s'", x, y))
if (is.na(val)) {
dbExecute(con, sprintf("UPDATE single_builds SET error_occurred = TRUE WHERE package_name = '%s' and tag = '%s'", x, y))
}
# val <- dbGetQuery(con, sprintf("SELECT build_duration FROM single_builds WHERE package_name = '%s' and tag = '%s'", x, y))
# if (is.na(val)) {
# dbExecute(con, sprintf("UPDATE single_builds SET error_occurred = TRUE WHERE package_name = '%s' and tag = '%s'", x, y))
# }
dbDisconnect(con)
},
error = function(e) {
message(sprintf("Error in processing package %s with tag %s: %s", x, y, e))
# print(e)
# str(e)
local_clone_dir_single <- sprintf("%s/%s_%s", local_clone_dir, x, y)
unlink(local_clone_dir_single, force = TRUE, recursive = TRUE)
# NB: this does not always work, which is why we are using the lack of build_duration as a secondary factor in store_metadata()
store_build_metadata(x, y, platform, error_occurred = TRUE, force = TRUE, error = e)
# error <- paste("Call:", deparse(conditionCall(e)), "\nMessage:", conditionMessage(e), sep = " ")
store_build_metadata(x, y, platform, error_occurred = TRUE, force = TRUE, error = e$stderr)
}
)
}, package_name, tag, future.seed = TRUE)

View file

@ -13,12 +13,16 @@ store_build_metadata <- function(
package_name, "' AND tag = '", tag, "'"
))
if (is.null(error)) {
error <- NA
}
if (nrow(existing_entries) >= 1 && !force) {
cli::cli_alert("{.fun store_build_metadata}: Build metadata for {.field {.pkg package_name}} {.field {tag}} already exists.")
} else if (nrow(existing_entries) >= 1 && force) {
cli::cli_alert_info("{.fun store_build_metadata}: Force overwriting build metadata for {.pkg {package_name}} {.field {tag}} because {.code force = TRUE} was set.")
DBI::dbExecute(con, sprintf("UPDATE single_builds SET build_timestamp = '%s', error_occurred = %s, error = '%s' WHERE package_name = '%s' and tag = '%s'", format(Sys.time(), "%Y-%m-%d %H:%M:%S"), error_occurred, error, package_name, tag))
DBI::dbExecute(con, "UPDATE single_builds SET build_timestamp = $1, error_occurred = $2, error = $3 WHERE package_name = $4 and tag = $5", params = list(format(Sys.time(), "%Y-%m-%d %H:%M:%S"), error_occurred, error, package_name, tag))
} else if (nrow(existing_entries) == 0) {
cli::cli_alert("{.fun store_build_metadata}: Storing build metadata for {.pkg {package_name}} {.field {tag}}.")
# Create a data frame with the metadata