# Rust のビルドとテスト

Rust プロジェクトのビルドとテストのための継続的インテグレーション (CI) ワークフローを作成する方法について説明します。

## はじめに

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

GitHub ホステッド ランナーにはプレインストールされたソフトウェアのあるツール キャッシュがあり、Rust 用の依存関係が含まれています。 最新のソフトウェアの完全な一覧と、プレインストールされたバージョンの Rust については、「[GitHub ホステッド ランナー](/ja/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#preinstalled-software)」を参照してください。

## 前提条件

YAMLの構文と、GitHub ActionsでのYAMLの使われ方に馴染んでいる必要があります。 詳しくは、「[GitHub Actions　のワークフロー構文](/ja/actions/using-workflows/workflow-syntax-for-github-actions)」をご覧ください。

Rust 言語の基本を理解しておくことをお勧めします。 詳細については、「[Rust の概要](https://www.rust-lang.org/learn)」を参照してください。

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

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

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

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

2. リポジトリ名の下にある **\[<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-play" aria-label="play" role="img"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg> Actions]** をクリックします。

   !["github/docs" リポジトリのタブのスクリーンショット。 \[アクション\] タブがオレンジ色の枠線で強調表示されています。](/assets/images/help/repository/actions-tab-global-nav-update.png)

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

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

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

6. "「Rust - by GitHub Actions」ワークフローで**Configure**をクリックします。"

   ![「ワークフローの選択」ページのスクリーンショット。 "Rust" ワークフローの \[Configure\] ボタンがオレンジ色の枠線で強調表示されています。](/assets/images/help/actions/starter-workflow-rust.png)

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

8. ```
          **[Commit changes]** をクリックします。
   ```

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

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

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

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

```yaml copy
      - 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 copy
      - name: Cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
```

カスタム要件がある場合、またはキャッシュをより細かく制御する必要がある場合は、[`cache` アクション](https://github.com/marketplace/actions/cache)の他の構成オプションについて確認することをお勧めします。 詳しくは、「[依存関係キャッシュのリファレンス](/ja/actions/using-workflows/caching-dependencies-to-speed-up-workflows)」をご覧ください。

## コードのビルドとテスト

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

```yaml copy
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@v6
      - 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 プロフィールに対応します。
[profile](https://doc.rust-lang.org/cargo/reference/profiles.html) は`Cargo.toml`ファイルで定義した任意のプロファイルを使用できます。

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

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

```yaml copy
      - 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](https://doc.rust-lang.org/cargo/reference/manifest.html)」(マニフェストの形式) を参照してください。
`Cargo.lock` ファイルもチェックすることをお勧めします。「[Cargo.toml vs Cargo.lock](https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html)」(Cargo.toml と Cargo.lock) を参照してください。

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

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

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

アップロードされた成果物を別のジョブで使うには、リポジトリに対する適切なアクセス許可をワークフローに付与する必要があります。「[ワークフローでの認証に GITHUB\_TOKEN を使用する](/ja/actions/security-for-github-actions/security-guides/automatic-token-authentication)」を参照してください。 これらのステップ例を実行して、前のワークフローで作成したアプリをダウンロードし、それを GitHub で公開できます。

```yaml copy
      - uses: actions/checkout@v6
      - name: Download release artifact
        uses: actions/download-artifact@v5
        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>
```