Fix the expect_cell_number check #339
This file contains hidden or 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
| ## 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') | |
| " | |