build-cran-binaries/R/upload.R
2024-09-23 22:08:32 +02:00

72 lines
3.3 KiB
R

#' @importFrom s3fs s3_file_exists s3_file_upload s3_file_system
#' @export
upload_single_binary_to_s3 <- function(
endpoint = "https://s3.eu-central-003.backblazeb2.com",
region = "eu-central-003",
bucket = "devxy-arm64-r-binaries",
local_build_root = "/root",
codename = NULL,
package_name, tag,
r_minor_version = NULL, build_for_minor = FALSE,
force = FALSE,
debug = FALSE) {
codename <- set_codename(codename)
cli::cli_h2("Uploading ({.pkg {package_name[1]}})")
if (is.null(r_minor_version)) {
r_minor_version <- sub("R version (\\d+\\.\\d+).*", "\\1", R.Version()$version.string)
}
local_bin_path <- set_bin_path(r_minor_version, build_for_minor, local_build_root = local_build_root, codename)
remote_bin_path <- set_bin_path(r_minor_version, build_for_minor, local_build_root = bucket, codename)
tarball_name <- sprintf("%s_%s.tar.gz", package_name, tag)
if (!file.exists(sprintf("%s/%s", local_bin_path, tarball_name))) {
cli::cli_alert("{.fun upload_single_binary_to_s3}: File {.pkg {package_name}} {.field {tag}} does not exist locally - skipping upload.")
return(TRUE)
}
if (debug) {
cli::cli_alert_warning("DEBUG: local_bin_path: {local_bin_path}")
cli::cli_alert_warning("DEBUG: remote_bin_path: {remote_bin_path}")
}
s3fs::s3_file_system(
aws_access_key_id = Sys.getenv("AWS_ACCESS_KEY_ID"),
aws_secret_access_key = Sys.getenv("AWS_SECRET_ACCESS_KEY"),
endpoint = endpoint,
region_name = region,
)
exists <- s3fs::s3_file_exists(sprintf("%s/%s", remote_bin_path, tarball_name))
# suppress progressr output here
progressr::handlers("void")
# don't parallelise
future::plan("sequential")
if ((!exists && !force) || (!exists && force)) {
cli::cli_alert("{.fun upload_single_binary_to_s3}: Uploading {.pkg {package_name}} {.field {tag}} to {.path {sprintf('%s/%s', remote_bin_path, tarball_name)}}.")
s3fs::s3_file_upload(
sprintf("%s/%s", local_bin_path, tarball_name),
sprintf("%s/%s", remote_bin_path, tarball_name)
)
cli::cli_alert_success("Successfully uploaded package {.pkg {package_name}} with tag {.field {tag}}.")
cli::cli_alert("{.fun upload_single_binary_to_s3}: Deleting binary for {.pkg {package_name}} {.field {tag}} at path {.path {sprintf('%s/%s', local_bin_path, tarball_name)}}.")
file.remove(sprintf("%s/%s", local_bin_path, tarball_name))
} else if (exists && force) {
cli::cli_alert_info("{.fun upload_single_binary_to_s3}: Force uploading package {.pkg {package_name}} {.field {tag}} to {.path {sprintf('%s/%s', remote_bin_path, tarball_name)}} because {.code force = TRUE} was set.")
s3fs::s3_file_upload(
sprintf("%s/%s", local_bin_path, tarball_name),
sprintf("%s/%s", remote_bin_path, tarball_name),
overwrite = TRUE
)
cli::cli_alert_success("Successfully uploaded package {.pkg {package_name}} with tag {.field {tag}}.")
cli::cli_alert("{.fun upload_single_binary_to_s3}: Deleting binary for {.pkg {package_name}} {.field {tag}} at path {.path {sprintf('%s/%s', local_bin_path, tarball_name)}}.")
file.remove(sprintf("%s/%s", local_bin_path, tarball_name))
} else if (exists && !force) {
cli::cli_alert("{.fun upload_single_binary_to_s3}: Package {.pkg {package_name}} {.field {tag}} already exists in S3. Skipping upload.")
}
}