Ir al contenido

Crear una plantilla de pipeline

Las plantillas de pipeline se crean en los ajustes del espacio de trabajo. La entrada Pipelines de la barra lateral del espacio de trabajo es la cola de ejecuciones, no la lista de plantillas: no tiene ninguna acción de «crear plantilla».

Para saber qué significa cada tipo de paso, cada clave de cuerpo y cada campo de configuración, consulta la referencia de pasos de pipeline.

  1. Ve a Ajustes → Espacio de trabajo → Plantillas de pipeline (/workspaces/<workspace-id>/settings/pipelines).
  2. Haz clic en Nueva plantilla.

No hay ningún diálogo de id. El editor se abre de inmediato en un esqueleto predefinido llamado Nuevo pipeline, con un id asignado automáticamente (pipeline_1, luego pipeline_2, …). Haz clic en el título de la cabecera para cambiarle el nombre.

El lienzo no está vacío: un nodo de entrada Trigger, un nodo de agente de prompt con la etiqueta Step y un centinela terminal que da por terminada la ejecución. El centinela no se dibuja. El editor reconecta ese terminal oculto a cada sumidero alcanzable, de modo que el trabajo que conectes después de Step sigue ejecutándose.

La barra lateral Biblioteca de nodos ocupa de forma permanente la izquierda del editor. Fíltrala con el cuadro Buscar nodos y arrastra una entrada al lienzo: el nodo aterriza donde lo sueltes, sin ninguna conexión entrante.

Nodo de la paleta Tipo de paso Qué hace
Bash script listen Ejecuta un script de shell con sustitución de {{state}}; no se despacha ningún agente
Open conversation listen Abre el único espacio visible de la ejecución y su checkout; los nodos de agente se unen a esta sala
Clone PR branch listen Descubre la rama head de la PR con gh pr view y la clona en el directorio de la ejecución
Post PR comment listen Publica los hallazgos consolidados en la PR como comentario de revisión de GitHub
Reviewer (prompt) listen Despacha un agente revisor especializado; se suspende hasta que el agente envía su resultado
Consolidate (join) join Espera a varias ramas anteriores y luego pide a un agente que consolide sus salidas
Custom prompt listen Nodo genérico guiado por prompt, enrutado a través del cuerpo promptAgent
Post to space listen Envía un mensaje a un espacio de mensajería
Condition / switch (router) router Ramifica el flujo según un valor de estado
If file exists (router) router Enruta "true" cuando existe una ruta bajo el clon; si no, "false"
Any file exists (OR router) router Enruta "true" cuando existe cualquiera de las rutas indicadas
All conditions (AND router) router Enruta "true" solo cuando existen todas las rutas indicadas
Team dispatch listen Despacha un equipo completo y se suspende hasta que termina
Approval gate listen Se detiene a la espera de una decisión de aprobación
For each (map) forEach Renderiza un prompt por elemento y luego despacha el agente una vez con esos prompts unidos
Call sub-pipeline listen Ejecuta otra plantilla como paso anidado
Clean up worktrees listen Elimina worktrees aislados obsoletos; determinista, no se despacha ningún agente

La biblioteca los agrupa en Flujo y lógica, Revisión de PR, Agentes, Mensajería y Código. No hay ningún grupo Demo.

Cada nodo de trabajo tiene un puerto de salida circular en su borde derecho. Arrastra desde ese puerto hasta otro nodo para conectarlos. Los disparadores iniciales funcionan igual: cada uno tiene su propio puerto, así que una conexión desde Programación no sale también de Ejecución manual. Haz clic en Añadir paso (+) justo después de un nodo para insertar un tipo a continuación. Pasa el cursor por el punto medio de una arista existente y haz clic en × para desconectarla.

Las conexiones también se editan desde el nodo que las recibe:

  1. Selecciona el nodo posterior. Su panel de configuración se abre a la derecha.
  2. Desplázate hasta Disparadores desde y toca el chip de cada nodo anterior al que este deba escuchar. Si tocas un chip seleccionado, se elimina la conexión.
  3. Si un nodo anterior es un enrutador, bajo los chips aparece un bloque Claves de ruta con un campo Clave de ruta desde <nodo> por cada arista del enrutador. Introduce la clave con la que se activa esa arista: true o false en los enrutadores de existencia de archivos, o el nombre del caso en un conmutador.

Cada nodo disparador es un punto de entrada. Un nodo puede escuchar a varios nodos anteriores (fan-in) y alimentar a varios posteriores (fan-out), y el grafo debe mantenerse acíclico: nada en el editor te impide crear un ciclo, así que revisa tu trabajo.

El centinela terminal queda filtrado fuera del lienzo, así que no se puede seleccionar. El editor lo reconecta a cada sumidero alcanzable cada vez que cambia el grafo, de modo que el trabajo que conectes después del Step predefinido sigue ejecutándose. Un grafo vacío (un disparador sin pasos de trabajo posteriores) incluye el propio disparador para que la ejecución termine de inmediato.

Selecciona un nodo para abrir su panel de configuración. Los campos que aparecen dependen del cuerpo del nodo.

Todos los nodos tienen Etiqueta, Claves de entrada (separadas por comas) (claves de estado que se leen en tiempo de ejecución) y, en Avanzado, Reductor, Tiempo de espera (ms), Reintentos, Continuar si este paso falla y Esquema de salida (JSON). Los nodos listen y join también pueden cambiar su Tipo entre ambos.

Agrega un selector Repositorios a clonar (qué repos del espacio de trabajo se descargan; vacío significa ninguno), un Nombre del espacio y una casilla Abrir una conversación en ella. Con esa casilla activada, un campo Nombre de la conversación da nombre al hilo con el que se abre la sala. Los nodos de agente se unen a esta sala: no abren una propia.

Agrega Agente (qué agente despachar), Plantilla del prompt (usa {{key}} para referenciar entradas o salidas de nodos anteriores) y Clave de salida.

Tiempo de espera (ms) está en milisegundos, no en segundos: 900000 son 15 minutos. Si introduces 900, el paso dispone de 0,9 segundos.

El modo de conversación con el que se ejecuta un nodo de agente de prompt no tiene ningún campo en el editor del nodo de agente. Viaja en extras['mode'] (chat, plan o review) en el nodo Open conversation que creó la sala (valor predeterminado review). Si lo estableces en un paso de agente, se ignora. La clave se compara de forma exacta: cualquier otra grafía se ignora en silencio.

Agrega Script bash. No hay campos de directorio de trabajo ni de entorno, porque ninguno de los dos es configurable:

  • Todos los pasos bash de una ejecución comparten el cwd <cc_root>/pipelines/<runId>/.
  • GITHUB_TOKEN se inyecta desde el almacén de credenciales, así que gh y git clone https://x-access-token:$GITHUB_TOKEN@… funcionan sin ninguna configuración.
  • El script se lanza como el ejecutable literal bash, así que bash debe estar en el PATH del host del servidor. Es algo que hay que tener en cuenta en Windows.

Un enrutador evalúa una condición y devuelve una clave de ruta; el motor solo activa la arista posterior cuya clave de ruta coincide y marca las demás ramas como omitidas.

Al seleccionar un enrutador, el editor de condiciones sustituye el campo Clave de salida. Elige uno de sus cuatro modos:

  • Archivo(s) existe(n) — alguno — enruta "true" cuando existe alguna de las rutas indicadas.
  • Archivos existen — todos — enruta "true" solo cuando existen todas las rutas indicadas.
  • Comparación — compara un valor de estado con un literal.
  • Conmutador — enruta según el valor de una clave de estado, con un caso predeterminado.

Después, establece las claves de ruta correspondientes en las aristas salientes (consulta Conectar nodos entre sí).

El cuerpo admite grupos booleanos and / or / not, pero no se pueden crear desde este formulario: requieren un árbol de predicados escrito a mano en extras.predicate. El vocabulario completo de predicados y operadores está en la referencia de pasos de pipeline.

No tiene configuración propia: espera a todos sus pasos anteriores.

La puerta despacha el agente aprobador a una conversación oculta con el prompt de la puerta y se suspende. El aprobador te pide la decisión en la conversación y la envía con submit_output como { "decision": "approved" | "rejected", "reason": "..." }. La decisión queda en la clave de salida (valor predeterminado approval_decision), de modo que un enrutador de tipo conmutador posterior puede ramificar a partir de ella.

Establece Agente como el aprobador y Plantilla del prompt como la pregunta de la puerta. La puerta se resuelve mediante submit_output como { "decision": "approved" | "rejected", "reason": "..." }. Los nodos Reviewer (prompt) envían el resultado del mismo modo.

Agrega ID de equipo y Modo de despacho. El selector ofrece exactamente dos modos:

  • allParallel — una tarea por miembro; se suspende hasta que todas terminan.
  • manager — despacha al líder, que delega.

Cualquier otro valor almacenado se comporta como allParallel. Establece Reductor en append para reunir el resultado de cada miembro en una lista bajo la clave de salida.

For each itera sobre la clave de estado items de forma predeterminada (extras.iterableKey / extras.itemKey en el nodo). Renderiza su prompt una vez por elemento ({{item}} de forma predeterminada) y despacha el agente una sola vez con esos prompts concatenados. Una colección vacía termina de inmediato con una lista vacía. No es un despacho paralelo por elemento.

Call sub-pipeline se suspende hasta que la ejecución hija alcanza un estado terminal y luego fusiona el estado final del hijo bajo la clave de salida (valor predeterminado subflow_result). Apúntalo a un hijo con extras.templateId. Una plantilla no puede llamarse a sí misma; un hijo fallido o cancelado hace fallar el paso padre, que entonces aplica la política de reintentos y de continuar en caso de fallo de ese paso.

Declarar entradas y permitir ejecuciones manuales

Sección titulada «Declarar entradas y permitir ejecuciones manuales»

Ambas cosas se encuentran detrás de Ejecución manual, en la cabecera del editor.

  1. Haz clic en Ejecución manual.
  2. Activa Permitir ejecución manual. Este interruptor se guarda de inmediato: crea (o elimina) la fila de disparador manual que hace aparecer la plantilla en el lanzador de ejecuciones.
  3. Establece Ejecuciones paralelas máx. si quieres poner un límite (déjalo vacío para ilimitado). Los inicios adicionales esperan en estado queued hasta que se libera un hueco.
  4. Haz clic en Añadir entrada por cada campo de formulario que deba recoger una ejecución manual:
Campo Descripción
Clave Clave de estado bajo la que se guarda el valor; referénciala como {{key}}
Etiqueta Etiqueta mostrada (por defecto, la clave)
Tipo Texto, Texto multilínea, Número, Interruptor, Selección, Repositorio
Opciones (separadas por comas) Opciones separadas por comas, solo para Selección
Valor predeterminado Valor previamente rellenado
Marcador de posición Texto de sugerencia dentro del campo vacío
Texto de ayuda Texto de ayuda bajo el campo
Obligatorio Si el formulario de ejecución se bloquea con un valor vacío

Una entrada de tipo Repositorio muestra un selector sobre los repos del espacio de trabajo y rellena repo_id, repo_local_path, repo_full_name y —cuando el repo tiene un remoto de GitHub— repo_owner y repo_name en la carga útil de la ejecución.

  1. Haz clic en Guardar en el diálogo. Las ediciones de las entradas se incorporan al borrador y se conservan cuando guardas la plantilla.
  1. Haz clic en Guardar en la cabecera del editor. Hasta que lo hagas, la cabecera muestra «Cambios sin guardar».
  2. Vuelve a Ajustes → Espacio de trabajo → Plantillas de pipeline y comprueba que el interruptor de la fila de la plantilla está activado. El motor se niega a iniciar una plantilla desactivada, y una plantilla desactivada nunca aparece en el lanzador de ejecuciones.
  3. Para iniciarla automáticamente, arrastra un disparador desde la biblioteca de nodos al lienzo; consulta Configurar disparadores de pipeline.