株式会社ホクソエムのブログ

R, Python, データ分析, 機械学習

GitHub Actions でRのパッケージの継続的インテグレーション(CI)を行う

本記事について

R Advent Calendar 2019 1103日目の記事です。 空きがなかったので適当に書きます。

1103->11月03日は”いいおっさん”の日です、各位、よろしくお願いいたします。

はじめに

株式会社ホクソエムの高柳です。

この記事ではGitHub ActionsとR、特にRのパッケージ開発と組み合わせて使う方法を書きたいと思います。 GitHub Actionsとは”コードをビルド、テスト、パッケージング、リリース、デプロイするためのプロセスの集合”であるワークフローを、GitHub リポジトリに直接作成することができる仕組みです。 詳しくは この辺なんかを読むとよいでしょう。

R言語への適用例としては、丁度R Advent Calendar 2019 8日目:GitHub Actions で R の環境ごとのベンチマークをとったにも記事があります。

なぜGitHub Actionsを使うのか?

R言語のパッケージのCIツールとしてはTravis CIがほぼデファクトスタンダードかなと思うのですが、これをPrivate repositoryや会社で使おうと思うと費用がかかってしまいます。 もちろん会社・個人として応援できる場合は全然課金すれば良いと思うのですが、そうではない場合には何某かの代替手段が欲しいところです。

そこでGitHub Actionsが使えるかどうか調べてみた、というお話です。

Rパッケージ開発での使い方

サッとググって調べたところ、

github.com

が見つかるのですが、これを素直に使うよりも usethis パッケージにスッと導入された関数を使う方が簡単そうなので、今回はこれを使うことにします。 もっといいやり方があったら教えてください!

まず、CIしたいパッケージはRStudioやusethisから適当に作っておくとして、usethisパッケージをgithubからインストールしておきます。 これは、上述した機能がまだCRAN版にないための対応です。

devtools::install_github("r-lib/usethis")

usethisをインストール or 更新したのち、Rのコンソールから

usethis::use_github_actions()

を叩くと、開発しているパッケージのディレクトリに .github/workflows/R-CMD-check.yaml というファイルができています。

$ cat .github/workflows/R-CMD-check.yaml
on: [push, pull_request]

name: R-CMD-check

jobs:
  R-CMD-check:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v1
      - uses: r-lib/actions/setup-r@master
      - name: Install dependencies
        run: Rscript -e "install.packages(c('remotes', 'rcmdcheck'))" -e "remotes::install_deps(dependencies = TRUE)"
      - name: Check
        run: Rscript -e "rcmdcheck::rcmdcheck(args = '--no-manual', error_on = 'error')"

このファイルをgithubにアップロードするだけです、簡単ですね???

なお、中で使われているr-lib/actionsやこの機能自体は、最近だと glueパッケージで(個人的にはよくお世話になる)有名なRStudioの Jim Hester 氏がメインで開発しているので安心・安全ですね!

README.mdにStatusバッジを張り付けたい!というオシャレさんは以下のようにするとバッチが張り付けられます。

[![R build status](https://github.com/shinichi-takayanagi/ghactiontest/workflows/R-CMD-check/badge.svg)](https://github.com/shinichi-takayanagi/ghactiontest)

この辺のもう少し詳しい使い方や解説については英語での解説記事があるので、こちらも参考にするとよいでしょう。 - Github actions with R

サンプルコード

ここでの手順を踏まえた上で、適当に作ったパッケージにPull Requestをこんな感じで出してみました。

Update README.md by shinichi-takayanagi · Pull Request #1 · shinichi-takayanagi/ghactiontest · GitHub

勝手に単体テスト(正確にはR CMD check相当の処理)を行ってくれます。 これで安心してRのパッケージ開発に専念できますね!

Enjoy!