個人リポジトリでは CI などを GitHub Actions に任せている。で、誰かが作ってくれた色々な Action に助けられている。

というわけでそれらを、より多く助けられてるなってやつから紹介してみようと思う。

正直、自分が何を使ってたかを後から調べる時にこの記事を読めば大体済むよねってなりそうなので書いている部分が大きい。すーぐ忘れるもん。

actions/checkout

https://github.com/marketplace/actions/checkout

多分 GitHub Actions を使ってる人ならみんな使ってる。だって普通チェックアウトするもんね。使うよね。

今のところ自分は単純に checkout するのにしか使ってないが何気にオプションが多い。それらの使い方もしっかり書かれていて良い。

普通に使う分には

- uses: actions/checkout@v2
  with:
    ref: ${{ github.head_ref }}
    submodules: true

だけで良い。これで checkout される。楽。

自分の場合は submodule が必要だった際に

with:
  submodules: true

としてみたり、 pull_request で動かしたいけど、その hash ではなく branch をチェックアウトしたい時に

with:
  ref: ${{ github.head_ref }}

としたりなどしてた。

lazy-actions/slatify

https://github.com/marketplace/actions/slatify

Slack 通知用の Action ですね。オプションが結構充実している。 CI 終了後に成功/失敗を通知するのに使っている。

Slack の方に Incoming Webhook を用意してそこを使ってメッセージを飛ばせるようにするやつ。

自分の場合はこんな感じで、成功失敗に関わらず通知を飛ばしていて、ただ失敗の場合は here mention が飛ぶようにしている。

- name: Notify slack build result
  uses: lazy-actions/slatify@master
  if: always()
  with:
    type: ${{ job.status }}
    job_name: '*Build*'
    mention: 'here'
    username: 'GitHub Actions'
    mention_if: 'failure'
    channel: '#develop'
    url: ${{ secrets.SLACK_WEBHOOK }}
    commit: true
    token: ${{ secrets.GITHUB_TOKEN }}

ここではやってないけど絵文字も指定できるので便利。まあ Webhook 側に仕込んでいたらあまり使わないんだけども。

元は homoluctus/slatify だったので ember-rails-todo-app とかでまだその設定を残している。変更しないと〜。

ruby/setup-ruby

https://github.com/ruby/setup-ruby

Ruby やるならこれだよねってやつ。

多数のバージョンをサポートしているしリポジトリに .ruby-version ファイルがあればそれを見てくれる。

Bundler 周りも cache 使ったりとかをいい感じにしてくれてとても便利。

というわけで今のところ自分は以下の感じで間に合ってる。

- name: Use ruby
  uses: ruby/setup-ruby@v1
  with:
    bundler-cache: true

nanasess/setup-chromedriver

https://github.com/marketplace/actions/setup-chromedriver

CI で Chrome でもテストしたい時に使ってる。 Rails で Capybara でテストする時ですね。

chromedriver のセットアップなので Capybara 使う時はこれでいいんじゃないかなって思ってる。 rspec 側でも色々書く必要があるのでだるい けど、まあ Chromedriver だからなのかな。

とりあえず workflow 側ではこんな程度でしか使ってない。

- name: use-chromedriver
  uses: nanasess/setup-chromedriver@master

他のプロジェクトだとテストどうやってるのかな。今度調べてみたいね。

actions/setup-node

https://github.com/marketplace/actions/setup-node-js-environment

Node.js をセットアップしてくれる。自分は以下のような単純な使い方しかしてないけど、何度もお世話になっている。

- name: Use Node.js
  uses: actions/setup-node@v1
  with:
    node-version: 14.x

reviewdog/action-setup

https://github.com/reviewdog/action-setup

eslint とか Rubocop とかの結果を使って GitHub 上で指摘してくれたりする便利なワンちゃん。

まあ eslint や Rubocop あたりは reviewdog/action-eslint とか後述の reviewdog/action-rubocop とかを使えたらそっちを使う方が良い。

自分は eslint は yarn を使ってるからか自前の NPM ライブラリを使ってるからかで、 action-eslint だとうまく動かせなかったので reviewdog/action-setup で reviewdog のセットアップだけして自前でコマンドを叩く方法を選択している。

というわけで

- uses: reviewdog/action-setup@v1
  with:
    reviewdog_version: latest

でとりあえず使えるようにして

- name: Run reviewdog
  env:
    REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    NPM_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
  run: |
    yarn --silent run eslint -f rdjson . | reviewdog -f=rdjson -reporter=github-pr-review    

みたいなことをしている。

Ember.js のテンプレートもそのうち対応しないとなあ……。

reviewdog/action-rubocop

https://github.com/marketplace/actions/run-rubocop-with-reviewdog

最近入れてみた。設定にもよるけど、Rubocop で引っ掛かったところについて PR のチェックリスト的なやつで教えてくれたり、コメントを入れてくれたりする。 Rubocop 先生に怒られたかったので便利。

- name: rubocop
  uses: reviewdog/action-rubocop@v1
  with:
    rubocop_version: gemfile
    rubocop_flags: -a
    rubocop_extensions: rubocop-rails:gemfile
    github_token: ${{ secrets.GITHUB_TOKEN }}
    reporter: github-pr-review
    fail_on_error: true

とりあえずこんな感じの設定で使ってる。基本的に Gemfile の設定を使って、後は何か見つかったら review として飛ばしてくれるようにしている。

rubocop_flags の -a は要るのかな……。少なくとも eslint の方は --fix するとかえって思ったような挙動にならなかったような……。まいっか。しばらくそのまま運用しよう。