name: rworkflows_static 'on': push: branches: - master - main - devel - RELEASE_** pull_request: branches: - master - main - devel - RELEASE_** env: run_bioccheck: ${{ false }} run_rcmdcheck: ${{ true }} as_cran: ${{ true }} run_vignettes: ${{ true }} has_testthat: ${{ true }} run_covr: ${{ true }} run_pkgdown: ${{ true }} has_runit: ${{ false }} has_latex: ${{ false }} tinytex_installer: TinyTeX-1 pandoc_version: '2.19' run_docker: ${{ false }} docker_registry: ghcr.io GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }} cache_version: cache-v1 miniforge_variant: ${{ false }} activate_environment: test jobs: rworkflows_static: permissions: write-all runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.os }} (${{ matrix.config.r }}) container: ${{ matrix.config.cont }} strategy: fail-fast: ${{ false }} matrix: config: - os: ubuntu-latest bioc: devel r: auto cont: ghcr.io/bioconductor/bioconductor_docker:devel rspm: ~ - os: macOS-latest bioc: release r: auto cont: ~ rspm: ~ - os: windows-latest bioc: release r: auto cont: ~ rspm: ~ env: R_REMOTES_NO_ERRORS_FROM_WARNINGS: ${{ true }} RSPM: ${{ matrix.config.rspm }} TZ: UTC GITHUB_REPO: ${{ github.repository }} RGL_USE_NULL: ${{ true }} steps: - name: "\U0001F52D Collect Workflow Telemetry" uses: runforesight/workflow-telemetry-action@v1 continue-on-error: ${{ true }} with: github_token: ${{ env.GITHUB_TOKEN }} - name: "\U0001F4BE Free Disk Space" if: env.free_diskspace == 'true' && runner.os == 'Linux' uses: jlumbroso/free-disk-space@main - name: "\U0001F30E Set environment variables" run: | echo "RGL_USE_NULL=TRUE" >> $GITHUB_ENV echo "R_REMOTES_NO_ERRORS_FROM_WARNINGS=${{ true }}" >> $GITHUB_ENV echo "RSPM=${{ matrix.config.rspm }}" >> $GITHUB_ENV echo "TZ=UTC" >> $GITHUB_ENV echo "NOT_CRAN=${{ !env.as_cran }}" >> $GITHUB_ENV shell: bash {0} - name: "\U0001F40D Setup Miniconda" if: env.miniforge_variant != 'false' uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: ${{ false }} python-version: ${{ matrix.python-version }} miniforge-variant: ${{ env.miniforge_variant }} miniforge-version: ${{ env.miniforge_version }} activate-environment: ${{ env.activate_environment }} environment-file: ${{ env.environment_file }} channels: ${{ env.channels }} - name: "\U0001F4DA Set R library home on Linux" if: runner.os == 'Linux' run: | mkdir -p /__w/_temp/Library echo ".libPaths('/__w/_temp/Library')" >> ~/.Rprofile git config --global --add safe.directory '*' shell: bash {0} - name: ⏬ Checkout repository uses: actions/checkout@v4 - name: "\U0001F6E0 Setup R and Bioconductor" if: runner.os != 'Linux' uses: grimbough/bioc-actions/setup-bioc@v1 with: bioc-version: ${{ matrix.config.bioc }} - name: "\U0001F6E0 Install Pandoc" if: env.pandoc_version != 'false' && runner.os != 'Linux' uses: r-lib/actions/setup-pandoc@v2 with: pandoc-version: ${{ env.pandoc_version }} - name: ❔ Query dependencies env: GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} run: | options(crayon.enabled = TRUE) install.packages('remotes') remotes::install_github("r-lib/remotes") saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2) shell: Rscript {0} - name: "\U0001F3E6 Restore R package cache" if: | !contains(github.event.head_commit.message, '[nocache]') && runner.os != 'Linux' uses: actions/cache@v3 with: path: ${{ env.R_LIBS_USER }} key: ${{ env.cache_version }}-${{ runner.os }}-biocversion-${{ matrix.config.bioc }}-r-${{ matrix.config.r }}-${{ hashFiles('.github/depends.Rds') }} restore-keys: ${{ env.cache_version }}-${{ runner.os }}-biocversion-${{ matrix.config.bioc }}-r-${{ matrix.config.r }}- - name: "\U0001F3E6 Cache R packages on Linux" if: | !contains(github.event.head_commit.message, '[nocache]') && runner.os == 'Linux' uses: actions/cache@v3 with: path: /home/runner/work/_temp/Library key: ${{ env.cache_version }}-${{ runner.os }}-biocversion-${{ matrix.config.bioc }}-r-${{ matrix.config.r }}-${{ hashFiles('.github/depends.Rds') }} restore-keys: ${{ env.cache_version }}-${{ runner.os }}-biocversion-${{ matrix.config.bioc }}-r-${{ matrix.config.r }}- - name: "\U0001F6E0 Install Linux system dependencies" if: runner.os == 'Linux' run: | sysreqs=$(Rscript -e 'cat("apt-get update -y && apt-get install -y", paste(gsub("apt-get install -y ", "", remotes::system_requirements("ubuntu", "20.04")), collapse = " "))') echo $sysreqs sudo -s eval "$sysreqs" sudo apt-get install -y qpdf rsync shell: bash {0} - name: "\U0001F6E0 Install macOS system dependencies" if: runner.os == 'macOS' run: | #### --- Justifications for each package --- #### ### libxml2 ### # Enable installing XML from source if needed ### imagemagick@6 ### # Required to install magick as noted at # https://github.com/r-lib/usethis/commit/f1f1e0d10c1ebc75fd4c18fa7e2de4551fd9978f#diff-9bfee71065492f63457918efcd912cf2 ### harfbuzz fribidi ### # For textshaping, required by ragg, and required by pkgdown ### libgit2 ### # For installing usethis's dependency gert ### xquartz --cask ### # Required for tcltk ### libxfont ### # Required for some ggplot2 functions ### texlive ### # Required for rendering Sweave files (even with r-lib/actions/setup-tinytex) #### --- Install packages --- #### ### Install normally ### brew install libxml2 imagemagick@6 harfbuzz fribidi libgit2 texlive ### Install via cask ### brew install xquartz --cask ### Set up xml2 ### echo "XML_CONFIG=/usr/local/opt/libxml2/bin/xml2-config" >> $GITHUB_ENV shell: bash {0} - name: "\U0001F6E0 Install Windows system dependencies" if: env.has_latex == 'true' && runner.os == 'Windows' run: | #### npm #### npm install curl shell: pwsh {0} - name: "\U0001F6E0 Install latex" if: env.has_latex == 'true' uses: r-lib/actions/setup-tinytex@v2 env: TINYTEX_INSTALLER: ${{ env.tinytex_installer }} TINYTEX_VERSION: ${{ env.tinytex_version }} - name: "\U0001F6E0 Install latex packages" if: env.has_latex == 'true' env: tinytex_installer: ${{ env.tinytex_installer }} tinytex_version: ${{ env.tinytex_version }} run: | install.packages("tinytex") extra_packages <- c("bera","nowidow","parnotes","marginfix","etoolbox", "titlesec","sectsty","framed","enumitem","parskip","soul","placeins", "footmisc","changepage","xstring","caption","mathtools","fancyhdr", "preprint","ragged2e","pdfcrop","titling","silence","everysel") tinytex::tlmgr_install(pkgs = extra_packages) shell: Rscript {0} - name: "\U0001F6E0 Install dependencies pass 1" env: timeout: ${{ env.timeout }} GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} run: | options(crayon.enabled = TRUE, timeout=Sys.getenv("timeout")) ## For running the checks message(paste('****', Sys.time(), 'installing rcmdcheck ****')) install.packages(c("rmarkdown","BiocManager"), dependencies = TRUE) message(paste('****', Sys.time(), 'pass number 1 at installing dependencies****')) repos <- BiocManager::repositories() remotes::install_local(repos=repos, dependencies=TRUE, build_vignettes=FALSE, upgrade=TRUE, force=TRUE) continue-on-error: ${{ true }} shell: Rscript {0} - name: "\U0001F6E0 Install dependencies pass 2" env: timeout: ${{ env.timeout }} GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} run: | options(crayon.enabled = TRUE, timeout=Sys.getenv("timeout")) message(paste('****', Sys.time(), 'pass number 2 at installing dependencies****')) repos <- BiocManager::repositories() remotes::install_local(repos=repos, dependencies=TRUE, build_vignettes=FALSE, upgrade=TRUE, force=TRUE) shell: Rscript {0} - name: "\U0001F6E0 Install RUnit (via BiocGenerics)" if: env.has_runit == 'true' run: | options(crayon.enabled = TRUE) BiocManager::install("BiocGenerics") shell: Rscript {0} - name: "\U0001F6E0 Install covr" if: env.run_covr == 'true' && runner.os == 'Linux' run: | options(crayon.enabled = TRUE) install.packages("covr") shell: Rscript {0} - name: "\U0001F6E0 Install pkgdown" if: env.run_pkgdown == 'true' && runner.os == 'Linux' run: | options(crayon.enabled = TRUE) install.packages("pkgdown") shell: Rscript {0} - name: ℹ️ Session info ️ run: | options(width = 100, crayon.enabled = TRUE) pkgs <- installed.packages()[,"Package"] if(!require("sessioninfo", quietly=TRUE)) install.packages("sessioninfo") tryCatch({ sessioninfo::session_info(pkgs, include_base = TRUE) }, error = function(x){utils::sessionInfo()}) shell: Rscript {0} - name: ✅ Run CMD check if: env.run_rcmdcheck == 'true' env: _R_CHECK_CRAN_INCOMING_: ${{ false }} RGL_USE_NULL: ${{ env.RGL_USE_NULL }} DISPLAY: 99.0 AS_CRAN: ${{ env.as_cran }} run_vignettes: ${{ env.run_vignettes }} timeout: ${{ env.timeout }} run: | options(crayon.enabled = TRUE, timeout=Sys.getenv("timeout")) if(!require("rcmdcheck", quietly=TRUE)) install.packages("rcmdcheck") as_cran <- if(Sys.getenv("AS_CRAN")=='true') "--as-cran" else NULL run_build_vignettes <- if(Sys.getenv("run_vignettes")=='true') NULL else "--no-build-vignettes" run_vignettes <- if(Sys.getenv("run_vignettes")=='true') NULL else "--ignore-vignettes" rcmdcheck::rcmdcheck( args = c("--no-manual", "--timings", as_cran, run_vignettes), build_args = c("--no-manual", "--keep-empty-dirs", "--no-resave-data", run_build_vignettes), error_on = "warning", check_dir = "check") shell: Rscript {0} - name: "\U0001F4CB Reveal testthat details" if: env.has_testthat == 'true' run: | find . -name testthat.Rout -exec cat '{}' ';' shell: bash {0} - name: "\U0001F4CB Run RUnit tests (via BiocGenerics)" if: env.has_runit == 'true' env: timeout: ${{ env.timeout }} run: | options(crayon.enabled = TRUE, timeout=Sys.getenv("timeout")) BiocGenerics:::testPackage() shell: Rscript {0} - name: ✅ Run BiocCheck if: env.run_bioccheck == 'true' env: DISPLAY: 99.0 RGL_USE_NULL: ${{ env.RGL_USE_NULL }} run_vignettes: ${{ env.run_vignettes }} as_cran: ${{ env.as_cran }} timeout: ${{ env.timeout }} run: | options(crayon.enabled = TRUE, timeout=Sys.getenv("timeout")) #### Install deps #### if(!require("BiocManager", quietly=TRUE)) install.packages("BiocManager") if(!require("BiocCheck", quietly=TRUE)) BiocManager::install("BiocCheck") #### Allow for packages on CRAN #### no_check_vignettes <- Sys.getenv("run_vignettes")=='true' as_cran <- Sys.getenv("as_cran")=='true' #### Run checks #### BiocCheck::BiocCheck( dir('check', 'tar.gz$', full.names = TRUE), `quit-with-status` = TRUE, `no-check-R-ver` = TRUE, `no-check-vignettes` = no_check_vignettes, `no-check-CRAN` = as_cran, `no-check-bioc-help` = as_cran) shell: Rscript {0} - name: "\U0001F4CB Test coverage" if: env.run_covr == 'true' && runner.os == 'Linux' run: | covr::codecov() shell: Rscript {0} - name: "\U0001F6E0 Install package ️" if: env.run_pkgdown == 'true' && runner.os == 'Linux' run: R CMD INSTALL . shell: bash {0} - name: ℹ️ Get R package info if: runner.os == 'Linux' run: | #### DockerHub repos must be lowercase (,,) #### name=$(grep '^Package:' DESCRIPTION | cut -d\ -f2) echo "packageName=${name,,}" >> $GITHUB_ENV echo "packageNameOrig=${name}" >> $GITHUB_ENV echo $name version=$(grep Version DESCRIPTION | grep -o "[0-9.]\+") echo "packageVersion=${version}" >> $GITHUB_ENV echo $version echo "BASE_IMAGE=${{ matrix.config.cont }}" >> $GITHUB_ENV shell: bash {0} - name: "\U0001F4E6 Render README" if: env.run_pkgdown == 'true' && runner.os == 'Linux' env: DISPLAY: 99.0 run: | if(file.exists("README.Rmd")){ options(crayon.enabled = TRUE) if(!require("rmarkdown", quietly=TRUE)) install.packages("rmarkdown"); rmarkdown::render("README.Rmd", output_format = rmarkdown::github_document(html_preview = FALSE)); } shell: Rscript {0} - name: "\U0001F4E6 Build pkgdown site" if: env.run_pkgdown == 'true' && runner.os == 'Linux' run: | options(crayon.enabled = TRUE) pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) shell: Rscript {0} - name: "\U0001F4E6\U0001F680 Deploy pkgdown site to GitHub pages" if: env.run_pkgdown == 'true' && runner.os == 'Linux' uses: JamesIves/github-pages-deploy-action@releases/v4 with: clean: ${{ false }} branch: gh-pages folder: docs token: ${{ env.GITHUB_TOKEN }} - name: ⏫ Upload check results if: failure() uses: actions/upload-artifact@v3 with: name: ${{ runner.os }}-biocversion-${{ matrix.config.bioc }}-r-${{ matrix.config.r }}-results path: check - name: "\U0001F433✏️ Create Docker file" if: | (!contains(github.event.head_commit.message, '/nodocker')) && env.run_docker == 'true' && runner.os == 'Linux' env: BASE_IMAGE: ${{ matrix.config.cont }} GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} run: | options(crayon.enabled = TRUE) if(!require("rworkflows", quietly=TRUE)) remotes::install_github("neurogenomics/rworkflows") path <- rworkflows::use_dockerfile(base_image=Sys.getenv("BASE_IMAGE")) shell: Rscript {0} - name: "\U0001F433\U0001F680 Build and push to GHCR" if: | (!contains(github.event.head_commit.message, '/nodocker')) && env.run_docker == 'true' && runner.os == 'Linux' && env.docker_registry == 'ghcr.io' uses: docker/build-push-action@v1 env: GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} with: username: ${{ github.repository_owner }} password: ${{ env.GITHUB_TOKEN }} registry: ${{ env.docker_registry }} repository: ${{ github.repository }} tag_with_ref: ${{ true }} tag_with_sha: ${{ false }} tags: | ${{ env.packageVersion }}, latest build_args: | PKG=${{ env.packageNameOrig }}, BASE_IMAGE=${{ matrix.config.cont }} - name: "\U0001F433\U0001F680 Build and push to DockerHub" if: | (!contains(github.event.head_commit.message, '/nodocker')) && env.run_docker == 'true' && runner.os == 'Linux' && env.docker_registry == 'docker.io' uses: docker/build-push-action@v1 env: GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }} with: username: ${{ env.docker_user }} password: ${{ env.DOCKER_TOKEN }} repository: ${{ env.docker_org }}/${{ env.packageName }} tag_with_ref: ${{ true }} tag_with_sha: ${{ false }} tags: | ${{ env.packageVersion }}, latest build_args: |- PKG=${{ env.packageNameOrig }}, BASE_IMAGE=${{ env.BASE_IMAGE }}