Saltar al contenido principal

Capitulo 11: Automatizacion y CI/CD

Claude Code no esta limitado a sesiones interactivas en tu terminal. Su verdadero potencial de escala aparece cuando lo integras en pipelines de automatizacion: revision automatica de PRs, validacion en CI, tareas programadas y agentes personalizados. Este capitulo te muestra como llevar Claude Code de tu terminal a tu infraestructura.


11.1 Claude Code en GitHub Actions​

Integracion nativa con @claude​

Claude Code ofrece una integracion directa con GitHub. Al mencionarlo con @claude en un comentario de pull request, el agente puede:

  • Analizar diffs del PR y sugerir mejoras.
  • Ejecutar tests y reportar resultados.
  • Dejar comentarios inline en lineas especificas del codigo.
  • Crear commits con correcciones directamente en la rama.
  • Responder preguntas sobre el codigo del PR.

Configuracion basica​

La integracion requiere instalar la GitHub App de Claude Code en tu repositorio y configurar un workflow en .github/workflows/.

Workflow completo de code review automatizado​

name: Claude Code Review

on:
pull_request:
types: [opened, synchronize, reopened]
issue_comment:
types: [created]

permissions:
contents: read
pull-requests: write
issues: write

jobs:
claude-review:
runs-on: ubuntu-latest
if: |
(github.event_name == 'pull_request') ||
(github.event_name == 'issue_comment' &&
contains(github.event.comment.body, '@claude'))
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Claude Code
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
model: "claude-sonnet-4-20250514"
prompt: |
Revisa este pull request. Enfocate en:
1. Errores logicos o bugs potenciales
2. Problemas de seguridad
3. Oportunidades de simplificacion
4. Adherencia a las convenciones del proyecto
Deja comentarios inline en las lineas relevantes.

Uso con claude -p y token de GitHub​

Para integraciones mas personalizadas, puedes invocar Claude Code directamente con el flag -p (modo no interactivo):

jobs:
custom-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code

- name: Run analysis
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
claude -p "Analiza los cambios en este PR y genera un resumen \
de los riesgos potenciales" \
--output-format json > review-results.json
Secretos y seguridad

Nunca expongas tu ANTHROPIC_API_KEY en el codigo. Usa siempre GitHub Secrets para almacenar credenciales. Configura permisos minimos en el token de GitHub.


11.2 Modo no interactivo​

El flag -p: Claude Code para scripts​

El modo no interactivo transforma Claude Code de una herramienta conversacional a un componente de pipeline. Con claude -p "prompt", envias una instruccion y recibes la respuesta sin interaccion humana.

# Uso basico
claude -p "Explica la funcion main en src/app.py"

# Piping de entrada
cat errors.log | claude -p "Analiza estos errores y sugiere correcciones"

# Combinando con herramientas Unix
git diff HEAD~3 | claude -p "Resume estos cambios para el changelog"

Referencia de flags​

FlagDescripcionEjemplo
-p "prompt"Ejecuta en modo no interactivoclaude -p "analiza este codigo"
--output-formatFormato de salida: plain, json, stream-json--output-format json
--verboseMuestra informacion detallada de ejecucionclaude -p "..." --verbose
--max-turns NLimita el numero de turnos del agente--max-turns 5
--allowedToolsRestringe las herramientas disponibles--allowedTools Read,Grep
--bareSolo muestra el resultado, sin metadatosclaude -p "..." --bare
--modelSelecciona el modelo a usar--model claude-haiku-4-20250506

Formatos de salida​

# Texto plano (default) - ideal para lectura humana
claude -p "Resume este archivo" --output-format plain

# JSON estructurado - ideal para procesamiento programatico
claude -p "Lista los TODO del proyecto" --output-format json

# JSON en streaming - ideal para pipelines en tiempo real
claude -p "Analiza el proyecto" --output-format stream-json

Scripts completos para CI​

Ejemplo: Validacion de commits antes de merge

#!/bin/bash
# validate-pr.sh - Script de validacion para CI

set -euo pipefail

echo "=== Validando PR ==="

# Analizar cambios
ANALYSIS=$(git diff origin/main...HEAD | claude -p \
"Analiza este diff. Responde SOLO con un JSON:
{\"risk\": \"low|medium|high\", \"issues\": [\"...\"], \"summary\": \"...\"}" \
--output-format json --max-turns 3 --bare)

RISK=$(echo "$ANALYSIS" | jq -r '.result // .risk')

if [ "$RISK" = "high" ]; then
echo "RIESGO ALTO detectado. Requiere revision manual."
exit 1
fi

echo "Validacion completada: riesgo $RISK"

Ejemplo: Generacion automatica de documentacion

#!/bin/bash
# generate-docs.sh

claude -p "Lee src/ y genera documentacion JSDoc para todas las \
funciones publicas que no la tengan. Edita los archivos directamente." \
--max-turns 20 --allowedTools Read,Write,Edit,Grep,Glob

11.3 Routines​

Las Routines son tareas programadas que Claude Code ejecuta de forma autonoma, sin necesidad de intervencion manual. Existen dos modalidades principales.

(a) Routines en infraestructura Anthropic​

Estas routines se ejecutan en los servidores de Anthropic. No necesitan tu maquina encendida.

Caracteristicas:

  • Se activan por cron, eventos de GitHub (push, PR, issue) o API.
  • Se crean desde la web, Claude Desktop o CLI con /schedule.
  • Tienen acceso a los repositorios que configures.
  • Los resultados se envian por notificacion o se publican en GitHub.

Crear una routine desde CLI:

> /schedule

Claude: Que tarea quieres programar?

> Revisa todos los PRs abiertos cada dia a las 9:00 AM.
Para cada PR, deja un comentario con un resumen de los
cambios y cualquier problema potencial.

Claude: Routine creada:
- Nombre: "Daily PR Review"
- Cron: 0 9 * * * (cada dia a las 9:00)
- Repositorio: mi-org/mi-proyecto

Ejemplos de routines utiles:

RoutineTriggerAccion
Revision diaria de PRsCron (9:00 AM)Analiza PRs abiertos, deja comentarios
Triage de issuesEvento: issue creadoClasifica, etiqueta, asigna
Resumen semanalCron (lunes 8:00)Genera reporte de actividad del repo
Validacion de seguridadEvento: push a mainEscanea dependencias y codigo

(b) Tareas programadas locales (Desktop)​

Desde Claude Desktop, puedes programar tareas que se ejecutan en tu maquina local:

  • Requieren que la maquina este encendida.
  • Acceden a archivos y herramientas locales.
  • Utiles para tareas que dependen del entorno local.

/loop: polling rapido en sesion​

Para tareas que necesitan monitoreo continuo dentro de una sesion, usa /loop:

> /loop 5m /status

Claude: Ejecutare /status cada 5 minutos.
[09:00] Status: 3 tests pasando, 0 fallando
[09:05] Status: 3 tests pasando, 0 fallando
[09:10] Status: 2 tests pasando, 1 fallando ⚠

/loop es ideal para:

  • Monitorear un deploy en progreso.
  • Vigilar resultados de tests mientras desarrollas.
  • Verificar que un servicio sigue respondiendo.
/loop vs Routines

/loop funciona dentro de una sesion activa y se detiene cuando cierras Claude Code. Las Routines operan de forma independiente y persisten aunque cierres todo.


11.4 Claude Agent SDK​

Claude Code como libreria​

El Claude Agent SDK permite usar Claude Code como componente programatico dentro de tus propias aplicaciones. Disponible para Python y TypeScript, transforma al agente en una libreria que puedes importar y controlar.

Primitivas del SDK​

PrimitivaDescripcion
Query loopCiclo principal de interaccion prompt-respuesta
AgentsAgentes configurables con instrucciones, modelo y herramientas
ToolsHerramientas disponibles para el agente (built-in + custom)
MCP ServersServidores MCP que el agente puede usar
SkillsSkills reutilizables definidas como archivos
PermissionsControl granular de lo que el agente puede hacer

Ejemplo en Python​

from claude_code_sdk import Agent, AgentConfig, query

import asyncio

async def main():
# Configurar el agente
config = AgentConfig(
model="claude-sonnet-4-20250514",
max_turns=10,
allowed_tools=["Read", "Grep", "Glob"],
system_prompt="Eres un agente de analisis de codigo. "
"Analiza el proyecto y reporta problemas.",
)

# Ejecutar una consulta
async with Agent(config) as agent:
response = await agent.query(
"Encuentra todos los archivos con TODO comments "
"y genera un reporte priorizado"
)

for message in response.messages:
print(message.content)

asyncio.run(main())

Ejemplo en TypeScript​

import { Agent, AgentConfig } from "@anthropic-ai/claude-code-sdk";

async function main() {
const config: AgentConfig = {
model: "claude-sonnet-4-20250514",
maxTurns: 10,
allowedTools: ["Read", "Grep", "Glob"],
systemPrompt:
"Eres un agente de analisis de codigo. " +
"Analiza el proyecto y reporta problemas.",
};

const agent = new Agent(config);

const response = await agent.query(
"Encuentra funciones sin tests unitarios " +
"y genera los tests faltantes"
);

for (const message of response.messages) {
console.log(message.content);
}
}

main();

Casos de uso del SDK​

  • Bots de Slack/Discord que responden preguntas sobre el codigo.
  • Dashboards internos que generan reportes de calidad.
  • Herramientas CLI personalizadas especificas de tu organizacion.
  • Pipelines de procesamiento que incluyen analisis de codigo como paso.
Instalacion del SDK
# Python
pip install claude-code-sdk

# TypeScript / Node.js
npm install @anthropic-ai/claude-code-sdk

11.5 Hooks en CI​

Los hooks de Claude Code son especialmente valiosos en entornos CI/CD, donde necesitas control estricto sobre lo que el agente puede hacer. Se configuran en .claude/settings.json (compartido con el equipo) o en la configuracion del pipeline.

PreToolUse: bloquear comandos peligrosos​

En CI, debes evitar que Claude ejecute comandos destructivos. PreToolUse intercepta antes de que se ejecute una herramienta:

{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 scripts/ci-guard.py \"$TOOL_INPUT\""
}
]
}
]
}
}

Script de guardia para CI:

#!/usr/bin/env python3
# scripts/ci-guard.py
import sys, json

BLOCKED_PATTERNS = [
"rm -rf /",
"git push --force",
"DROP TABLE",
"kubectl delete",
"docker system prune",
"shutdown",
"reboot",
]

def check_command(tool_input: str) -> None:
try:
data = json.loads(tool_input)
command = data.get("command", "").lower()
except (json.JSONDecodeError, AttributeError):
command = tool_input.lower()

for pattern in BLOCKED_PATTERNS:
if pattern.lower() in command:
# Exit code != 0 bloquea la ejecucion
print(json.dumps({
"decision": "block",
"reason": f"Comando bloqueado en CI: {pattern}"
}))
sys.exit(2)

if __name__ == "__main__":
check_command(sys.argv[1] if len(sys.argv) > 1 else "")

UserPromptSubmit: inyeccion de contexto CI​

Inyecta automaticamente informacion del entorno CI en cada prompt:

{
"hooks": {
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash -c 'echo \"{\\\"additionalContext\\\": \\\"CI Environment: branch=$GITHUB_REF_NAME commit=$GITHUB_SHA runner=$RUNNER_OS pipeline=$GITHUB_WORKFLOW\\\"}\"'"
}
]
}
]
}
}

Con esta configuracion, Claude recibe automaticamente el contexto del pipeline en cada interaccion: la rama actual, el SHA del commit, el sistema operativo del runner y el nombre del workflow.

PostToolUse: audit logging​

Registra cada accion del agente para auditoria y compliance:

{
"hooks": {
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash -c 'echo \"$(date -u +%Y-%m-%dT%H:%M:%SZ) | tool=$TOOL_NAME | session=$CLAUDE_SESSION_ID\" >> /var/log/claude-audit.log'"
}
]
}
]
}
}

Configuracion completa para CI​

Un ejemplo integrado que combina las tres estrategias:

{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python3 scripts/ci-guard.py \"$TOOL_INPUT\""
}
]
},
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "bash -c '[[ ! \"$TOOL_INPUT\" =~ \\.env ]] || (echo \"{\\\"decision\\\": \\\"block\\\", \\\"reason\\\": \\\"No se permite escribir archivos .env\\\"}\" && exit 2)'"
}
]
}
],
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash -c 'echo \"{\\\"additionalContext\\\": \\\"CI: branch=$GITHUB_REF_NAME sha=$GITHUB_SHA\\\"}\"'"
}
]
}
],
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash -c 'echo \"$(date -u +%Y-%m-%dT%H:%M:%SZ) | $TOOL_NAME | exit=$TOOL_EXIT_CODE\" >> claude-audit.log'"
}
]
}
]
}
}

Conceptos clave del capitulo​

Resumen
  1. GitHub Actions: Claude Code se integra nativamente con PRs usando @claude o workflows personalizados con claude -p.
  2. Modo no interactivo: El flag -p convierte a Claude Code en un componente de pipeline, con control fino via --output-format, --max-turns y --allowedTools.
  3. Routines: Tareas programadas que se ejecutan sin intervencion, ya sea en infraestructura Anthropic (persistentes) o localmente (requieren maquina encendida).
  4. Agent SDK: Python y TypeScript permiten usar Claude Code como libreria para construir agentes personalizados.
  5. Hooks en CI: PreToolUse bloquea acciones peligrosas, UserPromptSubmit inyecta contexto, y PostToolUse registra acciones para auditoria.

Preguntas de autoevaluacion​

  1. Que flag necesitas para ejecutar Claude Code en un script de CI sin interaccion humana?

  2. Cual es la diferencia entre /loop y una Routine en infraestructura Anthropic?

  3. Si necesitas evitar que Claude ejecute git push --force en CI, que tipo de hook usarias y como lo configurarias?

  4. Que formato de --output-format elegirías para procesar la salida de Claude Code con jq en un script bash?

  5. Nombra tres primitivas del Claude Agent SDK y describe brevemente para que sirve cada una.


Laboratorio​

Practica los conceptos de este capitulo en el Laboratorio L11.1, donde configuraras un workflow de GitHub Actions con revision automatizada y hooks de seguridad para CI.