This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This workflow creates many jobs, run only when a branch is created | |
on: | |
push: | |
branches: | |
- "revdep*" # never run automatically on main branch | |
name: revdep | |
jobs: | |
matrix: | |
runs-on: ubuntu-22.04 | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.matrix }} | |
name: Collect revdeps | |
env: | |
R_REMOTES_NO_ERRORS_FROM_WARNINGS: true | |
RSPM: https://packagemanager.rstudio.com/cran/__linux__/bionic/latest | |
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} | |
# prevent rgl issues because no X11 display is available | |
RGL_USE_NULL: true | |
# Begin custom: env vars | |
# End custom: env vars | |
steps: | |
- name: Check rate limits | |
run: | | |
curl -s --header "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/rate_limit | |
shell: bash | |
- uses: actions/checkout@v3 | |
# FIXME: Avoid reissuing succesful jobs | |
# https://docs.github.com/en/free-pro-team@latest/rest/reference/actions#list-jobs-for-a-workflow-run | |
# https://docs.github.com/en/free-pro-team@latest/rest/reference/actions#workflow-runs | |
- id: set-matrix | |
run: | | |
package <- read.dcf("DESCRIPTION")[, "Package"][[1]] | |
deps <- tools:::package_dependencies(package, reverse = TRUE, which = c("Depends", "Imports", "LinkingTo", "Suggests"))[[1]] | |
json <- paste0( | |
'{"package":[', | |
paste0('"', deps, '"', collapse = ","), | |
']}' | |
) | |
writeLines(json) | |
writeLines(paste0("matrix=", json), Sys.getenv("GITHUB_OUTPUT")) | |
shell: Rscript {0} | |
check-matrix: | |
runs-on: ubuntu-22.04 | |
needs: matrix | |
steps: | |
- name: Install json2yaml | |
run: | | |
sudo npm install -g json2yaml | |
- name: Check matrix definition | |
run: | | |
matrix='${{ needs.matrix.outputs.matrix }}' | |
echo $matrix | |
echo $matrix | jq . | |
echo $matrix | json2yaml | |
R-CMD-check: | |
needs: matrix | |
runs-on: ubuntu-22.04 | |
name: ${{ matrix.package }} | |
# Begin custom: services | |
# End custom: services | |
strategy: | |
fail-fast: false | |
matrix: ${{fromJson(needs.matrix.outputs.matrix)}} | |
env: | |
R_REMOTES_NO_ERRORS_FROM_WARNINGS: true | |
RSPM: https://packagemanager.rstudio.com/cran/__linux__/bionic/latest | |
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} | |
# prevent rgl issues because no X11 display is available | |
RGL_USE_NULL: true | |
# Begin custom: env vars | |
# End custom: env vars | |
steps: | |
- name: Check rate limits | |
run: | | |
curl -s --header "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/rate_limit | |
shell: bash | |
- uses: actions/checkout@v3 | |
# Begin custom: before install | |
# End custom: before install | |
- name: Use RSPM | |
run: | | |
mkdir -p /home/runner/work/_temp/Library | |
echo 'local({release <- system2("lsb_release", "-sc", stdout = TRUE); options(repos=c(CRAN = paste0("https://packagemanager.rstudio.com/all/__linux__/", release, "/latest")), HTTPUserAgent = sprintf("R/%s R (%s)", getRversion(), paste(getRversion(), R.version$platform, R.version$arch, R.version$os)))}); .libPaths("/home/runner/work/_temp/Library")' | sudo tee /etc/R/Rprofile.site | |
- name: Install remotes | |
run: | | |
if (!requireNamespace("curl", quietly = TRUE)) install.packages("curl") | |
if (!requireNamespace("remotes", quietly = TRUE)) install.packages("remotes") | |
shell: Rscript {0} | |
- uses: r-lib/actions/setup-pandoc@v2 | |
- name: Install system dependencies | |
if: runner.os == 'Linux' | |
run: | | |
sudo apt-get update -y | |
Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "22.04")); package <- "${{ matrix.package }}"; deps <- tools::package_dependencies(package, which = "Suggests")[[1]]; lapply(c(package, deps), function(x) { writeLines(remotes::system_requirements("ubuntu", "22.04", package = x)) })' | sort | uniq > .github/deps.sh | |
cat .github/deps.sh | |
sudo sh < .github/deps.sh | |
- name: Install package | |
run: | | |
package <- "${{ matrix.package }}" | |
install.packages(package, dependencies = TRUE) | |
remotes::install_cran("rcmdcheck") | |
shell: Rscript {0} | |
- name: Session info old | |
run: | | |
options(width = 100) | |
if (!requireNamespace("sessioninfo", quietly = TRUE)) install.packages("sessioninfo") | |
pkgs <- installed.packages()[, "Package"] | |
sessioninfo::session_info(pkgs, include_base = TRUE) | |
shell: Rscript {0} | |
# Begin custom: after install | |
# End custom: after install | |
- name: Check old | |
env: | |
_R_CHECK_CRAN_INCOMING_: false | |
_R_CHECK_SYSTEM_CLOCK_: false | |
_R_CHECK_FUTURE_FILE_TIMESTAMPS_: false | |
# Avoid downloading binary package from RSPM | |
run: | | |
package <- "${{ matrix.package }}" | |
options(HTTPUserAgent = "gha") | |
path <- download.packages(package, destdir = ".github")[, 2] | |
print(path) | |
dir <- file.path("revdep", package) | |
dir.create(dir, showWarnings = FALSE, recursive = TRUE) | |
check <- rcmdcheck::rcmdcheck(path, args = c("--no-manual", "--as-cran"), error_on = "never", check_dir = file.path(dir, "check")) | |
file.rename(file.path(dir, "check"), file.path(dir, "old")) | |
saveRDS(check, file.path(dir, "old.rds")) | |
shell: Rscript {0} | |
- name: Install local package | |
run: | | |
remotes::install_local(".", force = TRUE) | |
shell: Rscript {0} | |
- name: Session info new | |
run: | | |
options(width = 100) | |
pkgs <- installed.packages()[, "Package"] | |
sessioninfo::session_info(pkgs, include_base = TRUE) | |
shell: Rscript {0} | |
- name: Check new | |
env: | |
_R_CHECK_CRAN_INCOMING_: false | |
_R_CHECK_SYSTEM_CLOCK_: false | |
_R_CHECK_FUTURE_FILE_TIMESTAMPS_: false | |
run: | | |
package <- "${{ matrix.package }}" | |
path <- dir(".github", pattern = paste0("^", package), full.names = TRUE)[[1]] | |
print(path) | |
dir <- file.path("revdep", package) | |
check <- rcmdcheck::rcmdcheck(path, args = c("--no-manual", "--as-cran"), error_on = "never", check_dir = file.path(dir, "check")) | |
file.rename(file.path(dir, "check"), file.path(dir, "new")) | |
saveRDS(check, file.path(dir, "new.rds")) | |
shell: Rscript {0} | |
- name: Compare | |
run: | | |
package <- "${{ matrix.package }}" | |
dir <- file.path("revdep", package) | |
old <- readRDS(file.path(dir, "old.rds")) | |
new <- readRDS(file.path(dir, "new.rds")) | |
compare <- rcmdcheck::compare_checks(old, new) | |
compare | |
cmp <- compare$cmp | |
if (!identical(cmp[cmp$which == "old", "output"], cmp[cmp$which == "new", "output"])) { | |
if (!requireNamespace("waldo", quietly = TRUE)) install.packages("waldo") | |
print(waldo::compare(old, new)) | |
stop("Check output differs.") | |
} | |
shell: Rscript {0} | |
- name: Upload check results | |
if: failure() | |
uses: actions/upload-artifact@main | |
with: | |
name: ${{ matrix.package }}-results | |
path: revdep/${{ matrix.package }} | |
- name: Check rate limits | |
if: always() | |
run: | | |
curl -s --header "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/rate_limit | |
shell: bash |