Skip to content

Fix the expect_cell_number check #339

Fix the expect_cell_number check

Fix the expect_cell_number check #339

Workflow file for this run

## Read more about GitHub actions the features of this GitHub Actions workflow
## at https://lcolladotor.github.io/biocthis/articles/biocthis.html#use_bioc_github_action
##
## For more details, check the biocthis developer notes vignette at
## https://lcolladotor.github.io/biocthis/articles/biocthis_dev_notes.html
##
## You can add this workflow to other packages using:
## > biocthis::use_bioc_github_action()
##
## Using GitHub Actions exposes you to many details about how R packages are
## compiled and installed in several operating system.s
### If you need help, please follow the steps listed at
## https://github.com/r-lib/actions#where-to-find-help
##
## If you found an issue specific to biocthis's GHA workflow, please report it
## with the information that will make it easier for others to help you.
## Thank you!
## Acronyms:
## * GHA: GitHub Action
## * OS: operating system
on:
push:
pull_request:
name: R-CMD-check-bioc
## These environment variables control whether to run GHA code later on that is
## specific to testthat, covr, and pkgdown.
##
## If you need to clear the cache of packages, update the number inside
## cache-version as discussed at https://github.com/r-lib/actions/issues/86.
## Note that you can always run a GHA test without the cache by using the word
## "/nocache" in the commit message.
env:
has_testthat: 'true'
run_covr: 'false'
run_pkgdown: 'true'
has_RUnit: 'false'
cache-version: 'cache-v1'
jobs:
build-check:
runs-on: ${{ matrix.config.os }}
name: ${{ matrix.config.os }} (${{ matrix.config.r }})
container: ${{ matrix.config.cont }}
## Environment variables unique to this job.
strategy:
fail-fast: false
matrix:
config:
- { os: ubuntu-latest, r: 'devel', bioc: '3.22', cont: "bioconductor/bioconductor_docker:devel", rspm: "https://packagemanager.rstudio.com/cran/__linux__/jammy/latest" }
- { os: macOS-latest, r: 'devel', bioc: '3.22'}
# - { os: windows-latest, r: '4.3', bioc: '3.18'}
## Check https://github.com/r-lib/actions/tree/master/examples
## for examples using the http-user-agent
env:
R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
RSPM: ${{ matrix.config.rspm }}
NOT_CRAN: true
TZ: UTC
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
steps:
## Set the R library to the directory matching the
## R packages cache step further below when running on Docker (Linux).
- name: Set R Library home on Linux
if: runner.os == 'Linux'
run: |
mkdir /__w/_temp/Library
echo ".libPaths('/__w/_temp/Library')" > ~/.Rprofile
## Most of these steps are the same as the ones in
## https://github.com/r-lib/actions/blob/master/examples/check-standard.yaml
## If they update their steps, we will also need to update ours.
- name: Checkout Repository
uses: actions/checkout@v3
## R is already included in the Bioconductor docker images
- name: Setup R from r-lib
if: runner.os != 'Linux'
uses: r-lib/actions/setup-r@v2
with:
r-version: ${{ matrix.config.r }}
http-user-agent: ${{ matrix.config.http-user-agent }}
## pandoc is already included in the Bioconductor docker images
- name: Setup pandoc from r-lib
if: runner.os != 'Linux'
uses: r-lib/actions/setup-pandoc@v2
- name: Query dependencies
run: |
install.packages('remotes')
saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2)
shell: Rscript {0}
- name: 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-devel-r-devel-${{ hashFiles('.github/depends.Rds') }}
restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-devel-
- name: 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-devel-r-devel-${{ hashFiles('.github/depends.Rds') }}
restore-keys: ${{ env.cache-version }}-${{ runner.os }}-biocversion-devel-r-devel-
- name: 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"
- name: Install macOS system dependencies
if: matrix.config.os == 'macOS-latest'
run: |
## Enable installing XML from source if needed
brew install libxml2
echo "XML_CONFIG=/usr/local/opt/libxml2/bin/xml2-config" >> $GITHUB_ENV
brew install libjpeg
## Required to install magick as noted at
## https://github.com/r-lib/usethis/commit/f1f1e0d10c1ebc75fd4c18fa7e2de4551fd9978f#diff-9bfee71065492f63457918efcd912cf2
brew install imagemagick@6
## For textshaping, required by ragg, and required by pkgdown
brew install harfbuzz fribidi
## For installing usethis's dependency gert
brew install libgit2
## Required for tcltk
brew install xquartz --cask
## Temporary fix for libraries not found
## https://pat-s.me/transitioning-from-x86-to-arm64-on-macos-experiences-of-an-r-user/
sudo mkdir -p /usr/local/opt/
sudo ln -s /opt/homebrew/opt/* /usr/local/opt/
mkdir ~/.R
echo 'CFLAGS=-I/opt/homebrew/include -I/opt/homebrew/opt/jpeg/include' > ~/.R/Makevars
echo 'LDFLAGS+=-L/opt/homebrew/opt/jpeg/lib' >> ~/.R/Makevars
- name: Install Windows system dependencies
if: runner.os == 'Windows'
run: |
## Edit below if you have any Windows system dependencies
remotes::install_cran("igraph", build = FALSE)
shell: Rscript {0}
- name: Install BiocManager
run: |
message(paste('****', Sys.time(), 'installing BiocManager ****'))
remotes::install_cran(c("BiocManager", "desc", "dplyr"))
shell: Rscript {0}
- name: Set BiocVersion
run: |
BiocManager::install(version = "${{ matrix.config.bioc }}", ask = FALSE, force = TRUE)
shell: Rscript {0}
- name: Install dependencies pass 1
run: |
## Try installing the package dependencies in steps. First the local
## dependencies, then any remaining dependencies to avoid the
## issues described at
## https://stat.ethz.ch/pipermail/bioc-devel/2020-April/016675.html
## https://github.com/r-lib/remotes/issues/296
## Ideally, all dependencies should get installed in the first pass.
## For running the checks
message(paste('****', Sys.time(), 'installing rcmdcheck and BiocCheck ****'))
install.packages(c("rcmdcheck", "BiocCheck"), repos = BiocManager::repositories())
## Pass #1 at installing dependencies
message(paste('****', Sys.time(), 'pass number 1 at installing dependencies: local dependencies ****'))
remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = FALSE, upgrade = TRUE)
continue-on-error: true
shell: Rscript {0}
- name: Install dependencies pass 2
run: |
message(paste('****', Sys.time(), 'installing again with BiocManager ****'))
desc::desc_get_deps() |>
dplyr::filter(package != "R" & !package %in% installed.packages()[, "Package"]) |>
dplyr::pull(package) |>
BiocManager::install(update = FALSE, ask = FALSE, force = FALSE)
continue-on-error: true
shell: Rscript {0}
# - name: Debug with SSH
# if: matrix.config.os == 'macOS-latest'
# uses: owenthereal/action-upterm@v1
# with:
# limit-access-to-actor: true
# limit-access-to-users: ChangqingW
- name: Install dependencies pass 3
run: |
## Pass #3 at installing dependencies
message(paste('****', Sys.time(), 'pass number 3 at installing dependencies: any remaining dependencies ****'))
remotes::install_local(dependencies = TRUE, repos = BiocManager::repositories(), build_vignettes = TRUE, upgrade = TRUE, force = TRUE)
shell: Rscript {0}
- name: Install BiocGenerics
if: env.has_RUnit == 'true'
run: |
## Install BiocGenerics
BiocManager::install("BiocGenerics")
shell: Rscript {0}
- name: Install covr
if: github.ref == 'refs/heads/devel' && env.run_covr == 'true' && runner.os == 'Linux'
run: |
remotes::install_cran("covr")
shell: Rscript {0}
- name: Install pkgdown
if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux'
run: |
remotes::install_github("r-lib/pkgdown")
shell: Rscript {0}
- name: Session info
run: |
options(width = 100)
pkgs <- installed.packages()[, "Package"]
sessioninfo::session_info(pkgs, include_base = TRUE)
shell: Rscript {0}
- name: Run CMD check
env:
_R_CHECK_CRAN_INCOMING_: false
DISPLAY: 99.0
run: |
options(crayon.enabled = TRUE)
rcmdcheck::rcmdcheck(
args = c("--no-manual", "--no-vignettes", "--timings"),
build_args = c("--no-manual", "--keep-empty-dirs", "--no-resave-data"),
error_on = "warning",
check_dir = "check"
)
shell: Rscript {0}
## Might need an to add this to the if: && runner.os == 'Linux'
- name: Reveal testthat details
if: env.has_testthat == 'true'
run: find . -name testthat.Rout -exec cat '{}' ';'
- name: Run RUnit tests
if: env.has_RUnit == 'true'
run: |
BiocGenerics:::testPackage()
shell: Rscript {0}
- name: Run BiocCheck
env:
DISPLAY: 99.0
run: |
BiocCheck::BiocCheck(
dir('check', 'tar.gz$', full.names = TRUE),
`quit-with-status` = TRUE,
`no-check-R-ver` = TRUE,
`no-check-bioc-help` = TRUE
)
shell: Rscript {0}
- name: Test coverage
if: github.ref == 'refs/heads/devel' && env.run_covr == 'true' && runner.os == 'Linux'
run: |
covr::codecov()
shell: Rscript {0}
- name: Install package
if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux'
run: R CMD INSTALL .
- name: Build pkgdown site
if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux'
run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE)
shell: Rscript {0}
## Note that you need to run pkgdown::deploy_to_branch(new_process = FALSE)
## at least one locally before this will work. This creates the gh-pages
## branch (erasing anything you haven't version controlled!) and
## makes the git history recognizable by pkgdown.
- name: Install deploy dependencies
if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux'
run: |
apt-get update && apt-get -y install rsync
- name: Deploy pkgdown site to GitHub pages 🚀
if: github.ref == 'refs/heads/devel' && env.run_pkgdown == 'true' && runner.os == 'Linux'
uses: JamesIves/github-pages-deploy-action@releases/v4
with:
clean: false
branch: gh-pages
folder: docs
- name: Upload check results
if: failure()
uses: actions/upload-artifact@master
with:
name: ${{ runner.os }}-biocversion-devel-r-devel-results
path: check
docker-build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set Environment Variables
run: |
REPO_LOWER="$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')"
REGISTRY=ghcr.io
echo "BUILD_DATE=$(date +'%Y-%m-%d %H:%M:%S')" >> $GITHUB_ENV
echo "GIT_SHA=$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_ENV
echo "REGISTRY=${REGISTRY}" >> $GITHUB_ENV
echo "IMAGE=${REGISTRY}/${REPO_LOWER}" >> $GITHUB_ENV
echo "DEPS_IMAGE=${REGISTRY}/${REPO_LOWER}-deps" >> $GITHUB_ENV
# Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer
- name: Install cosign
if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@v3
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata for dependencies
id: meta-deps
uses: docker/metadata-action@v5
with:
images: ${{ env.DEPS_IMAGE }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=sha,prefix={{branch}}-
# Remove automatic latest tag - will be created by test-and-tag job
- name: Extract Docker metadata for final image
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=sha,prefix={{branch}}-
# Remove automatic latest tag - will be created by test-and-tag job after testing
# Build and push dependencies stage for caching
- name: Build and push dependencies stage
id: build-deps
uses: docker/build-push-action@v5
with:
context: .
target: deps-builder
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta-deps.outputs.tags }}
labels: ${{ steps.meta-deps.outputs.labels }}
cache-from: |
type=gha,scope=deps
type=registry,ref=${{ env.DEPS_IMAGE }}:${{ github.ref_name }}
cache-to: type=gha,mode=max,scope=deps
platforms: linux/amd64
# Build and push final image
- name: Build and push final image
id: build-final
uses: docker/build-push-action@v5
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: |
type=gha,scope=final
type=registry,ref=${{ env.DEPS_IMAGE }}:${{ github.ref_name }}
type=registry,ref=${{ env.IMAGE }}:${{ github.ref_name }}
cache-to: type=gha,mode=max,scope=final
platforms: linux/amd64
# Sign the resulting Docker image digest except on PRs.
# This will only write to the public Rekor transparency log when the Docker
# repository is public to avoid leaking data. If you would like to publish
# transparency data even for private images, pass --force to cosign below.
# https://github.com/sigstore/cosign
- name: Sign the published Docker image
if: ${{ github.event_name != 'pull_request' }}
env:
COSIGN_EXPERIMENTAL: 1
# This step uses the identity token to provision an ephemeral certificate
# against the sigstore community Fulcio instance.
run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign --yes {}@${{ steps.build-final.outputs.digest }}
docker-test-and-tag:
runs-on: ubuntu-latest
needs: [build-check, docker-build-and-push]
if: success()
permissions:
contents: read
packages: write
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set Environment Variables
run: |
REPO_LOWER="$(echo "${{ github.repository }}" | tr '[:upper:]' '[:lower:]')"
REGISTRY=ghcr.io
BRANCH_NAME="${{ github.ref_name }}"
# Sanitize branch name for Docker tag (replace special chars with -)
BRANCH_TAG=$(echo "${BRANCH_NAME}" | sed 's/[^a-zA-Z0-9.-]/-/g')
echo "REGISTRY=${REGISTRY}" >> $GITHUB_ENV
echo "IMAGE=${REGISTRY}/${REPO_LOWER}" >> $GITHUB_ENV
echo "BRANCH_TAG=${BRANCH_TAG}" >> $GITHUB_ENV
echo "GIT_SHA=$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_ENV
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get built image tag
id: get-tag
run: |
# Get the specific commit image that was just built
COMMIT_TAG="${{ env.BRANCH_TAG }}-${{ env.GIT_SHA }}"
echo "COMMIT_TAG=${COMMIT_TAG}" >> $GITHUB_ENV
echo "TEST_IMAGE=${{ env.IMAGE }}:${COMMIT_TAG}" >> $GITHUB_ENV
echo "TARGET_TAG=${{ env.BRANCH_TAG }}-latest" >> $GITHUB_ENV
- name: Start persistent test container
run: |
echo "Starting persistent container: ${{ env.TEST_IMAGE }}"
# Start container in background with sleep to keep it running
docker run -d --name test-container ${{ env.TEST_IMAGE }} sleep infinity
- name: Install test dependencies in container
run: |
echo "Installing pandoc and test dependencies in persistent container..."
docker exec test-container bash -c "
apt-get update && apt-get install -y pandoc texlive-latex-base
Rscript -e \"
message('Installing rcmdcheck and BiocCheck...')
install.packages(c('rcmdcheck'))
message('Test dependencies installed successfully')
\"
"
- name: Test Docker image - Run CMD check
run: |
echo "Running R CMD check in persistent container..."
docker exec test-container Rscript -e "
message('Running R CMD check...')
options(crayon.enabled = TRUE)
result <- rcmdcheck::rcmdcheck(
args = c('--timings', '--no-manual'),
build_args = c('--no-build-vignettes', '--no-manual'),
error_on = 'error',
check_dir = 'check'
)
message('R CMD check completed successfully')
"
- name: Cleanup test container
if: always()
run: |
echo "Cleaning up test container..."
docker rm -f test-container || true
- name: Tag tested image as latest
if: success()
run: |
# Tag the tested image as [branch-name]-latest
SOURCE_IMAGE="${{ env.TEST_IMAGE }}"
TARGET_IMAGE="${{ env.IMAGE }}:${{ env.TARGET_TAG }}"
echo "✅ All tests passed! Promoting image:"
echo " Source: ${SOURCE_IMAGE}"
echo " Target: ${TARGET_IMAGE}"
# Use buildx imagetools to create new tag without downloading
docker buildx imagetools create \
"${SOURCE_IMAGE}" \
--tag "${TARGET_IMAGE}"
echo "🎉 Successfully tagged ${SOURCE_IMAGE} as ${TARGET_IMAGE}"
- name: Verify final tag
if: success()
run: |
# Verify the new tag exists and works
TARGET_IMAGE="${{ env.IMAGE }}:${{ env.TARGET_TAG }}"
echo "Verifying tagged image: ${TARGET_IMAGE}"
# Check image metadata
docker buildx imagetools inspect "${TARGET_IMAGE}"
# Quick test of the tagged image
docker run --rm "${TARGET_IMAGE}" \
Rscript -e "
message('Verifying tagged image...')
library(FLAMES)
message('✅ Tagged image verification successful')
"