{"meta":{"title":"Rust のビルドとテスト","intro":"Rust プロジェクトのビルドとテストのための継続的インテグレーション (CI) ワークフローを作成する方法について説明します。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/actions","title":"GitHub Actions"},{"href":"/ja/actions/tutorials","title":"チュートリアル"},{"href":"/ja/actions/tutorials/build-and-test-code","title":"コードのビルドとテスト"},{"href":"/ja/actions/tutorials/build-and-test-code/rust","title":"Rust"}],"documentType":"article"},"body":"# Rust のビルドとテスト\n\nRust プロジェクトのビルドとテストのための継続的インテグレーション (CI) ワークフローを作成する方法について説明します。\n\n## はじめに\n\nこのガイドでは、Rust パッケージのビルド、テスト、公開の方法について説明します。\n\nGitHub ホステッド ランナーにはプレインストールされたソフトウェアのあるツール キャッシュがあり、Rust 用の依存関係が含まれています。 最新のソフトウェアの完全な一覧と、プレインストールされたバージョンの Rust については、「[GitHub ホステッド ランナー](/ja/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#preinstalled-software)」を参照してください。\n\n## 前提条件\n\nYAMLの構文と、GitHub ActionsでのYAMLの使われ方に馴染んでいる必要があります。 詳しくは、「[GitHub Actions　のワークフロー構文](/ja/actions/using-workflows/workflow-syntax-for-github-actions)」をご覧ください。\n\nRust 言語の基本を理解しておくことをお勧めします。 詳細については、「[Rust の概要](https://www.rust-lang.org/learn)」を参照してください。\n\n## Rust ワークフロー テンプレートを使用する\n\nすぐに開始するには、リポジトリの `.github/workflows` ディレクトリにワークフロー テンプレートを追加します。\n\nGitHub には、ほとんどの基本的な Rust プロジェクトに使用できる Rust ワークフロー テンプレートが用意されています。 このガイドの以降のセクションでは、このワークフロー テンプレートをカスタマイズする方法の例を示します。\n\n1. GitHub で、リポジトリのメイン ページに移動します。\n\n2. リポジトリ名の下にある **\\[<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]** をクリックします。\n\n   ![\"github/docs\" リポジトリのタブのスクリーンショット。 \\[アクション\\] タブがオレンジ色の枠線で強調表示されています。](/assets/images/help/repository/actions-tab-global-nav-update.png)\n\n3. ワークフローが既にリポジトリ内にある場合は、 **\\[新しいワークフロー]** をクリックします。\n\n4. \\[ワークフローの選択] ページには、推奨されるワークフロー テンプレートの選択が表示されます。 「Rust」を検索します。\n\n5. ```\n          **[継続的インテグレーション]** をクリックし、ワークフローの選択肢をフィルター処理します。\n   ```\n\n6. \"「Rust - by GitHub Actions」ワークフローで**Configure**をクリックします。\"\n\n   ![「ワークフローの選択」ページのスクリーンショット。 \"Rust\" ワークフローの \\[Configure\\] ボタンがオレンジ色の枠線で強調表示されています。](/assets/images/help/actions/starter-workflow-rust.png)\n\n7. 必要に応じてワークフローを編集します。 たとえば、Rust のバージョンを変更します。\n\n8. ```\n          **[Commit changes]** をクリックします。\n   ```\n\n`rust.yml` ワークフロー ファイルが使用中リポジトリの `.github/workflows` ディレクトリに追加されます。\n\n## Rust のバージョンを指定する\n\nGitHub ホステッド ランナーには、Rust ツールチェーンの最新バージョンが含まれています。 rustup を使って、ランナーにインストールされているバージョンの確認、バージョンのオーバーライド、さまざまなツールチェーンのインストールを行うことができます。 詳細については、[rustup ブック](https://rust-lang.github.io/rustup/)を参照してください。\n\nこの例では、Rust の夜間ビルドを使い、バージョンを報告するようにランナー環境を設定するために使用できる手順を示します。\n\n```yaml copy\n      - name: Temporarily modify the rust toolchain version\n        run: rustup override set nightly\n      - name: Output rust version for educational purposes\n        run: rustup --version\n```\n\n### 依存関係のキャッシング\n\n\\[Cache] アクションを使って、依存関係をキャッシュおよび復元できます。 この例では、リポジトリに `Cargo.lock` ファイルが含まれていることを前提としています。\n\n```yaml copy\n      - name: Cache\n        uses: actions/cache@v4\n        with:\n          path: |\n            ~/.cargo/registry\n            ~/.cargo/git\n            target\n          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}\n```\n\nカスタム要件がある場合、またはキャッシュをより細かく制御する必要がある場合は、[`cache` アクション](https://github.com/marketplace/actions/cache)の他の構成オプションについて確認することをお勧めします。 詳しくは、「[依存関係キャッシュのリファレンス](/ja/actions/using-workflows/caching-dependencies-to-speed-up-workflows)」をご覧ください。\n\n## コードのビルドとテスト\n\nローカルで使うのと同じコマンドを、コードのビルドとテストに使えます。 このワークフローの例では、ジョブで `cargo build` と `cargo test` を使う方法を示します。\n\n```yaml copy\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        BUILD_TARGET: [release] # refers to a cargo profile\n    outputs:\n      release_built: ${{ steps.set-output.outputs.release_built }}\n    steps:\n      - uses: actions/checkout@v6\n      - name: Build binaries in \"${{ matrix.BUILD_TARGET }}\" mode\n        run: cargo build --profile ${{ matrix.BUILD_TARGET }}\n      - name: Run tests in \"${{ matrix.BUILD_TARGET }}\" mode\n        run: cargo test --profile ${{ matrix.BUILD_TARGET }}\n```\n\nこの例で使われる `release` キーワードは、cargo プロフィールに対応します。\n[profile](https://doc.rust-lang.org/cargo/reference/profiles.html) は`Cargo.toml`ファイルで定義した任意のプロファイルを使用できます。\n\n## パッケージまたはライブラリを crates.io に公開する\n\nコードをビルドしてテストするワークフローを設定したら、シークレットを使って [crates.io](https://crates.io/) にログインし、パッケージを公開できます。\n\n```yaml copy\n      - name: Login into crates.io\n        run: cargo login ${{ secrets.CRATES_IO }}\n      - name: Build binaries in \"release\" mode\n        run: cargo build -r\n      - name: \"Package for crates.io\"\n        run: cargo package # publishes a package as a tarball\n      - name: \"Publish to crates.io\"\n        run: cargo publish # publishes your crate as a library that can be added as a dependency\n```\n\nクレートのビルドとパッケージ化のときにエラーが発生した場合は、マニフェスト `Cargo.toml` ファイル内のメタデータをチェックします。「[The Manifest Format](https://doc.rust-lang.org/cargo/reference/manifest.html)」(マニフェストの形式) を参照してください。\n`Cargo.lock` ファイルもチェックすることをお勧めします。「[Cargo.toml vs Cargo.lock](https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html)」(Cargo.toml と Cargo.lock) を参照してください。\n\n## 成果物としてのワークフローのデータのパッケージ化\n\nワークフローが完了したら、結果の成果物を分析のためにアップロードすることや、別のワークフローで使うことができます。 これらのステップ例をワークフローに追加して、別のワークフローで使うアプリケーションをアップロードできます。\n\n```yaml copy\n      - name: Upload release artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: <my-app>\n          path: target/${{ matrix.BUILD_TARGET }}/<my-app>\n```\n\nアップロードされた成果物を別のジョブで使うには、リポジトリに対する適切なアクセス許可をワークフローに付与する必要があります。「[ワークフローでの認証に GITHUB\\_TOKEN を使用する](/ja/actions/security-for-github-actions/security-guides/automatic-token-authentication)」を参照してください。 これらのステップ例を実行して、前のワークフローで作成したアプリをダウンロードし、それを GitHub で公開できます。\n\n```yaml copy\n      - uses: actions/checkout@v6\n      - name: Download release artifact\n        uses: actions/download-artifact@v5\n        with:\n          name: <my-app>\n          path: ./<my-app>\n      - name: Publish built binary to GitHub releases\n      - run: |\n          gh release create --generate-notes ./<my-app>/<my-project>#<my-app>\n```"}