rphantomjsgithub-actions

Github Actions - R package R-CMD-Check "PhantomJS not found"


I am using GitHub actions for CI of my R package. I am trying using both testthat and shinytest in my package. I have the package structure set up correctly according to the shinytest documentation. When I run R-CMD-CHECK in RStudio, my package (including both testthat and shinytest testing works).

My GitHub Actions .yaml workflow is:

on:
  push:
    branches:
      - main
      - master
  pull_request:
    branches:
      - main
      - master

name: R-CMD-check

jobs:
  R-CMD-check:
    runs-on: ${{ matrix.config.os }}

    name: ${{ matrix.config.os }} (${{ matrix.config.r }})

    strategy:
      fail-fast: false
      matrix:
        config:
          - {os: windows-latest, r: 'release'}
          - {os: macOS-latest, r: 'release'}
          - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}
          - {os: ubuntu-20.04, r: 'devel', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"}

    env:
      R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
      RSPM: ${{ matrix.config.rspm }}

    steps:
      - uses: actions/checkout@v2

      - uses: r-lib/actions/setup-r@v1
        with:
          r-version: ${{ matrix.config.r }}

      - uses: r-lib/actions/setup-pandoc@v1

      - name: Query dependencies
        run: |
          install.packages('remotes')
          saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2)
          writeLines(sprintf("R-%i.%i", getRversion()$major, getRversion()$minor), ".github/R-version")
        shell: Rscript {0}

      - name: Cache R packages
        if: runner.os != 'Windows'
        uses: actions/cache@v2
        with:
          path: ${{ env.R_LIBS_USER }}
          key: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-${{ hashFiles('.github/depends.Rds') }}
          restore-keys: ${{ runner.os }}-${{ hashFiles('.github/R-version') }}-1-

      - name: Install system dependencies
        if: runner.os == 'Linux'
        run: |
          while read -r cmd
          do
            eval sudo $cmd
          done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "20.04"))')

      - name: Install dependencies
        run: |
          remotes::install_deps(dependencies = TRUE)
          remotes::install_cran("rcmdcheck")
        shell: Rscript {0}

      - name: Check
        env:
          _R_CHECK_CRAN_INCOMING_REMOTE_: false
        run: rcmdcheck::rcmdcheck(args = c("--no-manual", "--as-cran"), error_on = "warning", check_dir = "check")
        shell: Rscript {0}

      - name: Upload check results
        if: failure()
        uses: actions/upload-artifact@main
        with:
          name: ${{ runner.os }}-r${{ matrix.config.r }}-results
          path: check

When I commit to the repository, the check fails on Windows and Mac OS but works on Ubuntu.

The error that I am I am getting on both Windows and Mac OS is:

> test_check("mypackage")
-- 1. Error: application works (@test-appdir.R#6)  -----------------------------
PhantomJS not found.

I don't think this is a problem with my package or tests. I think there is something misconfigured about my .yaml. How can I resolve this issue with PhantomJS in my workflow?


Solution

  • The easy solution will be to go to the project where there is used PhantomJS and the Github Actions is turned on. We will go to shiny project and precisely to: https://github.com/rstudio/shiny/blob/master/.github/workflows/R-CMD-check.yaml

    We could find out there that:

          - name: Install system dependencies
            if: runner.os == 'Linux'
            env:
              RHUB_PLATFORM: linux-x86_64-ubuntu-gcc
            run: |
              Rscript -e "remotes::install_github('r-hub/sysreqs')"
              sysreqs=$(Rscript -e "cat(sysreqs::sysreq_commands('DESCRIPTION'))")
              sudo -s eval "$sysreqs"
          - name: Install dependencies
            run: |
              remotes::install_deps(dependencies = TRUE)
              remotes::install_cran("rcmdcheck")
            shell: Rscript {0}
    
          - name: Find PhantomJS path
            id: phantomjs
            run: |
              echo "::set-output name=path::$(Rscript -e 'cat(shinytest:::phantom_paths()[[1]])')"
          - name: Cache PhantomJS
            uses: actions/cache@v1
            with:
              path: ${{ steps.phantomjs.outputs.path }}
              key: ${{ runner.os }}-phantomjs
              restore-keys: ${{ runner.os }}-phantomjs
          - name: Install PhantomJS
            run: >
              Rscript
              -e "if (!shinytest::dependenciesInstalled()) shinytest::installDependencies()"
    

    We easily could check that there is separate chunk of code only to be sure that PhantomJS localization is known or if it should be installed.

    You could paste this part of code to your yaml file. However the best way might to be follow the pipeline of shiny project,