Overview
En esta guía, aprenderá a crear e implementar un agente desde su propio sistema de CI/CD. Puede usar este método en lugar de la canalización de webhooks de GitHub de Atlas Agent Engine.
Puedes realizar la implementación desde cualquier sistema CI/CD que pueda enviar una solicitud HTTPS con una cabecera, incluidos Drone, GitHub Actions, GitLab CI y Jenkins.
El motor de agentes de Atlas no requiere una integración específica del proveedor ni la interfaz de línea de comandos agentengine para su compilación e implementación. Su canalización implementa la misma secuencia de compilación e implementación que la interfaz de línea de comandos, utilizando una clave API con ámbito de proyecto como credencial.
Tip
Para crear e implementar un agente desde la interfaz de línea de comandos (CLI), consulte la sección "Crear la imagen del agente e implementar la compilación".
Hosts de puerta de enlace
La mayoría de los puntos finales en esta guía están definidos por proyecto y espacio de trabajo, en el siguiente formato:
https://<gateway-host>/api/v1/projects/<project-id>/workspaces/<workspace-id>/...
Reemplace <gateway-host> con el host de su entorno. La siguiente tabla enumera los hosts de puerta de enlace para cada entorno:
Entorno | Host de puerta de enlace |
|---|---|
Desarrollo |
|
QA |
|
Producción |
|
Antes de comenzar
Tu canalización carga el código fuente del agente como un archivo, lo que requiere un espacio de trabajo cuyo tipo de fuente sea archive. Un espacio de trabajo conectado a GitHub rechaza la primera llamada de la secuencia con un error 409 UNSUPPORTED_SOURCE_TYPE. Un push activa las compilaciones para ese espacio de trabajo, no para un archivo cargado.
Para crear un espacio de trabajo de origen de archivo, ejecute el siguiente comando desde el directorio de su agente:
agentengine init --org-id <org-id> --project-id <project-id>
El comando agentengine init registra un nuevo espacio de trabajo y configura las herramientas de desarrollo local. Utilice el ID del espacio de trabajo que se muestra en la ruta de cada punto final de esta guía. Para obtener más información sobre este comando,consulte Registrar su agente.
Si el agente ya tiene un espacio de trabajo conectado a GitHub, no es necesario migrarlo. Tiene las siguientes opciones:
Continúe utilizando la canalización de webhooks para ese espacio de trabajo.
Cree un segundo espacio de trabajo de origen de archivo para el mismo agente y selecciónelo desde su canalización. Puede mantener ambos espacios de trabajo simultáneamente.
Configurar credenciales de canalización
Cada solicitud en esta guía, excepto la carga de archivos, se autentica mediante una clave API con ámbito de proyecto. Incluya la clave en el encabezado Authorization de cada solicitud, en el siguiente formato:
Authorization: Bearer <api-key>
Sustituye el marcador de posición <api-key> por tu clave API. La clave API es el token de portador, por lo que no necesitas intercambiarla por una credencial aparte.
Para crear una clave API, ejecute el siguiente comando:
agentengine api-key create --project-id <project-id> --description "CI pipeline" --expires-in 90
Puedes usar el indicador --expires-in para especificar la duración de la clave. Para evitar credenciales de larga duración en tu sistema CI/CD, puedes rotar la clave según un calendario que definas. Para obtener más información sobre este comando y sus indicadores, consulta la sección «Administrar claves de API y cuentas de servicio».
Importante
El comando muestra la clave en texto plano solo una vez. No se puede recuperar. Si pierde la clave, revoque la clave y cree una nueva.
Almacena la clave como un secreto en tu sistema CI/CD, como un secreto de Drone o un secreto de repositorio de GitHub Actions. No escribas la clave directamente en un archivo de canalización ni la incluyas en el control de versiones.
Rotar las credenciales de la plataforma
El motor de agentes de Atlas no renueva automáticamente las claves API, y ningún comando renueva una clave existente. Para renovar la clave que utiliza su canalización, cree una nueva clave y actualice el secreto en su sistema CI/CD. Revoque la clave anterior una vez que confirme que la nueva funciona correctamente.
Mantenga ambas claves activas durante el cambio. De lo contrario, su canalización no tendrá una clave válida durante el período comprendido entre la revocación y la actualización.
Ejemplo de canalización
Independientemente de su sistema CI/CD, la canalización tiene la siguiente estructura. Puede implementar cada paso utilizando curl y 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)
Secuencia de compilación e implementación
Una secuencia de compilación y despliegue incluye los siguientes pasos:
Consultar y archivar la fuente de tu agente
Inicializando el archivo de compilación
Cargando el código fuente del agente
Comenzando la construcción
Consultando el estado de la compilación
Despliegue de la compilación
En esta sección, aprenderá cómo implementar cada solicitud en su flujo de trabajo.
Consulta y archiva la fuente de tu agente.
Seleccione la confirmación o rama que desea compilar y, a continuación, cree un archivo tar.gz de su directorio de agente. El motor de agentes de Atlas compila exactamente el archivo que usted carga, por lo que este paso determina el contenido de la compilación.
El siguiente ejemplo utiliza el comando tar para crear un archivo llamado agent.tar.gz. El ejemplo excluye los artefactos de desarrollo local del archivo, incluidos los directorios .venv, __pycache__ y .agentengine y el archivo .env.
tar --exclude='.venv' --exclude='__pycache__' \ --exclude='.agentengine' --exclude='.env' \ -czf agent.tar.gz -C <agent-directory> .
Inicializa el archivo de compilación.
Antes de ejecutar los siguientes comandos, configure estas variables de entorno en su trabajo de 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>"
Utilice el ID del proyecto de su Atlas Agent Engine. Utilice el ID del espacio de trabajo devuelto por agentengine init. Establezca GATEWAY_HOST en el host de su entorno, como se indica en la tabla anterior. Almacene la clave API en el almacén de secretos de su sistema CI/CD y expóngala como CI_API_KEY. Establezca COMMIT_SHA en la confirmación que pase en git_info.commit_sha.
Para crear un registro de compilación y obtener una URL pre-firmada para la carga de código fuente, envíe una solicitud POST al punto final builds/archive-init ejecutando el siguiente comando curl:
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 }'
Todos los campos del cuerpo de la solicitud son opcionales. Para que la compilación sea reproducible, siempre incluya la propiedad git_info.commit_sha. De lo contrario, el motor del agente Atlas etiquetará la imagen resultante como build-<random-id> en lugar de sha-<commit-sha>.
Para que la compilación se implemente correctamente y se omita el paso final, establezca auto_deploy en true.
Si la solicitud tiene éxito, el punto final devuelve una respuesta 201 Created similar a la siguiente:
{ "build_id": "bld_01ABC...", "upload_url": "https://<presigned-s3-url>", "upload_expires_at": "2026-01-01T00:05:00Z", "source_type": "archive" }
Sube el código fuente del agente.
Para cargar el directorio de su agente, envíe una solicitud PUT que incluya el archivo como un archivo tar.gz al valor upload_url devuelto en el paso anterior ejecutando el siguiente comando curl:
curl -s -X PUT \ --upload-file agent.tar.gz \ -H "Content-Type: application/gzip" \ "$UPLOAD_URL"
No envíe una cabecera Authorization en esta solicitud. La URL prefirmada es la credencial y caduca en el momento indicado por el valor upload_expires_at devuelto por archive-init. Si la URL de carga caduca antes de que la utilice, vuelva a llamar a archive-init para obtener una nueva URL de carga.
Si la carga se realiza correctamente, el punto final devuelve una respuesta 200 OK.
Iniciar la construcción.
Para confirmar que la carga llegó y poner en cola el trabajo de compilación, envíe una solicitud POST sin cuerpo al punto final builds/<build-id>/start y guarde la respuesta ejecutando el siguiente comando 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"
Si la solicitud tiene éxito, el punto final devuelve una respuesta 202 Accepted similar a la siguiente:
{ "build_id": "bld_01ABC...", "status": "accepted" }
Si ya se está ejecutando una compilación para la misma confirmación, este punto final devuelve un error 409 BUILD_ALREADY_ACTIVE. El error es una advertencia de compilación duplicada, no un fallo transitorio.
Cuando esté disponible, la respuesta incluye el ID y el estado de la compilación activa en el objeto details:
{ "success": false, "code": "BUILD_ALREADY_ACTIVE", "details": { "existing_build_id": "bld_01ABC...", "existing_status": "in_progress" } }
Establezca BUILD_ID al valor details.existing_build_id y consulte esa compilación en lugar de inicializar otro archivo de compilación:
BUILD_ID=$(printf '%s' "$RESPONSE" | jq -r '.details.existing_build_id // empty')
Si la respuesta no incluye existing_build_id, enumere las compilaciones del espacio de trabajo y seleccione la compilación activa para la misma confirmación:
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)
Consultar el estado de la compilación.
Para esperar a que finalice la compilación, sondee el punto final builds/<build-id> a intervalos regulares hasta que la compilación alcance un estado terminal. El siguiente ejemplo sondea cada cinco segundos y detiene la canalización después de 30 minutos, de modo que una compilación atascada en el estado queued o waiting no pueda mantener su trabajo de CI/CD ejecutándose indefinidamente:
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
Cuando la compilación llega a succeeded, el bucle finaliza y la canalización continúa con el siguiente paso. Cuando llega a failed o cancelled, o cuando se agota el tiempo de espera, el ejemplo finaliza con un estado distinto de cero, por lo que la canalización falla. Ajuste TIMEOUT_SECONDS y INTERVAL_SECONDS para que coincidan con la duración de la compilación y la tolerancia de su sistema CI/CD a las llamadas a la API.
Mientras se realiza la compilación, el punto final devuelve una respuesta similar a la siguiente:
{ "build_id": "bld_01ABC...", "status": "in_progress", "executor_type": "vm", "image_uri": null, "lockfile_mode": null, "error_message": null }
La siguiente tabla describe los valores status:
Estado | Descripción |
|---|---|
| La compilación está a la espera de comenzar. Continúe el sondeo. |
| La compilación está en curso. Continúe con el sondeo. |
| Actualmente, otra compilación ocupa el espacio de compilación del espacio de trabajo. Continuar con el sondeo. |
| La compilación ha finalizado y |
| La compilación no se completó. El campo |
| Un usuario o el motor del agente Atlas cancelaron la compilación. |
El campo lockfile_mode indica si el motor del agente Atlas respetó un archivo de bloqueo confirmado. Para obtener más información, consulte Gestionar dependencias.
Despliega la compilación.
Para desplegar la imagen que produjo la compilación, envíe una solicitud POST al punto final deployments ejecutando el siguiente comando curl:
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"'" }'
El campo build_id es opcional. Si lo omite, el motor del agente de Atlas implementará la compilación exitosa más reciente en el espacio de trabajo.
Si la solicitud tiene éxito, el punto final devuelve una respuesta 202 Accepted similar a la siguiente:
{ "deployment_id": "deploy-abc123" }
La respuesta solo confirma que el motor del agente de Atlas aceptó la implementación. Para confirmar que la implementación se está ejecutando correctamente, consulte el punto final deployments/current, como se muestra en el siguiente ejemplo:
curl -s \ "https://$GATEWAY_HOST/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/deployments/current" \ -H "Authorization: Bearer $API_KEY"
El punto final devuelve la implementación activa del espacio de trabajo, incluyendo su estado, la disponibilidad de cada componente que ejecuta la implementación y el estado general de la misma. La siguiente respuesta se recorta a los campos que necesita una comprobación mediante script:
{ "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" } }
En una implementación saludable, status es successful, cada entrada en el array components tiene available establecido en true con ready_replicas igual a replicas, y el campo available del objeto health es true.
Cómo la plataforma utiliza git_info
El objeto git_info almacena metadatos que describen el código fuente que ya has extraído. No le indica al motor del agente de Atlas qué compilar. La secuencia de archivado nunca clona ni extrae un repositorio, ni se comunica con GitHub. El motor del agente de Atlas compila exactamente el archivo que subes.
La selección de la confirmación o rama a compilar se realiza completamente en su canalización, antes de inicializar el archivo de compilación. Su canalización extrae la referencia de destino, archiva ese directorio de trabajo y pasa commit_sha y branch para etiquetar la compilación resultante. Estos valores tienen los siguientes efectos:
commit_shadetermina la etiqueta de la imagen y habilita la protección de compilación duplicada que aplica la solicitud de inicio de compilación.branchSe graba para su visualización.
Gestionar dependencias
Si confirma un archivo uv.lock, el motor del agente Atlas instala exactamente ese conjunto de dependencias bloqueadas y no vuelve a resolver las dependencias. La respuesta de compilación informa lockfile_mode como honored. Si el archivo de bloqueo está desactualizado o no se puede respetar, la compilación falla con un valor error_message que requiere acción, en lugar de instalar silenciosamente versiones diferentes. Para resolver este fallo, ejecute uv lock localmente, confirme el archivo de bloqueo actualizado y vuelva a compilar.
Si no confirma un archivo de bloqueo, el motor del agente de Atlas resuelve las dependencias en cada compilación e informa lockfile_mode como re-resolved. Este comportamiento no es un error.
Nota
Limitación del archivo de bloqueo
El motor del agente Atlas aún no respeta un archivo de bloqueo confirmado para las compilaciones de ejecutores optimizadas para máquinas virtuales. Estas compilaciones siempre vuelven a resolver las dependencias, independientemente de si existe un archivo de bloqueo confirmado. Para comprobar si esta limitación se aplica a su compilación, examine el campo executor_type en la respuesta de estado de la compilación. Un valor de vm indica una compilación de ejecutor optimizada para máquinas virtuales. Un valor de container indica un ejecutor de contenedor.
No declare los paquetes SDK.
No incluyas los paquetes del SDK de Atlas Agent Engine como dependencias en tu archivo pyproject.toml, incluidos los siguientes paquetes:
agentengine-langgraphagentengine-corerunner-sharedagentengine-memory
Estos paquetes no se publican en un índice de paquetes. Declarar uno provoca que uv lock falle con un error not found in the package registry. El motor del agente Atlas siempre instala estos paquetes en el entorno de su agente como ruedas precompiladas en un paso aparte, independientemente de lo que declare su archivo pyproject.toml. Su agente puede importarlos en tiempo de ejecución sin declararlos. Declare solo las dependencias propias de su agente.
Solución de problemas
La siguiente tabla describe los errores que podría encontrar al compilar e implementar desde su propio pipeline:
Error | Causa probable |
|---|---|
| El espacio de trabajo está conectado a GitHub en lugar de ser un archivo fuente. Cree un espacio de trabajo de archivo fuente. |
| Ya se está ejecutando una compilación para esta confirmación. Utilice |
| La cuenta que creó la clave API no tiene permisos suficientes en el proyecto. Cree la clave desde una cuenta con permisos de administración de despliegue. |
| El proyecto de la clave API no coincide con el ID del proyecto en la ruta de la solicitud. |
| La compilación a la que se hace referencia no se ha realizado correctamente o no existe. |
| Ya se está llevando a cabo el despliegue de este espacio de trabajo. |
| La URL prefirmada ha caducado. Vuelva a llamar a |
Un error de compilación que informa de un archivo | Ejecuta |
| Elimina el paquete SDK de las dependencias en tu archivo |
Próximos pasos
Tras implementar el agente, puede supervisar su rendimiento y actividad. Para obtener información sobre cómo supervisar el agente, consulte la guía de monitorización.