Rustのツールを簡単にインストールするGitHub Action:install-actionメモ [blessed.rsシリーズ25]
概要
こちらのリストにあるものを見て書いたメモになります。
今回はinstall-actionについてです。
install-actionとは
Rustのための開発ツールをインストールするためのGitHub Action
できること
GitHub Actionsで使用したいRustのツールをインストールすることができる。
特に以下の2点でメリットがある。
- 基本的にバイナリを取ってきてくれるので、ビルドを行わない分CIの時間を短縮できる
- セキュリティ面
(詳細は後述)
例えば以下のように使用できる。
name: Rust CI
on: [push, pull_request]
jobs:
test:
name: cargo test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@cargo-nextest
- run: cargo nextest run --all-features
上記のuses: taiki-e/install-action@cargo-nextest
でcargo-nextest
をインストールしている。
使用方法
インプットは以下の3つがある。
- tool: インストールするツール名を「,」区切りで指定
- checksum: チェックサムを行う場合true
- デフォルトはtrue
- fallback: フォールバック(サポートしていないツールの場合にとる方法)をどうするか
- デフォルトは
cargo-binstall
。cargo-binstall
を使用して指定したツールをインストールする - noneを指定するとフォールバックを行わない
- デフォルトは
tool: versionの指定方法や複数指定について
以下のようにversionを指定することができる。
- uses: taiki-e/install-action@v2
with:
tool: cargo-hack@0.5.24
なお、versionの指定方法は以下がある。
- すべて指定:1.5.24
- パッチバージョンの省略:1.5
- メジャーバージョンが1以上の場合はマイナーバージョンの省略:1
- 指定しない
なお、versionを指定しない場合は、以下のような省略記法が使える。
- uses: taiki-e/install-action@cargo-hack
また、複数指定する場合は以下のように指定する。
- uses: taiki-e/install-action@v2
with:
tool: cargo-hack,cargo-minimal-versions
checksum: セキュリティについて
GitHub Releasesからインストールするツールについては、ダウンロードしたファイルのSHA256チェックサムを検証する。
これはデフォルトで有効になっており、以下のようにchecksumをfalseにすることで無効にできる。
- uses: taiki-e/install-action@v2
with:
tool: cargo-hack@0.5.24
checksum: false
ツールが署名付きアーカイブを配布している場合は、署名の検証も行う。
署名検証はチェックサムを取得する段階で行われるため、チェックサムを無効にすると署名検証も無効になる。
また、checksumとは関係がないが、GitHub Releasesからツールをインストールする場合、tlsv1.2+のHTTPSを使用してツールまたはそのインストーラーをダウンロードする。
これはrustupの推奨インストールと同じレベルのセキュリティのようである。
fallback: サポートしているツールとそうでない場合
このアクションでは、以下のリンクのリストにあるものを対応している。
このリストにないものの場合は、デフォルトだとcargo-binstallを使用してインストールを試みる。
もしこれを行わないようにしたい場合は以下のようにfallback
をnone
にする必要がある。
- uses: taiki-e/install-action@v2
with:
tool: cargo-hack@0.5.24
fallback: none
なお、例えばcargo install ...
とインストールする場合は、ソースをインストールして、そのあとビルドを行う。
CIで使用する場合は、このビルド時間がもったいないので、バイナリをそのままインストールできると便利だが、それを行うのがcargo-binstall
である。
一方cargo-binstall
の場合はcrate metadataからパースして最適なインストール処理を見つけて実行するという設計になっているようで、そのためインストール手順が常に同じとは限らない。
「サポートしているツール」についてはcargo-binstall
を使用しせずに特定のインストール方法でインストールしているため、この問題が起きないようになっていると思われる。
使用例
以下はmainブランチへのpushとプルリクエスト時のみcargo nextest
とcargo fmt
が実施されるようにした例である。
name: Rust CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -Dwarnings
jobs:
test:
name: cargo test and fmt
runs-on: ubuntu-latest
defaults:
run:
working-directory: test_rust
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- uses: taiki-e/install-action@v2
with:
tool: cargo-nextest
- uses: Swatinem/rust-cache@v2
with:
workspaces: test_rust
- run: cargo nextest run --all-features
- run: cargo fmt --all --check
install-action以外の点については前回の記事も参照
またcargo-nextest
については以前の記事を参照
Discussion