Skip to main content

Rust のビルドとテスト

Rust プロジェクトのビルドとテストのために継続的インテグレーション (CI) ワークフローを作成できます。

はじめに

このガイドでは、Rust パッケージのビルド、テスト、公開の方法について説明します。

GitHub ホステッド ランナーにはプレインストールされたソフトウェアのあるツール キャッシュがあり、Rust 用の依存関係が含まれています。 最新のソフトウェアの完全な一覧と、プレインストールされたバージョンの Rust については、「GitHub ホステッド ランナーの概要」を参照してください。

前提条件

YAMLの構文と、GitHub ActionsでのYAMLの使われ方に馴染んでいる必要があります。 詳しくは、「GitHub Actions のワークフロー構文」をご覧ください。

Rust 言語の基本を理解しておくことをお勧めします。 詳細については、「Rust の概要」を参照してください。

Rust ワークフロー テンプレートを使用する

すぐに開始するには、リポジトリの .github/workflows ディレクトリにワークフロー テンプレートを追加します。

GitHub には、ほとんどの基本的な Rust プロジェクトに使用できる Rust ワークフロー テンプレートが用意されています。 このガイドの以降のセクションでは、このワークフロー テンプレートをカスタマイズする方法の例を示します。

  1. GitHub で、リポジトリのメイン ページに移動します。

  2. リポジトリ名の下にある [アクション] をクリックします。

    "github/docs" リポジトリのタブのスクリーンショット。 [アクション] タブがオレンジ色の枠線で強調表示されています。

  3. ワークフローが既にリポジトリ内にある場合は、 [新しいワークフロー] をクリックします。

  4. [ワークフローの選択] ページには、推奨されるワークフロー テンプレートの選択が表示されます。 「Rust」を検索します。

  5. [継続的インテグレーション] をクリックして、ワークフローの選択をフィルター処理します。

  6. [Rust - by GitHub Actions] ワークフローで [Configure] をクリックします。

    「ワークフローの選択」ページのスクリーンショット。 "Rust" ワークフローの [Configure] ボタンがオレンジ色の枠線で強調表示されています。

  7. 必要に応じてワークフローを編集します。 たとえば、Rust のバージョンを変更します。

  8. [変更をコミットする] をクリックします。

rust.yml ワークフロー ファイルがリポジトリの .github/workflows ディレクトリに追加されます。

Rust のバージョンを指定する

GitHub ホステッド ランナーには、Rust ツールチェーンの最新バージョンが含まれています。 rustup を使って、ランナーにインストールされているバージョンの確認、バージョンのオーバーライド、さまざまなツールチェーンのインストールを行うことができます。 詳細については、rustup ブックを参照してください。

この例では、Rust の夜間ビルドを使い、バージョンを報告するようにランナー環境を設定するために使用できる手順を示します。

YAML
      - name: Temporarily modify the rust toolchain version
        run: rustup override set nightly
      - name: Output rust version for educational purposes
        run: rustup --version

依存関係のキャッシング

[Cache] アクションを使って、依存関係をキャッシュおよび復元できます。 この例では、リポジトリに Cargo.lock ファイルが含まれていることを前提としています。

YAML
      - name: Cache
      - uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

カスタム要件がある場合、またはキャッシュをより細かく制御する必要がある場合は、cache アクションの他の構成オプションについて確認することをお勧めします。 詳しくは、「依存関係をキャッシュしてワークフローのスピードを上げる」をご覧ください。

コードのビルドとテスト

ローカルで使うのと同じコマンドを、コードのビルドとテストに使えます。 このワークフローの例では、ジョブで cargo buildcargo test を使う方法を示します。

YAML
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        BUILD_TARGET: [release] # refers to a cargo profile
    outputs:
      release_built: ${{ steps.set-output.outputs.release_built }}
    steps:
      - uses: actions/checkout@v4
      - name: Build binaries in "${{ matrix.BUILD_TARGET }}" mode
        run: cargo build --profile ${{ matrix.BUILD_TARGET }}
      - name: Run tests in "${{ matrix.BUILD_TARGET }}" mode
        run: cargo test --profile ${{ matrix.BUILD_TARGET }}

この例で使われる release キーワードは、cargo プロフィールに対応します。 Cargo.toml ファイルで定義した任意のプロフィールを使用できます。

パッケージまたはライブラリを crates.io に公開する

コードをビルドしてテストするワークフローを設定したら、シークレットを使って crates.io にログインし、パッケージを公開できます。

YAML
      - name: Login into crates.io
        run: cargo login ${{ secrets.CRATES_IO }}
      - name: Build binaries in "release" mode
        run: cargo build -r
      - name: "Package for crates.io"
        run: cargo package # publishes a package as a tarball
      - name: "Publish to crates.io"
        run: cargo publish # publishes your crate as a library that can be added as a dependency

クレートのビルドとパッケージ化のときにエラーが発生した場合は、マニフェスト Cargo.toml ファイル内のメタデータをチェックします。「The Manifest Format」(マニフェストの形式) を参照してください。 Cargo.lock ファイルもチェックすることをお勧めします。「Cargo.toml vs Cargo.lock」(Cargo.toml と Cargo.lock) を参照してください。

成果物としてのワークフローのデータのパッケージ化

ワークフローが完了したら、結果の成果物を分析のためにアップロードすることや、別のワークフローで使うことができます。 これらのステップ例をワークフローに追加して、別のワークフローで使うアプリケーションをアップロードできます。

YAML
      - name: Upload release artifact
        uses: actions/upload-artifact@v4
        with:
          name: <my-app>
          path: target/${{ matrix.BUILD_TARGET }}/<my-app>

アップロードされた成果物を別のジョブで使うには、リポジトリに対する適切なアクセス許可をワークフローに付与する必要があります。「自動トークン認証」を参照してください。 これらのステップ例を実行して、前のワークフローで作成したアプリをダウンロードし、それを GitHub で公開できます。

YAML
      - uses: actions/checkout@v4
      - name: Download release artifact
        uses: actions/download-artifact@v4
        with:
          name: <my-app>
          path: ./<my-app>
      - name: Publish built binary to GitHub releases
      - run: |
          gh release create --generate-notes ./<my-app>/<my-project>#<my-app>