失敗したrspecのテストをgithubのcheck annotationsでみられるようにする


GithubActionsでCICDフローを回せて便利!
でもrspecがこけたときに、エラー箇所をしらべるのに難儀する。
Github Checksでみられたらよさそう。

reviewdogでアップロードしようと思ったけれど、サポートされているエラーフォーマットはなかった。
https://github.com/reviewdog/reviewdog#available-pre-defined-errorformat

サポートするためのPRつくれるかなとおもってソースをみていたら、 Reviewdog Diagnostic Format というものが提案されている。
https://github.com/reviewdog/reviewdog/tree/master/proto/rdf

パーサーを書くより、こっちのフォーマットに合わせて、rspecの出力を加工するほうが良さそう。
でもまだ正式版じゃないみたい。SARIF良さそう。
なのでRDFormatではなく、既存の入力フォーマットに合わせてrspecのフォーマッタを作ることにする。
https://github.com/reviewdog/reviewdog#input-format

  • errorformat
  • checkstyle XML format

を試作してみて、動作確認がしやすかった checkstyle にする。

XMLがなつかしい。

https://github.com/astronoka/rspec-checkstyle_formatter
フォーマッタをつくってgemにしました。

実装中、mysqlかなにかのエラーで出力される asciiのカラーコード \e[0;34m 的なやつでXMLのビルダー/パーサーがエラーになったりして
そういえばこういうことでエラーになったことあったなと、ますます懐かしい気持ちになる。

GithubActionsでの記述例


name: CI

on: push

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: 2.7.1

    - name: Restore gems
      uses: actions/cache@v2
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gems-

    - name: Run rspec
      run: |
        bundle config path vendor/bundle
        bundle install --jobs 4 --retry 3
        bundle exec rspec \
          --no-fail-fast \
          --format RSpec::CheckstyleFormatter \
          --out /tmp/rspec_result.xml

    - name: Upload rspec result
      if: always()
      uses: actions/upload-artifact@v2
      with:
        name: rspec_result.xml
        path: /tmp/rspec_result.xml

    - name: Install reviewdog
      if: always()
      uses: reviewdog/action-setup@v1
      with:
        reviewdog_version: latest

    - name: Report rspec error
      if: always()
      env:
        REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        cat /tmp/rspec_result.xml | reviewdog -name=rspec -f=checkstyle -reporter=github-check -filter-mode=nofilter

こんなかんじ。

reviewdog素晴らしい

linter向けのフォーマットで渡すのはどうなのだろうと思いつつ
了。