I setup for my R package repository a pkgdown workflow.
The .github/workflows/pkgdown.yaml file:
on:
push:
branches: [main, master]
release:
types: [published]
workflow_dispatch:
name: pkgdown
jobs:
pkgdown:
runs-on: ubuntu-latest
env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout#v2
- uses: r-lib/actions/setup-pandoc#v1
- uses: r-lib/actions/setup-r#v1
with:
use-public-rspm: true
- uses: r-lib/actions/setup-r-dependencies#v1
with:
extra-packages: pkgdown
needs: website
- name: Deploy package
if: contains(env.isPush, 'true')
run: |
git config --local user.email "actions#github.com"
git config --local user.name "GitHub Actions"
Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)'
The pkgdown workflow works fine, but it fails to update the GitHub pages.
I setup the gh-pages branch as explained in the GitHub documentation, so the workflow pages-build-deployment is present, but when I push on main branch it doesn't run.
I realized the problem was in the if: contains(env.isPush, 'true') line. The condition is never true nor false, since there is no attribute isPush under env, hence the lines
run: |
git config --local user.email "actions#github.com"
git config --local user.name "GitHub Actions"
Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)'
were never executed.
To solve the problem, either modify the env part:
env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
isPush: ${{ github.event_name == 'push' }}
or remove the if condition before the run command.
Related
npm CI && npm run build is failing in github actions I'll paste the yaml file below.
name: Deploy to Firebase Hosting on PR
"on": pull_request
jobs:
build_and_preview:
if: "${{ github.event.pull_request.head.repo.full_name == github.repository }}"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout#v2
- run: npm ci && npm run build
- uses: FirebaseExtended/action-hosting-deploy#v0
with:
repoToken: "${{ secrets.GITHUB_TOKEN }}"
firebaseServiceAccount: "${{ secrets.SECRET }}"
projectId: projectId
enter image description here
I tried to remove npm CI, deleted node_modules package and package.json file in local and re-installed everything.
It looks like you don't have package-lock.json in the root directory.
You can add it using: npm i --package-lock-only
And try to set the ci to empty, eg:
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout#v3
- name: Install Dependencies
run: npm install
- name: Build
run: npm run build
env:
CI: ""
I'm new to using GitHub actions, so please be gentle with me! I'm trying to automate a script that I'm currently running using Windows Task Scheduler. I've written the yml code below and its stored (privately) on GitHub at jeremy-horne/Client/.github/workflows/
The RMD code is 900 lines long and works when run in R studio. It is stored on GitHub at jeremy-horne/Client
`
name: my_project
on:
schedule:
- cron: "18 17 */1 * *" # Every day at 18:17
jobs:
render-rmarkdown:
runs-on: ubuntu-latest
# optionally use a convenient Ubuntu LTS + DVC + CML image
#container: docker://dvcorg/cml:latest
steps:
- uses: actions/checkout#v3
- name: Setup R
uses: r-lib/actions/setup-r#v2
#- name: Setup Pandoc
# uses: r-lib/actions/setup-pandoc#v2
- name: Setup dependencies
run: |
R -e 'install.packages("renv")'
R -e 'renv::restore()'
- name: Identify and email articles
#env:
# repo_token: ${{ secrets.GITHUB_TOKEN }}
run: |
Rscript -e 'rmarkdown::render(input = "My_Markdown_Code.Rmd")'
if [[ "$(git status --porcelain)" != "" ]]; then
git config --local user.name "$GITHUB_ACTOR"
git config --local user.email "$GITHUB_ACTOR#users.noreply.github.com"
git add *
git commit -m "Auto update Report"
git push origin
fi
`
The error I get says "render-rmarkdown
there is no package called ‘rmarkdown’"
Any help much appreciated!
I'm currently using the macOs os version for my Github Actions but it's very consuming on my minutes thresholds as it has a 10x cost on the monthly limit
I would like to switch to Ubuntu or Windows but I'm not quite sure about how to change my YML file.
Here is my actual YML file of one of my workflow:
# Hourly scraping
name: amazonR Polite Price Checker
# Controls when the action will run.
on:
schedule:
- cron: '0 0 * * 1,4'
jobs:
autoscrape:
# The type of runner that the job will run on
runs-on: macos-latest
# Load repo and install R
steps:
- uses: actions/checkout#master
- uses: r-lib/actions/setup-r#master
# Set-up R
- name: Install packages
run: |
R -e 'install.packages("tidyverse")'
R -e 'install.packages("tibble")'
R -e 'install.packages("openxlsx")'
R -e 'install.packages("gdata")'
R -e 'install.packages("lubridate")'
R -e 'install.packages("rvest")'
R -e 'install.packages("stringr")'
R -e 'install.packages("dplyr")'
R -e 'install.packages("purrr")'
R -e 'install.packages("plyr")'
R -e 'install.packages("polite")'
R -e 'install.packages("xml2")'
R -e 'install.packages("gt")'
R -e 'install.packages("blastula")'
# Run R script
- name: Scrape with the polite package
env:
EMAIL_SENDER: ${{ secrets.EMAIL_SENDER }}
EMAIL_PASSWORD: ${{ secrets.EMAIL_PASSWORD }}
EMAIL_RECIPIENT: ${{ secrets.EMAIL_RECIPIENT }}
EMAIL_CC_1: ${{ secrets.EMAIL_CC_1 }}
EMAIL_CC_2: ${{ secrets.EMAIL_CC_2 }}
EMAIL_CC_3: ${{ secrets.EMAIL_CC_3 }}
run: Rscript polite_price_checker.R
# Add new files in data folder, commit along with other modified files, push
- name: Commit files
run: |
git config --local user.name github-actions
git config --local user.email "actions#github.com"
git add polite_price/*
git commit -am "GH ACTION Autorun POLITE PRICE $(date)"
git push origin main --force
env:
REPO_KEY: ${{secrets.GITHUB_TOKEN}}
username: github-actions
The runner is configured by the runs-on for each job.
It can be a GitHub hosted runner or a self-hosted runner according to your context.
Examples with GitHub hosted runner:
jobs:
job1:
runs-on: ubuntu-latest
steps:
[ ... ]
job2:
runs-on: macos-latest
steps:
[ ... ]
job3:
runs-on: windows-latest
steps:
[ ... ]
The available GitHub runner images (with the pre-installed tools) can be found here for more details.
Be aware that each runner use a specific shell by default, for example ubuntu and macos use bash, where windows use powershell.
Therefore, in your case, you just need to update the runs-on: macos-latest to runs-on: ubuntu-latest or runs-on: windows-latest (supposing you want to use the latest, and not a specific version).
Note that you can also use matrix to run the same job on different runners if necessary (without duplicating code).
I want to adapt the boilerplate code in the r-lib/actions repo to add a linting check to my (fake) package. I have my workflow yaml as follows:
on:
push:
branches:
- main
- master
pull_request:
branches:
- main
- master
name: lint
jobs:
lint:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./mystarwars
steps:
- uses: actions/checkout#v2
- uses: r-lib/actions/setup-r#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: Restore R package cache
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 dependencies
run: |
install.packages(c("remotes"))
remotes::install_deps(dependencies = TRUE)
install.packages(c("lintr"))
shell: Rscript {0}
- name: Install package
run: R CMD INSTALL .
- name: Lint
run: lintr::lint_package()
shell: Rscript {0}
However, I get errors when trying to install lintr in the "Install dependencies". This step fails (silently), so then when it reaches the "Lint" step it fails with Error: Error in loadNamespace(x) : there is no package called ‘lintr’.
This remains the case whether I use install.packages(c("lintr")) or remotes::install_cran("lintr").
HERE is the full log of the "Install dependencies" step on GitHub Actions.
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?
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,
It's hard to investigate the issue without detailed logs and no information about what dependencies (remotes) are being installed in Query dependencies step. It seems the PhantomJS dependency is not being installed at all. The workflow succeeds on ubuntu-20.04 because the runner has PhantomJS installed out-of-the-box. You can see all the installed software on provided runner types here. The other runner types used in the workflow above (windows-latest and macOS-latest) are missing PhantomJS. That's why your workflow fails on Windows and MacOS but succeeds on Ubuntu.