reviewdog 用の Steep アクション、tk0miya/action-steep を作りました


2023年 06月 23日

こんにちは、tk0miya です。

先日、Gotanda.rb #53 に参加してきました。

以前開発した vscode-rspec-daemon を宣伝しようと LT しに参加したのですが、他のみなさんの発表も面白いものが多く、久しぶりのオフラインイベントを楽しむことができました。

 

ちなみに、発表した LT の資料はこちらです。

 

さて、その Gotanda.rb の発表のうち、@ohbarye さんが発表されていた RuboCop Custom Formatter for Reviewdog Diagnostic Format が特に印象に残りました。

reviewdog/action-rubocop にサジェスト機能を実装したというトークです。うちのチームでは、実際に reviewdog/action-rubocop を利用していることもあり、あのサジェスト機能を実装した方のお話が聞けるとは思ってもいなかったので、興味深く聞かせていただきました。もし reviewdog を使っていない場合はレビューの負担を下げる便利ツールなのでおすすめです。

 

今回の記事のきっかけは、そのトークの最後のまとめページです。

このページにある「型検査ツール (sorbet, steep) のcustom action は存在しない」という一言を見て、僕のハック魂に火が付きました。

 

…というわけで、出来上がったのがこちら(https://github.com/marketplace/actions/run-steep-with-reviewdog)です (3分クッキング風)。

存在しないのなら作ってしまえ、の精神で steep 用の reviewdog custom action を作ってみました。
これを利用すると、Steep と reviewdog を組み合わせて、PR 時に自動的に型チェック結果をコメントするようになります。

name: reviewdog
on: [pull_request]
  jobs:
    steep:
      name: runner / steep
      runs-on: ubuntu-latest
      steps:
        - name: Check out code
          uses: actions/checkout@v3
        - uses: ruby/setup-ruby@v1
          with:
            ruby-version: 3.2.0
        - name: steep check
          uses: tk0miya/action-steep@v1

実際の reviewdog によるコメントは以下のようになります。

どのように作ったのか

仕組みとしては

  • Steep で型チェックをする
  • Steep の出力結果を RDJSON (Reviewdog 用の入力フォーマット) に変換する Ruby スクリプト
  • reviewdog コマンド
  • これらを取りまとめるシェルスクリプト

から構成されています。

取り立てて難しいことはやっていませんので、script.sh を覗いてみるとおおよその構造は理解できるはずです。

RDJSON への変換スクリプトもかなりシンプルです。区切りを見つけてはエントリーを切り出し、最後に RDJSON 形式に変換しているだけの簡単スクリプトです。

 

今回、action-steep を作るのには 2時間ほどしかかかっていません。
というのも、実は以前 erb-lint + reviewdog の仕組みを作ったことがあったため、今回 steep 版はほぼコピーで済んでいるからなんですね。

少し手間取ったのは Steep の出力を受け取る部分で、フォーマットが自由な steep check を使うのか、JSONL 形式で返してくれる steep checkfile を使うのかの判断のところでした。
steep checkfile コマンドは扱いやすい JSONL 形式を返してくれるので、これを利用して実装しようと考えたのですが、何度か実験してみたところ、プロジェクト内の全ファイルを対象に checkefile を実行する場合、steep check の数倍の時間がかかることがわかりました。
プログラムは書きやすそうだったのですが、実行時間が膨れてしまうのは本意ではありませんし、この結果が出た時点ですぐに諦めて steep check 向けにコードを書き直しました。

いつだって計測は重要ですね。

まとめ

ということで、まとめです。

    • Gotanda.rb に参加しました。発表できる場、人の話を聞ける場はいいですね。
    • @ohbarye さんの発表に刺激を受け、tk0miya/action-steep を作りました
    • Steep の型チェックをはじめてる人、使ってみてください


残念ながら我々のプロジェクトでは型チェックの導入が不完全なため、この Action はまだ導入できないのですが、どなたかの役に立ってくれると嬉しいなと思います。


僕らもいつかこれを利用できるところを目指して型を増やしていこうと思っています。