Hello. I wrote an R package for use within my company. It builds and installs successfully on my corporate PC. I initially had some SSL errors in my build_site() when pkgdown tried to download Bootstrap 5 assets. I resolved by setting R_LIBCURL_SSL_REVOKE_BEST_EFFORT=TRUE in .Renviron. I believe download.file() commands in pkgdown successfully used this environment variable option to try various certificate packages on my PC. I'm no expert in this!
I also host my package on my company GitLab. I am trying to get build_site() to work in the GitLab CI pipeline.
I similarly set R_LIBCURL_SSL_REVOKE_BEST_EFFORT=TRUE to try to anticipate the issues I had with the Bootstrap 5 assets.
In the CI pipeline, the container seems to successfully install R packages from CRAN and download the Bootstrap 5 assets. However, it fails to access bioconductor. See error below along with the GitLab CI file and the full logs.
Is there any way to resolve this? Or to turn off bioconductor connections? I don't believe my package needs bioconductor.
Here are some of my thoughts, but I don't really know much.
- The bootstrap assets were downloaded with
download.file(), which respected R_LIBCURL_SSL_REVOKE_BEST_EFFORT. From the error message, I can see that pkgdown accesses bioconductor instead through httr2 or curl. I'm not sure if these functions will respect the environment variable the same way.
- I worry that CRAN, ubuntu, and cloudflare (Bootstrap 5) are whitelisted in the firewall rules for my company GitLab system & the Microsoft Azure VM it's installed on, but bioconductor is not. If that's the case, I worry that it's a lost cause.
Appreciate any help! Thanks for this great package.
Specific pkgdown error related to bioconductor
── Initialising site ───────────────────────────────────────────────────────────
── Building home ───────────────────────────────────────────────────────────────
Writing `authors.html`
Error:
! in callr subprocess.
Caused by error in `httr2::req_perform(req)`:
! Failed to perform HTTP request.
Caused by error in `curl::curl_fetch_memory()`:
! Failure when receiving data from the peer [bioconductor.org]:
Recv failure: Connection reset by peer
.gitlab-ci.yml
stages:
- build
- test
- deploy
build-job:
tags:
- docker
stage: build
script:
- /bin/bash
- echo "no build"
unit-test-job:
tags:
- docker
stage: test
script:
- /bin/bash
- echo "no unit tests"
pages:
tags:
- docker
stage: deploy # It only runs when *both* jobs in the test stage complete successfully.
environment: production
variables:
R_LIBCURL_SSL_REVOKE_BEST_EFFORT: "TRUE"
script:
- R -e 'install.packages(c("devtools", "pkgdown", "svglite"))'
- R -e 'devtools::install()'
- R -e 'rmarkdown::render("README.Rmd")'
- R -e 'Sys.setenv(R_LIBCURL_SSL_REVOKE_BEST_EFFOR=TRUE); pkgdown::build_site()'
artifacts:
paths:
- public
GitLab CI pipeline logs
on xxxxxxx Docker xxxxxxx, system ID: xxxxxxxx
Resolving secrets
00:00
Preparing the "docker" executor
00:02
Using Docker executor with image rocker/tidyverse ...
Pulling docker image rocker/tidyverse ...
Using docker image sha256:94209eda92ece1fc838ea5ee7b39d3a7f9471a0ae19c9ca7f71c31c1788be99a for rocker/tidyverse with digest rocker/tidyverse@sha256:a95c4680855df5b642a829882fc29e0aadc01708861af6f5919207b613235720 ...
Preparing environment
00:00
Running on runner-z7b4zfahg-project-2135-concurrent-0 via 6d76322a4f7a...
Getting source from Git repository
00:01
Fetching changes with git depth set to 20...
Reinitialized existing Git repository in /builds/manufacturing/blend/.git/
Checking out 3ddfd701 as detached HEAD (ref is main)...
Skipping Git submodules setup
Executing "step_script" stage of the job script
00:48
Using docker image sha256:94209eda92ece1fc838ea5ee7b39d3a7f9471a0ae19c9ca7f71c31c1788be99a for rocker/tidyverse with digest rocker/tidyverse@sha256:a95c4680855df5b642a829882fc29e0aadc01708861af6f5919207b613235720 ...
$ R -e 'install.packages(c("devtools", "pkgdown", "svglite"))'
R version 4.6.0 (2026-04-24) -- "Because it was There"
Copyright (C) 2026 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> install.packages(c("devtools", "pkgdown", "svglite"))
Installing packages into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
trying URL 'https://p3m.dev/cran/__linux__/noble/latest/src/contrib/devtools_2.5.2.tar.gz'
trying URL 'https://p3m.dev/cran/__linux__/noble/latest/src/contrib/pkgdown_2.2.0.tar.gz'
trying URL 'https://p3m.dev/cran/__linux__/noble/latest/src/contrib/svglite_2.2.2.tar.gz'
* installing *binary* package ‘pkgdown’ ...
* package ‘pkgdown’ successfully unpacked and SHA256 sums checked
* DONE (pkgdown)
* installing *binary* package ‘svglite’ ...
* package ‘svglite’ successfully unpacked and SHA256 sums checked
* DONE (svglite)
* installing *binary* package ‘devtools’ ...
* package ‘devtools’ successfully unpacked and SHA256 sums checked
* DONE (devtools)
>
The downloaded source packages are in
‘/tmp/RtmpZYxA0b/downloaded_packages’
$ R -e 'devtools::install()'
R version 4.6.0 (2026-04-24) -- "Because it was There"
Copyright (C) 2026 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> devtools::install()
── pak::local_install_deps() ───────────────────────────────────────────────────
✔ Updated metadata database: 4.31 MB in 9 files.
ℹ Updating metadata database
✔ Updating metadata database ... done
→ Will install 3 packages.
→ Will download 4 packages with unknown size.
+ janitor 2.2.1 [dl]
+ lpSolve 5.6.23 [dl]
+ snakecase 0.11.1 [dl]
✔ All system requirements are already installed.
ℹ Getting 3 pkgs with unknown sizes
✔ Got snakecase 0.11.1 (x86_64-pc-linux-gnu-ubuntu-24.04) (163.70 kB)
✔ Got lpSolve 5.6.23 (x86_64-pc-linux-gnu-ubuntu-24.04) (375.71 kB)
✔ Got janitor 2.2.1 (x86_64-pc-linux-gnu-ubuntu-24.04) (294.80 kB)
ℹ Installing system requirements
ℹ Executing `sh -c apt-get -y update`
Get:1 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Get:2 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:3 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [3,610 kB]
Get:4 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
Get:5 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
Get:6 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1,808 kB]
Get:8 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [2,038 kB]
Get:9 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [34.2 kB]
Get:10 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1,504 kB]
Get:11 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
Get:12 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
Get:13 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [3,824 kB]
Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [2,412 kB]
Get:15 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [2,147 kB]
Get:16 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [54.1 kB]
Get:17 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [49.0 kB]
Get:18 http://archive.ubuntu.com/ubuntu noble-backports/multiverse amd64 Packages [671 B]
Get:19 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [35.9 kB]
Fetched 37.9 MB in 3s (11.3 MB/s)
Reading package lists...
ℹ Executing `sh -c apt-get -y install libicu-dev`
Reading package lists...
Building dependency tree...
Reading state information...
libicu-dev is already the newest version (74.2-1ubuntu3.1).
libicu-dev set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
✔ Installed janitor 2.2.1 (53ms)
✔ Installed lpSolve 5.6.23 (87ms)
✔ Installed snakecase 0.11.1 (112ms)
✔ 26 deps: kept 23, added 3, dld 3 (834.21 kB) [16.7s]
── R CMD build ─────────────────────────────────────────────────────────────────
* checking for file ‘/builds/manufacturing/blend/DESCRIPTION’ ... OK
* preparing ‘blend’:
* checking DESCRIPTION meta-information ... OK
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
NB: this package now depends on R (>= 4.1.0)
WARNING: Added dependency on R >= 4.1.0 because package code uses the
pipe |> or function shorthand \(...) syntax added in R 4.1.0.
File(s) using such syntax:
‘constraints.R’ ‘formulize.R’ ‘join_variables.Rd’ ‘lp.R’
‘make_clean_rownames.Rd’ ‘tabulate.R’ ‘variables.R’
* building ‘blend_0.0.0.9000.tar.gz’
── R CMD INSTALL ───────────────────────────────────────────────────────────────
Running /usr/local/lib/R/bin/R CMD INSTALL \
/tmp/Rtmp3ekTxh/blend_0.0.0.9000.tar.gz --install-tests
* installing to library ‘/usr/local/lib/R/site-library’
* installing *source* package ‘blend’ ...
** this is package ‘blend’ version ‘0.0.0.9000’
** using staged installation
** R
** data
*** moving datasets to lazyload DB
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (blend)
>
$ R -e 'rmarkdown::render("README.Rmd")'
R version 4.6.0 (2026-04-24) -- "Because it was There"
Copyright (C) 2026 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> rmarkdown::render("README.Rmd")
processing file: README.Rmd
1/9
2/9 [unnamed-chunk-1]
3/9
4/9 [example]
5/9
6/9 [cars]
7/9
8/9 [pressure]
9/9
output file: README.knit.md
/usr/bin/pandoc +RTS -K512m -RTS README.knit.md --to gfm-tex_math_gfm-yaml_metadata_block --from markdown+autolink_bare_uris+tex_math_single_backslash --output README.md --template /usr/local/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/default.md
/usr/bin/pandoc +RTS -K512m -RTS README.md --to html4 --from gfm-tex_math_gfm --output README.html --embed-resources --standalone --syntax-highlighting pygments --template /usr/local/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/preview.html --variable 'github-markdown-css:/usr/local/lib/R/site-library/rmarkdown/rmarkdown/templates/github_document/resources/github.css' --metadata pagetitle=PREVIEW --mathjax
Preview created: README.html
Output created: README.md
>
$ R -e 'Sys.setenv(R_LIBCURL_SSL_REVOKE_BEST_EFFOR=TRUE); pkgdown::build_site()'
R version 4.6.0 (2026-04-24) -- "Because it was There"
Copyright (C) 2026 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> Sys.setenv(R_LIBCURL_SSL_REVOKE_BEST_EFFOR=TRUE); pkgdown::build_site()
── Installing package blend into temporary library ─────────────────────────────
── Initialising site ───────────────────────────────────────────────────────────
Copying <pkgdown>/BS5/assets/katex-auto.js to katex-auto.js
Copying <pkgdown>/BS5/assets/lightswitch.js to lightswitch.js
Copying <pkgdown>/BS5/assets/link.svg to link.svg
Copying <pkgdown>/BS5/assets/pkgdown.js to pkgdown.js
Updating deps/bootstrap-5.3.1/bootstrap.bundle.min.js
Updating deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map
Updating deps/bootstrap-5.3.1/bootstrap.min.css
Updating deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js
Updating deps/clipboard.js-2.0.11/clipboard.min.js
Updating deps/font-awesome-6.5.2/css/all.css
Updating deps/font-awesome-6.5.2/css/all.min.css
Updating deps/font-awesome-6.5.2/css/v4-shims.css
Updating deps/font-awesome-6.5.2/css/v4-shims.min.css
Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2
Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2
Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2
Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2
Updating deps/headroom-0.11.0/headroom.min.js
Updating deps/headroom-0.11.0/jQuery.headroom.min.js
Updating deps/jquery-3.6.0/jquery-3.6.0.js
Updating deps/jquery-3.6.0/jquery-3.6.0.min.js
Updating deps/jquery-3.6.0/jquery-3.6.0.min.map
Updating deps/search-1.0.0/autocomplete.jquery.min.js
Updating deps/search-1.0.0/fuse.min.js
Updating deps/search-1.0.0/mark.min.js
── Building pkgdown site for package blend ─────────────────────────────────────
Reading from: /builds/manufacturing/blend
Writing to: /builds/manufacturing/blend/docs
── Sitrep ──────────────────────────────────────────────────────────────────────
✖ URLs not ok.
In _pkgdown.yml, url is missing.
See details in `vignette(pkgdown::metadata)`.
✔ Favicons ok.
✔ Open graph metadata ok.
✔ Articles metadata ok.
✔ Reference metadata ok.
── Initialising site ───────────────────────────────────────────────────────────
── Building home ───────────────────────────────────────────────────────────────
Writing `authors.html`
Error:
! in callr subprocess.
Caused by error in `httr2::req_perform(req)`:
! Failed to perform HTTP request.
Caused by error in `curl::curl_fetch_memory()`:
! Failure when receiving data from the peer [bioconductor.org]:
Recv failure: Connection reset by peer
---
Standard error:
── Initialising site ───────────────────────────────────────────────────────────
Copying <pkgdown>/BS5/assets/katex-auto.js to katex-auto.js
Copying <pkgdown>/BS5/assets/lightswitch.js to lightswitch.js
Copying <pkgdown>/BS5/assets/link.svg to link.svg
Copying <pkgdown>/BS5/assets/pkgdown.js to pkgdown.js
Updating deps/bootstrap-5.3.1/bootstrap.bundle.min.js
Updating deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map
Updating deps/bootstrap-5.3.1/bootstrap.min.css
Updating deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js
Updating deps/clipboard.js-2.0.11/clipboard.min.js
Updating deps/font-awesome-6.5.2/css/all.css
Updating deps/font-awesome-6.5.2/css/all.min.css
Updating deps/font-awesome-6.5.2/css/v4-shims.css
Updating deps/font-awesome-6.5.2/css/v4-shims.min.css
Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2
Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2
Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2
Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf
Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2
Updating deps/headroom-0.11.0/headroom.min.js
Updating deps/headroom-0.11.0/jQuery.headroom.min.js
Updating deps/jquery-3.6.0/jquery-3.6.0.js
Updating deps/jquery-3.6.0/jquery-3.6.0.min.js
Updating deps/jquery-3.6.0/jquery-3.6.0.min.map
Updating deps/search-1.0.0/autocomplete.jquery.min.js
Updating deps/search-1.0.0/fuse.min.js
Updating deps/search-1.0.0/mark.min.js
── Building pkgdown site for package blend ─────────────────────────────────────
Reading from: /builds/manufacturing/blend
Writing to: /builds/manufacturing/blend/docs
── Sitrep ──────────────────────────────────────────────────────────────────────
✖ URLs not ok.
In _pkgdown.yml, url is missing.
See details in `vignette(pkgdown::metadata)`.
✔ Favicons ok.
✔ Open graph metadata ok.
✔ Articles metadata ok.
✔ Reference metadata ok.
── Initialising site ───────────────────────────────────────────────────────────
── Building home ───────────────────────────────────────────────────────────────
Writing `authors.html`
---
Backtrace:
1. pkgdown::build_site()
2. pkgdown:::build_site_external(pkg = pkg, examples = examples, run_dont_run = run_don…
3. callr::r(function(..., cli_colors, hyperlinks) { …
4. callr:::get_result(output = out, options)
5. callr:::throw(callr_remote_error(remerr, output), parent = fix_msg(remerr[[3]]))
---
Subprocess backtrace:
1. pkgdown::build_site(...)
2. pkgdown:::build_site_local(pkg = pkg, examples = examples, run_dont_run = run_dont_r…
3. pkgdown::build_home(pkg, override = override, quiet = quiet, preview = FALSE)
4. pkgdown::build_home_index(pkg, quiet = quiet)
5. pkgdown:::data_home(pkg)
6. pkgdown:::print_yaml(list(pagetitle = title, sidebar = data_home_sidebar(pkg, …
7. base::structure(x, class = "print_yaml")
8. pkgdown:::data_home_sidebar(pkg, call = call)
9. pkgdown:::data_home_sidebar_links(pkg)
10. pkgdown:::cran_link(pkg$package)
11. httr2::req_perform(req)
12. httr2:::handle_resp(req, resp, error_call = error_call)
13. rlang::cnd_signal(resp)
14. rlang:::signal_abort(cnd)
15. base::signalCondition(cnd)
16. global (function (e) …
Execution halted
Cleaning up project directory and file based variables
00:00
ERROR: Job failed: exit code 1
Hello. I wrote an R package for use within my company. It builds and installs successfully on my corporate PC. I initially had some SSL errors in my
build_site()when pkgdown tried to download Bootstrap 5 assets. I resolved by settingR_LIBCURL_SSL_REVOKE_BEST_EFFORT=TRUEin .Renviron. I believedownload.file()commands in pkgdown successfully used this environment variable option to try various certificate packages on my PC. I'm no expert in this!I also host my package on my company GitLab. I am trying to get
build_site()to work in the GitLab CI pipeline.I similarly set
R_LIBCURL_SSL_REVOKE_BEST_EFFORT=TRUEto try to anticipate the issues I had with the Bootstrap 5 assets.In the CI pipeline, the container seems to successfully install R packages from CRAN and download the Bootstrap 5 assets. However, it fails to access bioconductor. See error below along with the GitLab CI file and the full logs.
Is there any way to resolve this? Or to turn off bioconductor connections? I don't believe my package needs bioconductor.
Here are some of my thoughts, but I don't really know much.
download.file(), which respectedR_LIBCURL_SSL_REVOKE_BEST_EFFORT. From the error message, I can see that pkgdown accesses bioconductor instead throughhttr2orcurl. I'm not sure if these functions will respect the environment variable the same way.Appreciate any help! Thanks for this great package.
Specific pkgdown error related to bioconductor
.gitlab-ci.ymlGitLab CI pipeline logs