Overview
このガイドでは、独自の CI/CD システムからエージェントを構築して配置する方法を学習できます。 Atlas Agent Engine GitHub Webhookパイプラインの代わりにこのアプローチを使用できます。
ドロップダウン、GitHub アクション、GitHub CI、Jenkens など、 ヘッダー付きで HTTPSリクエストを送信できる CI/CD システムから配置できます。
Atlas Agent Engine では、構築と配置にベンダー固有の統合や agentengine CLI は必要ありません。パイプラインは、プロジェクトを対象とするAPIキーを認証情報として使用して、CLI と同じビルドと配置のシーケンスを実装します。
Tip
CLI からエージェントをビルドして配置するには、「 エージェント イメージのビルド 」および「 ビルドの配置 」を参照してください。
ゲートウェイ ホスト
このガイドのほとんどのエンドポイントは、次の形式でプロジェクトとワークスペースをスコープが設定されています。
https://<gateway-host>/api/v1/projects/<project-id>/workspaces/<workspace-id>/...
<gateway-host> を環境のホストに置き換えます。次の表は、各環境のゲートウェイ ホストを示しています。
environment | ゲートウェイ ホスト |
|---|---|
開発 |
|
QA |
|
本番環境 |
|
始める前に
パイプラインはエージェントソースをアーカイブとしてアップロードします。これには、ソースタイプが archive のワークスペースが必要です。 GitHub に接続されたワークスペースは、409 UNSUPPORTED_SOURCE_TYPE エラーでシーケンスの最初の呼び出しを拒否します。アップロードされたアーカイブではなく、プッシュによって、そのワークスペースのビルドがトリガーされます。
アーカイブソース ワークスペースを作成するには、エージェントのディレクトリから次のコマンドを実行します。
agentengine init --org-id <org-id> --project-id <project-id>
agentengine initコマンドは新しいワークスペースを登録し、ローカル開発ツールを足場します。このガイド内のすべてのエンドポイントのパスに出力するワークスペースID を使用します。このコマンドの詳細については、「 エージェントの登録 」を参照してください。
エージェントがすでに GitHub に接続されているワークスペースを持っている場合は、それを移行する必要はありません。次のオプションがあります。
そのワークスペースに Webhookパイプラインを引き続き使用します。
同じエージェントに対して 2 つ目のアーカイブソース ワークスペースを作成し、パイプラインから対象とします。両方のワークスペースを同時に維持できます。
パイプライン認証情報を設定する
このガイドのすべてのリクエスト(アーカイブのアップロードを除く)は、プロジェクト スコープのAPIキーを使用して認証します。各リクエストの Authorization ヘッダーに、次の形式でキーを含めます。
Authorization: Bearer <api-key>
<api-key> プレースホルダーをAPIキーに置き換えます。 APIキーはベアラー トークンであるため、別の認証情報と交換することはありません。
APIキーを作成するには、次のコマンドを実行します。
agentengine api-key create --project-id <project-id> --description "CI pipeline" --expires-in 90
--expires-inキーの有効期間を指定するには、 フラグを使用します。 CI/CD システムで長時間認証情報を回避するには、定義したスケジュールでキーをローテーションします。このコマンドとそのフラグについて詳しくは、 「 APIキーとサービス アカウントの管理 」を参照してください。
重要
コマンドはプレーンテキストキーを 1 回だけ表示します。再度取得することはできません。キーを紛失した場合は、取り消して新しいキーを作成してください。
ドロップダウン シークレットや GitHub アクションリポジトリシークレットなど、キーを CI/CD システムにシークレットとして保存します。パイプラインファイルのインラインでキーを書き込んだり、ソース管理にコミットしたりしないでください。
パイプライン認証情報のローテーション
Atlas Agent Engine はAPIキーを自動的にローテーションせず、既存のキーを更新するコマンドはありません。パイプラインが使用するキーをローテーションするには、新しいキーを作成し、 CI/CD システム内のシークレットを更新します。新しいキーが動作することを確認した後、古いキーを取り消します。
切り替え中は両方のキーをアクティブにしておきます。それ以外の場合、パイプラインには取り消しから更新までの有効なキーがありません。
サンプル パイプライン
CI/CD システムに関係なく、パイプラインは次の形状をとります。 curl と jq を使用してすべてのステップを実装できます。
check out your repository -> archive your agent directory -> POST builds/archive-init (save build_id and upload_url) -> PUT upload_url (the archive) -> POST builds/<build-id>/start -> GET builds/<build-id> (until the status is terminal) -> POST deployments (with build_id)
構築と配置のシーケンス
ビルドと配置のシーケンスには、次の手順が含まれます。
エージェントソースのチェックアウトとアーカイブ
ビルド アーカイブの初期化
エージェントソースのアップロード
ビルドの開始
ビルド状態のポーリング
ビルドの配置
このセクションでは、パイプラインで各リクエストを実装する方法を学習できます。
エージェントソースをチェックアウトしてアーカイブします。
ビルドするコミットまたはブランチをチェックアウトし、エージェントディレクトリの tar.gz アーカイブを作成します。 Atlas Agent Engine はアップロードしたアーカイブを正確にビルドするため、このステップはビルドに含まれる内容を決定します。
次の例では、tar コマンドを使用して agent.tar.gz という名前のアーカイブを作成します。この例では、.venv、__pycache__、.agentengine ディレクトリや .envファイルなどのローカル開発アーティファクトはアーカイブから除外されています。
tar --exclude='.venv' --exclude='__pycache__' \ --exclude='.agentengine' --exclude='.env' \ -czf agent.tar.gz -C <agent-directory> .
ビルド アーカイブを初期化します。
次のコマンドを実行中前に、 CI/CDジョブでこれらの環境変数を設定します。
export PROJECT_ID="<project-id>" export WORKSPACE_ID="<workspace-id>" export GATEWAY_HOST="agentengine-qa.mongodb.com" export API_KEY="$CI_API_KEY" export COMMIT_SHA="<commit-sha>"
Atlas Agent EngineプロジェクトのプロジェクトIDを使用します。 agentengine init によって返されたワークスペースIDを使用します。上記表に記載されているように、環境のホストに GATEWAY_HOST を設定します。 APIキーを CI / CD システムのシークレット ストアに保存し、CI_API_KEY として公開します。 git_info.commit_sha で渡すコミットに COMMIT_SHA を設定します。
ビルドレコードを作成し、ソース アップロード用の署名付きURLを取得するには、次の curl コマンドを実行中て builds/archive-init エンドポイントに POSTリクエストを送信します。
curl -s -X POST \ "https://$GATEWAY_HOST/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/builds/archive-init" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "label": "my-ci-build-123", "git_info": { "commit_sha": "<commit-sha>", "branch": "<branch-name>", "dirty": false }, "build_target": { "subdirectory": "" }, "auto_deploy": false }'
リクエスト本文のフィールドはすべてオプションです。ビルドを再現可能にするには、常に git_info.commit_shaプロパティを渡します。指定しない場合、Atlas エージェント エンジンは結果のイメージを sha-<commit-sha> ではなく build-<random-id> にタグ付けします。
ビルドが自分自身を成功させ、最後のステップをスキップするには、auto_deploy を true に設定します。
リクエストが成功すると、エンドポイントは次のような 201 Created 応答を返します。
{ "build_id": "bld_01ABC...", "upload_url": "https://<presigned-s3-url>", "upload_expires_at": "2026-01-01T00:05:00Z", "source_type": "archive" }
エージェントソースをアップロードします。
エージェントディレクトリをアップロードするには、次の curl コマンドを実行中して、前のステップから返された upload_url 値に、アーカイブを tar.gzファイルとして含む PUTリクエストを送信します。
curl -s -X PUT \ --upload-file agent.tar.gz \ -H "Content-Type: application/gzip" \ "$UPLOAD_URL"
このリクエストでは Authorization ヘッダーを送信しないでください。署名付きURL は認証情報であり、archive-init によって返される upload_expires_at 値で指定された時点で期限切れになります。アップロードURL が使用前に期限切れになった場合は、archive-init を再度呼び出して新しいアップロードURLを取得します。
アップロードが成功すると、エンドポイントは 200 OK 応答を返します。
ビルドを開始します。
アップロードが到達したことを確認し、ビルドジョブをキューにするには、 本文を指定せずに POSTリクエストをbuilds/<build-id>/start エンドポイントに送信し、次の curl コマンドを実行中て応答を保存します。
RESPONSE=$(curl -s -X POST \ "https://$GATEWAY_HOST/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/builds/$BUILD_ID/start" \ -H "Authorization: Bearer $API_KEY") echo "$RESPONSE"
リクエストが成功すると、エンドポイントは次のような 202 Accepted 応答を返します。
{ "build_id": "bld_01ABC...", "status": "accepted" }
同じコミットのビルドがすでに実行中の 場合、このエンドポイントは 409 BUILD_ALREADY_ACTIVE エラーを返します。エラーは一時的な障害ではなく、重複ビルド 保護です。
使用可能な場合、レスポンスには detailsオブジェクト内のアクティブなビルドのIDとステータスが含まれます。
{ "success": false, "code": "BUILD_ALREADY_ACTIVE", "details": { "existing_build_id": "bld_01ABC...", "existing_status": "in_progress" } }
BUILD_ID を details.existing_build_id の値に設定し、別のビルド アーカイブを初期化する代わりにそのビルドをポーリングします。
BUILD_ID=$(printf '%s' "$RESPONSE" | jq -r '.details.existing_build_id // empty')
レスポンスに existing_build_id が含まれていない場合は、ワークスペース ビルドを一覧表示して、同じコミットのアクティブなビルドを選択します。
BUILD_ID=$(curl -s \ "https://$GATEWAY_HOST/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/builds?limit=100" \ -H "Authorization: Bearer $API_KEY" | jq -r --arg commit "$COMMIT_SHA" ' .builds[] | select(.commit_sha == $commit) | select( .status == "queued" or .status == "in_progress" or .status == "waiting" ) | .build_id' | head -n 1)
ビルド ステータスをポーリングします。
ビルドが完了するのを待つには、ビルドがターミナルステータスに達するまで定期的に builds/<build-id> エンドポイントをポーリングします。次の例では5 秒ごとにポーリングし、30 分後にパイプラインを失敗させるため、queued または waiting 状態でビルドが停止した場合、CI/CDジョブを無期限に実行中続けることができなくなります。
TIMEOUT_SECONDS=1800 INTERVAL_SECONDS=5 ELAPSED=0 while true; do STATUS=$(curl -s \ "https://$GATEWAY_HOST/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/builds/$BUILD_ID" \ -H "Authorization: Bearer $API_KEY" \ | jq -r '.status') if [ "$STATUS" = "succeeded" ]; then break elif [ "$STATUS" = "failed" ] || [ "$STATUS" = "cancelled" ]; then echo "Build $BUILD_ID ended with status: $STATUS" >&2 exit 1 elif [ "$ELAPSED" -ge "$TIMEOUT_SECONDS" ]; then echo "Timed out after ${TIMEOUT_SECONDS}s waiting for build $BUILD_ID" >&2 exit 1 fi sleep "$INTERVAL_SECONDS" ELAPSED=$((ELAPSED + INTERVAL_SECONDS)) done
ビルドが succeeded に達すると、ループは終了し、パイプラインは次のステップに進みます。 failed または cancelled に達したとき、またはタイムアウトが経過すると、例はゼロ以外のステータスで終了するため、パイプラインは失敗します。 API呼び出しに対するビルド期間と CI/CD システムの許容度に一致するように TIMEOUT_SECONDS と INTERVAL_SECONDS を調整します。
ビルドの進行中、エンドポイントは次のような応答を返します。
{ "build_id": "bld_01ABC...", "status": "in_progress", "executor_type": "vm", "image_uri": null, "lockfile_mode": null, "error_message": null }
以下の表では、status 値について説明しています。
ステータス | 説明 |
|---|---|
| ビルドが開始されるのを待っています。ポーリングを続行します。 |
| ビルドは を実行中です。ポーリングを続行します。 |
| 現在、別のビルドがワークスペース ビルド スロットを保持しています。ポーリングを続行します。 |
| ビルドが完了し、 |
| ビルドは完了しませんでした。 |
| ユーザーまたは Atlas Agent エンジンによってビルドがキャンセルされました。 |
lockfile_modeフィールドは、Atlas Agent Engine がコミットされたロックファイルを尊重したかどうかを報告します。詳細については、「 依存関係の管理 」を参照してください。
ビルドを配置します。
ビルドによって生成されたイメージを配置するには、次の curl コマンドを実行中て deployments エンドポイントに POSTリクエストを送信します。
curl -s -X POST \ "https://$GATEWAY_HOST/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/deployments" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "build_id": "'"$BUILD_ID"'" }'
build_idフィールドは任意です。省略すると、Atlas Agent Engine はワークスペースに最新の成功したビルドを配置します。
リクエストが成功すると、エンドポイントは次のような 202 Accepted 応答を返します。
{ "deployment_id": "deploy-abc123" }
応答は、Atlas Agent Engine が配置を受け入れたことを確認します。配置が正しく実行中いることを確認するには、次の例に示すように、deployments/current エンドポイントをポーリングします。
curl -s \ "https://$GATEWAY_HOST/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/deployments/current" \ -H "Authorization: Bearer $API_KEY"
エンドポイントは、ステータス、配置で実行される各コンポーネントの準備状況、配置の全体的な健全性など、ワークスペースのアクティブな配置を返します。次の応答は、スクリプト化されたチェックに必要なフィールドに削除されます。
{ "deployment_id": "deploy-abc123", "status": "successful", "components": [ { "name": "agent", "available": true, "replicas": 1, "ready_replicas": 1 } ], "health": { "available": true, "checked_at": "2026-01-01T00:10:00Z" } }
正常な配置では、status は successful で、components 配列のすべてのエントリには available が true に設定され、ready_replicas は replicas に等しく、かつ health オブジェクトの availableフィールドはは true です。
プラットフォームで Git_info を使用する方法
git_infoオブジェクトには、すでにチェックアウトしたソースを説明するメタデータが保存されています。これは、Atlas Agent Engine に構築内容を指示しません。アーカイブ シーケンスはリポジトリを複製したり、チェックアウトしたりすることはなく、GitHub に接続することはありません。 Atlas Agent Engine は、アップロードしたアーカイブを正確にビルドします。
ビルドするコミットまたはブランチの選択は、ビルド アーカイブを初期化する前に、パイプライン内で完全に行われます。パイプラインはターゲット参照をチェックアウトし、その 作業ディレクトリをアーカイブし、commit_sha と branch を渡して結果のビルドにラベルを付けます。これらの値は、次の影響を与えます。
commit_shaは、イメージ タグを決定し、ビルド開始リクエストが適用する重複ビルド 保護を有効にします。branchは 表示用に記録されています。
依存関係の管理
uv.lockファイルをコミットすると、Atlas Agent Engine はそのロックされた依存関係セットを完全にインストールし、依存関係を再解決しません。ビルド レスポンスでは、lockfile_mode が honored として報告されています。ロックファイルが古くなっているか、尊重できない場合、別のバージョンを暗黙的にインストールするのではなく、アクション可能な error_message 値でビルドは失敗します。この障害を解決するには、ローカルで uv lock を実行し、更新されたロックファイル をコミットして、再度ビルドします。
ロックファイルをコミットしない場合、Atlas Agent Engine はすべてのビルドの依存関係を解決し、lockfile_mode を re-resolved として報告します。この動作はエラーではありません。
注意
ロックファイルの制限
Atlas Agent Engine は、VM 最適化された実行プログラム ビルドのコミットされたロックファイルをまだ尊重しません。これらのビルドでは、コミットされたロックファイルに関係なく、常に依存関係を再解決します。この制限がビルドに適用されるかどうかを確認するには、ビルド ステータス レスポンスの executor_typeフィールドを調べます。 vm の値は、VM 最適化された実行プログラムのビルドを示します。 container の値はコンテナ実行プログラムを示します。
SDK パッケージを宣言しないでください
次のパッケージを含む、Atlas Agent Engine SDK パッケージを pyproject.tomlファイルに依存関係としてリスト しないでください 。
agentengine-langgraphagentengine-corerunner-sharedagentengine-memory
これらのパッケージはパッケージインデックスに公開されていません。 1 つの を宣言すると、uv lock は not found in the package registry エラーで失敗します。 Atlas Agent Engine では、pyproject.tomlファイルでどのように宣言されているかに関係なく、常にこれらのパッケージが事前に構築されたウィザードとして別のステップでエージェントの環境にインストールされます。エージェントは、宣言せずに実行時にこれらをインポートできます。エージェント独自の依存関係のみを宣言します。
トラブルシューティング
次の表では、 独自のパイプラインからビルドおよび配置するときに発生する可能性のあるエラーについて説明します。
エラー | 考えられる原因 |
|---|---|
| ワークスペースはアーカイブ ソースではなく、GitHub に接続されています。アーカイブ ソース ワークスペースを作成します。 |
| このコミットのビルドはすでに実行中です。エラー応答の |
| APIキーを作成したアカウントには、プロジェクトに対する十分な権限がありません。配置管理特権を持つアカウントからキーを作成します。 |
| APIキーのプロジェクトは、リクエストパス内のプロジェクトIDと一致しません。 |
| 参照されたビルドが成功しないか、存在しません。 |
| このワークスペースでは配置はすでに進行中です。 |
| 署名付きURL の有効期限が切れました。新しいURLを取得するには、 |
ビルドの失敗により古くなった | ローカルで |
|
|
次のステップ
エージェントを配置すると、そのパフォーマンスとアクティビティを監視できます。エージェント を監視する方法については、「 監視ガイド 」を参照してください。