アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Pronto を Github Action で実行する

morishitaです。

rubocop や brakeman などの静的コード解析ツールを Prontoで実行するとPull Request にコメントで指摘されるので便利です。というのは、以前、キエンが紹介しました。

tech.actindi.net

このときは、AWSの Lambda と CodeBuild で実行していたのですが、次の理由からGithub Actionに移行しました。

  • 複数のAWSのサービスで構成しており仕組みが少々複雑
  • 時間を短縮したい(CodeBuild のプロビジョニングとソースコード取得だけで3分ほどかかっていた)
  • コスト削減可能では?(今の Github Action の利用量なら無料枠で収まるはず)

最初は公開Actionの利用を検討

上記の理由が最初にあったわけではなく、 きっかけはPronto Ruby を見つけたことでした。 これを使えば Github 上で簡単にできちゃうんじゃないかと。 すると上記が満たせるのではないかと。

で、v2.3.1(2020/01/29時点の最新版)試してみたのですが、なんか依存関係でエラーが出るので利用を諦めました1

ProntoのREADMEに載ってた!

仕方ないので、独自アクションを作ろうかと、Pronto の README を見返してみると、GitHub Actions Integrationに設定方法が載っていました! なーんだ。

Github の Workflow定義

で、GitHub Actions Integrationを参考にして、次の様に .github/workflow/pronto.ayml を作りました。

name: Pronto
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  pronto:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-ruby@v1
        with:
          ruby-version: '2.6'
      - run: gem install --no-document pronto pronto-rubocop pronto-brakeman pronto-rails_best_practices rubocop-performance rubocop-rails rubocop-rspec
      - run: PRONTO_PULL_REQUEST_ID="$(jq --raw-output .number "$GITHUB_EVENT_PATH")" PRONTO_GITHUB_ACCESS_TOKEN="${{ secrets.GITHUB_TOKEN }}" pronto run -r rubocop rails_best_practices brakeman -f github_status github_pr -c origin/master

やっていることはシンプルで、次をやってるだけです。

  • actions/checkout@v1 でコードを取くる
  • actions/setup-ruby@v1 で pronto 関連の gem をインストール & Pronto実行

ちなみに、actions/checkout は v2 がリリースされています。しかし、v2ではコードのフェッチするdepthなどが設定できるようになっている反面、それらを設定する必要があり、面倒だったので v1 を利用しています。

Prontoのフォーマッタ github_pr を利用することで、GithubのPRにコメントでrubocopのエラーを指摘してくれます。

移行結果

さて、CodeBuildからの移行の理由に時間短縮を挙げていました。 では、Github Actionだとどうなのか?

次の結果は一例ですが、だいたい2.5分くらいで終わるようになりました。

f:id:HeRo:20200129072630p:plain
実行結果

かかっている時間の内訳はだいたい次の通り。

  • コードのチェックアウトに1分
  • Proto 一式のインストールに1分
  • その他、Prontoの実行時間などに30秒程度

CodeBuildだと2分以上かかっていたコードのチェックアウトは約半分の時間に短縮できました。 データの移動がGithub内のみになった効果かなと思います。

毎回、Pronto一式をインストールするのは無駄かなぁと思ったのですが、 1分ちょっとしかかかってないので許容範囲かと思いました(この時点では)。

これまでよりも短い時間でチェックでき、しかも無料枠に様っている現状ではゼロコストとなり移行してよかったなと思いました(この時点では)。

やっぱり Github Action化!

と、これで終わりにしようかと思ったのですが、やはり時間が経つにつれ毎回Pronto一式をインストールするのは無駄に思えてきました。 それで、予めPronto一式をインストールした Docker イメージを利用する Github Actions を作成しました。

Pronto Action · Actions · GitHub Marketplace

当初はDockerイメージをPullするのに結局1分くらいかかってしまうのではないかと思っていたのですが、そうではありませんでした。 結果は次のとおりです。

f:id:HeRo:20200129072731p:plain
Pronto Actionでの実行結果

ソースのチェックアウトの時間は変わりませんが、Gemのインストールに相当するビルドで、イメージのPullをしています。その時間、10秒程度! 処理全体でも1分近く減らして、1.5分程度と最初の状態と比べるとかなりの時間短縮となりました。

まとめ

  • Dockerイメージ化したGithub Actionを利用することで、3分以上 -> 1.5分 と半減以上を時間短縮達成しました。
  • Railsアプリの Gemfile から Pronto 関連のgemを除去できました。
  • 無料枠範囲内なので(今のところ)コストゼロ!
  • Pronto を実行する汎用的な Github Action を公開しました。

最後に

アクトインディではエンジニアを募集しています。 actindi.net


  1. 以前のバージョンも試していたのですが、なかなかうまく動くバージョンがなく個人的な感想ですが不安定な印象です。車輪の再発明は避けたかったのですが。