> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# サンドボックスでプルリクエストのチェックを実行する

> GitHub Actions から CoreWeave のサンドボックスでリポジトリのテストを実行します。任意で、参考情報としての AI レビューも追加できます。

オーケストレーションと結果のレポートは GitHub Actions に任せ、プルリクエストのテストは新しく作成した CoreWeave のサンドボックスで実行します。このチュートリアルは、すでに GitHub Actions を使用している開発者を対象としています。リポジトリのコードと依存関係は、継続的インテグレーション (CI) のランナーの外部で実行されます。

まずサンプルをローカルで実行し、次に公開リポジトリを特定のコミットでテストします。最後に、プルリクエストにテスト結果を報告するワークフローをインストールします。[GitHub Actions レシピ](https://github.com/coreweave/cwsandbox-recipes/tree/main/recipes/github-actions)には、スクリプト、ワークフロー、サンプルプロジェクト、テスト一式が含まれています。このレシピは別のリポジトリにコピーして、単独で実行することもできます。

オーケストレーター (お使いのマシンまたは CI ランナー) は CoreWeave の認証情報を保持し、実行ごとにサーバーレスのサンドボックスを 1 つ作成します。サンドボックスは公開ソースコードを取得し、テストコマンドを実行します。任意の AI レビューを有効にすると、オーケストレーターから Anthropic に差分とテスト出力が送信されます。このレシピでは、APIキーをサンドボックスに渡すことはありません。

<h2 id="prerequisites">
  前提条件
</h2>

開始する前に、以下を準備してください。

* `SANDBOX_USER` アイデンティティとアクセス管理 (IAM) action が付与された CoreWeave API アクセストークン。[API アクセストークンを管理する](/security/authn-authz/manage-api-access-tokens)を参照してください。
* サーバーレスサンドボックスへのアクセス権と、CPU 1 基およびメモリ 2 GiB 分のキャパシティ。[はじめに](/ja/products/sandboxes/get-started)を参照してください。
* [Git](https://git-scm.com/downloads)、[`uv`](https://docs.astral.sh/uv/getting-started/installation/)、および Python 3.11 以降。Python は `uv` を使用してインストールできます。
* ワークフローと Actions シークレットを追加できる公開 GitHub リポジトリ。
* 参考情報としての AI レビューに使用する [Anthropic APIキー](https://console.anthropic.com/settings/keys) (オプション) 。

1 回の実行につき、CPU 1 基とメモリ 2 GiB を最大 15 分間リクエストします。スクリプトは終了時にサンドボックスを停止します。AI レビューを行う場合は、Anthropic API の使用量も消費します。

このレシピでは、CoreWeave API アクセストークンを明示的に使用します。その他の認証方法については、[認証情報を選択して取得する](/ja/products/sandboxes/placement#choose-and-get-credentials)を参照してください。

<h2 id="run-the-sample">
  サンプルを実行する
</h2>

リポジトリを接続する前に、バンドルされているサンプルを使用して、認証、リモート実行、クリーンアップが正しく動作することを検証します。

1. recipes リポジトリをクローンし、ロックされた依存関係をインストールします。

   ```bash theme={"system"}
   git clone https://github.com/coreweave/cwsandbox-recipes.git
   cd cwsandbox-recipes/recipes/github-actions
   uv sync --locked
   ```

2. CoreWeave トークンを設定します。`[API-ACCESS-TOKEN]` は、トークンのシークレット値に置き換えてください。

   ```bash theme={"system"}
   export CWSANDBOX_API_KEY="[API-ACCESS-TOKEN]"
   ```

3. サンプルを実行し、結果を確認します。

   ```bash theme={"system"}
   uv run --locked python run.py
   cat outputs/result.json
   ```

   ターミナルに `Status: passed` と表示されれば成功です。結果ファイルには `returncode: 0` と `stopped: true` が記録されます。このサンプルでは、加算が正しく行われることを確認し、さらにオーケストレーター側の CoreWeave、GitHub、Anthropic のキーがサンドボックス環境に含まれていないことを検証します。

4. 失敗時の動作を検証します。

   ```bash theme={"system"}
   uv run --locked python run.py \
     --command 'python -c "raise SystemExit(7)"' \
     --output outputs/failure
   ```

   このコマンドは意図的にステータス `1` で終了します。結果ファイルには `status: failed`、テストの `returncode: 7`、`stopped: true` が記録されます。

<h2 id="test-a-repository-commit">
  リポジトリのコミットをテストする
</h2>

レシピディレクトリで、固定の MarkupSafe コミットを取得して依存関係をインストールし、サンドボックス内で `pytest` を実行します。

```bash theme={"system"}
uv run --locked python run.py \
  --repo pallets/markupsafe \
  --head b2e4d9c7687be25695fffbe93a37622302b24fb1 \
  --command 'pip install . pytest==8.4.2 && python -m pytest -q' \
  --timeout 300 \
  --output outputs/repository
```

`Status: passed` と表示されることを確認してください。ご自身のプロジェクトで使用する場合は、リポジトリ、完全なコミットハッシュ、テストコマンドを置き換えてください。依存関係のインストールが失敗した場合にチェックも失敗させるには、インストールコマンドとテストコマンドを `&&` でつなぎます。

このレシピでは `python:3.12-bookworm` を使用します。プロジェクトで別のツールチェーンが必要な場合は、`run.py` ファイル内の `container_image` 設定を変更してください。

このレシピは head コミット自体をチェックアウトします。GitHub が生成する合成マージコミットはテストしません。オーケストレーションスクリプトはローカルマシンまたは CI ランナー上で実行され、リポジトリのチェックアウトとテストコマンドはサンドボックス内で実行されます。

<h3 id="optional-add-an-ai-review">
  オプション: AI レビューを追加する
</h3>

オーケストレーターの環境で `ANTHROPIC_API_KEY` 環境変数を設定し、リポジトリ用のコマンドに `--base [BASE-COMMIT-SHA] --review` を追加します。`[BASE-COMMIT-SHA]` は、同じリポジトリ内のベースリビジョンを示す 40 文字の完全なコミットハッシュに置き換えてください。そのまま実行できる完全な例は、レシピの README に記載されています。

スクリプトは両方のリビジョンを取得し、`git diff BASE...HEAD` を計算します。差分、標準出力、標準エラーは、それぞれ最大 24,000 文字まで Anthropic に送信されます。モデルはツールを使用できません。スクリプトは応答を、人間がレビューするための参考テキストとして保存します。レビューリクエストが失敗した場合は、`review_error` フィールドにエラーの種類が記録されます。この場合もテスト結果は変わりません。

<h2 id="add-the-github-actions-workflow">
  GitHub Actions ワークフローを追加する
</h2>

このワークフローは、信頼できるリポジトリコントリビューターを対象に使用してください。ワークフロー定義はプルリクエストのマージ ref から取得されます。そのため、同一リポジトリからのプルリクエストでは、ワークフロー、テストコマンド、チェックアウト ref、シークレットの使用方法を変更できます。ベースブランチのファイルをチェックアウトしていても、プルリクエストによるこれらの変更は可能です。

`pull_request` トリガーは変更しないでください。`pull_request_target` に変更する場合は、別途セキュリティ設計が必要です。

プルリクエストでこれらのチェックを実行するには、パブリックリポジトリにレシピをインストールします。

1. パブリックリポジトリのルートで、ランタイムファイルとワークフローをコピーします。`[RECIPES-CHECKOUT]` は、recipes のクローンへのパスに置き換えてください。

   ```bash theme={"system"}
   recipe_dir="[RECIPES-CHECKOUT]/recipes/github-actions"
   mkdir -p ci/sandbox .github/workflows
   cp "$recipe_dir/run.py" "$recipe_dir/pyproject.toml" \
     "$recipe_dir/uv.lock" "$recipe_dir/.gitignore" ci/sandbox/
   cp "$recipe_dir/workflow.yml" .github/workflows/sandbox-ci.yml
   ```

   project のテストランナーに収集されないよう、レシピの `tests/` および `sample/` ディレクトリは recipes のクローン内に残しておいてください。コピーしたファイルはリポジトリモードに対応しています。バンドルされたサンプルは recipes のクローンから実行してください。
2. `.github/workflows/sandbox-ci.yml` にコピーした [`workflow.yml` ファイル](https://github.com/coreweave/cwsandbox-recipes/blob/main/recipes/github-actions/workflow.yml)の内容を確認します。
3. ワークフローの `--command` に、project の依存関係をインストールしてテストを実行するコマンドを設定します。
4. CoreWeave トークンを値とする `CWSANDBOX_API_KEY` という名前の Actions リポジトリシークレットを追加します。[Using secrets in GitHub Actions](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets) を参照してください。
5. ワークフローと `ci/sandbox/` のファイルを対象のベースブランチにマージします。ワークフローはオーケストレーションをプルリクエストのベースコミットから読み込むため、プルリクエストをテストする前に、これらのファイルがベースコミットに存在している必要があります。
6. 同一リポジトリのプルリクエストを作成または更新します。

**Sandbox CI** ワークフローは、`opened`、`synchronize`、`reopened` イベントで実行されます。提供されているワークフローは、`run.py` ファイルとその依存関係ファイルをベースコミットからチェックアウトし、プルリクエストの head コミットハッシュをサンドボックスに渡します。また、`contents: read` 権限をリクエストし、チェックアウト認証情報の永続化を無効にします。

提供されているワークフローは、フォークからのプルリクエスト、Dependabot のプルリクエスト、および非公開リポジトリをスキップします。GitHub は、フォークや Dependabot のプルリクエストで実行されるワークフローにリポジトリシークレットを提供しません。スキップされたジョブは必須ステータスチェックを満たしたものとみなされるため、このチェックを必須にしても、スキップされたプルリクエストではテストが強制されません。[Handling skipped but required checks](https://docs.github.com/en/pull-requests/how-tos/merge-and-close-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks) を参照してください。

Actions で AI レビューを行う場合 (省略可能) は、レシピの手順に従って Anthropic のシークレットをテストステップに追加し、`--review` を有効にしてください。

<h2 id="inspect-the-results">
  結果を確認する
</h2>

ジョブの概要を確認するには、**Sandbox CI** チェックを開きます。`result.json` ファイルと `summary.md` ファイルを入手するには、**`sandbox-ci-results`** アーティファクトをダウンロードします。このワークフローは、テストが失敗した場合でも結果をアップロードし、アーティファクトを 7 日間保持します。

結果ファイルには、テスト対象のコミット、サンドボックス ID、テストの戻りコード、取得した出力、クリーンアップの結果が含まれます。スクリプトは標準出力と標準エラーそれぞれの末尾 24,000 文字を保持するため、末尾に出力される失敗メッセージも確認できます。また、概要に含まれる返されたテキストはエスケープされ、テスト出力が CI ランナーのコンソールに直接出力されることはありません。失敗時には、ジョブの概要とアーティファクトを案内する固定テキストのエラーアノテーションが表示されます。

テストの実行が成功した場合、終了コードは `0` です。テストの失敗、セットアップエラー、タイムアウト、クリーンアップエラーの場合、終了コードは `1` になります。AI レビューはあくまで参考情報であり、この結果を変更することはありません。テストスイートに合格しても、送信されたコードのセキュリティが評価されたことにはなりません。

`--timeout` オプションには 1～300 秒を指定でき、デフォルトは 120 秒です。これとは別に、サンドボックスには 900 秒の有効期間の制限があります。

このレシピはコマンド出力を切り詰める前にバッファに格納するため、出力量の少ない小規模なリポジトリやテストスイートで使用してください。タイムアウトした場合、スクリプトは部分的なコマンド出力を含めずに `status: error` と `error: SandboxTimeoutError` を記録します。セットアップのタイムアウトやその他の制限については、レシピの README を参照してください。

<h2 id="clean-up">
  クリーンアップ
</h2>

スクリプトは、実行が成功した場合も失敗した場合も、`finally` ブロック内で `stop(missing_ok=True)` を呼び出します。クリーンアップ前にオーケストレーターが終了した場合でも、最大ライフタイムによって実行時間は制限されます。このレシピでは、スナップショット、ボリューム、サンドボックスのランナーは作成されません。

結果に `cleanup_error` フィールドが含まれている場合は、保存済みのサンドボックス ID と、実行時と同じ CoreWeave の認証情報を使用し、レシピのクリーンアップコマンドでサンドボックスを削除してください。その他のパターンについては、[クリーンアップのパターン](/ja/products/sandboxes/client/guides/cleanup-patterns)を参照してください。

必要な結果ファイルを保管したうえで、ローカルの `outputs/` ディレクトリを削除してください。プルリクエストでサンドボックスを作成する必要がなくなった場合は、ワークフローを削除するか無効にしてください。
