Don't Repeat Yourself

Don't Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of all kinds. -- wikipedia

GitHub Actions 上の cargo install でインストールされるプラグインをキャッシュしつつ使いたい

GitHub Actions 上で cargo install 経由でインストールされるプラグインを使いたいと思いました。しかし実際に使ってみると、そのプラグインのインストールとビルドに5分程度毎回時間を要することがわかりました。これはビルド時間を伸ばすことにつながり開発の生産性を下げるのので、解決策を探しました。

背景

今回解決したい事象の背景としては次のとおりです。

  • GitHub Actions 上で、SQL クエリビルダー sqlx のクライアント sqlx-cli を実行し、ビルド時とテスト時にデータベースにマイグレーションをかけたい。
    • sqlx はコンパイル時にデータベースに接続し、データベース上にテーブルがあるかどうかまでチェックする機能がある。それに必要。
  • ただ、sqlx-cli はインストールとビルドに時間がかかる。手元の GitHub Actions ではだいたい5分くらいを要していたようだった。
  • キャッシュすれば解決するのでキャッシュしたい。

解決策

結果的に便利な action が見つかったので、それを使用することにしました。ただこの action は、基本的には cargo install 時のキャッシュ専用のディレクトリを作ってそこにキャッシュを行うだけという比較的単純なものなので、自分で同様の action を作ってみてもよいかもしれません。

github.com

今回は sqlx に対して使用したいので、使えるように下記のように定義を書き足しました。

# GitHub Actions の定義ファイルの一部
      - uses: baptiste0928/cargo-install@v1
        name: Install sqlx-cli
        with:
          crate: sqlx-cli
# 続く

最初のビルドではフルインストールとビルドが走りますが、2度目以降のビルドではきちんとキャッシュされていることを確認できます。

f:id:yuk1tyd:20220417163419p:plain
キャッシュが効くと、「Restored crate from cache」と出る