El comando deployment gate de datadog-ci ejecuta la evaluación en un solo comando. Pase un archivo de configuración JSON con la Flag --config:
datadog-ci deployment gate --service transaction-backend --env production --version 1.2.3 --config ./gate-config.json
Ejemplo gate-config.json:
{
"dryRun": false,
"rules": [
{
"type": "monitor",
"name": "Service monitors",
"options": {
"query": "service:transaction-backend env:production",
"duration": 300
}
},
{
"type": "faulty_deployment_detection",
"name": "APM Faulty Deployment Detection",
"options": {
"duration": 900,
"excluded_resources": ["GET /healthcheck"]
}
}
]
}
El comando:
- Envía una solicitud para iniciar la evaluación de Deployment Gate y se bloquea hasta que se complete la evaluación.
- Proporciona un tiempo de espera configurable para cuánto tiempo esperar una evaluación.
- Tiene reintentos automáticos integrados para errores.
- Acepta
--fail-on-error para personalizar el comportamiento ante errores inesperados de Datadog.
El comando deployment gate está disponible en las versiones v3.17.0 y superiores de datadog-ci. La Flag --config requiere la versión v5.19.0 o superior.
Variables de entorno requeridas:
Para obtener opciones de configuración completas y ejemplos de uso, consulte la documentación del comando deployment gate.
Llame a Deployment Gates desde un recurso de Kubernetes de Argo Rollouts creando un AnalysisTemplate o un ClusterAnalysisTemplate. La plantilla ejecuta el comando deployment gate de datadog-ci para interactuar con la API de Deployment Gates.
Utilice la siguiente plantilla como punto de partida:
- Reemplace
<YOUR_DD_SITE> con su nombre del sitio de Datadog (por ejemplo, ). - Defina la clave de API y la clave de aplicación como variables de entorno. El ejemplo utiliza un Kubernetes Secret llamado
datadog con dos valores de datos: api-key y app-key. También puede pasar los valores en texto plano con value en lugar de valueFrom. - Utilice una versión de imagen de datadog-ci que admita la Flag
--config (versión v5.19.0 o superior).
Almacene la configuración de Deployment Gates en un ConfigMap, luego móntela en el trabajo y pase --config a la CLI:
apiVersion: v1
kind: ConfigMap
metadata:
name: gate-config
data:
gate-config.json: |
{
"dryRun": false,
"rules": [
{
"type": "monitor",
"name": "Service monitors",
"options": {
"query": "service:transaction-backend env:production",
"duration": 300
}
},
{
"type": "faulty_deployment_detection",
"name": "APM Faulty Deployment Detection",
"options": {
"duration": 900,
"excluded_resources": ["GET /healthcheck"]
}
}
]
}
---
apiVersion: argoproj.io/v1alpha1
kind: ClusterAnalysisTemplate
metadata:
name: datadog-job-analysis
spec:
args:
- name: service
- name: env
- name: version
metrics:
- name: datadog-job
provider:
job:
spec:
ttlSecondsAfterFinished: 300
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: datadog-check
image: datadog/ci:latest
env:
- name: DD_BETA_COMMANDS_ENABLED
value: "1"
- name: DD_SITE
value: "<YOUR_DD_SITE>"
- name: DD_API_KEY
valueFrom:
secretKeyRef:
name: datadog
key: api-key
- name: DD_APP_KEY
valueFrom:
secretKeyRef:
name: datadog
key: app-key
command: ["/bin/sh", "-c"]
args:
- datadog-ci deployment gate --service {{ args.service }} --env {{ args.env }} --version {{ args.version }} --config /etc/datadog/gate-config.json
volumeMounts:
- name: gate-config
mountPath: /etc/datadog
volumes:
- name: gate-config
configMap:
name: gate-config
- La plantilla de análisis puede recibir argumentos del recurso Rollout (
service, env, version). Para obtener más información, consulte la documentación oficial de Argo Rollouts. ttlSecondsAfterFinished elimina los trabajos finalizados después de 5 minutos.backoffLimit se establece en 0 porque el trabajo no debe reintentarse si la evaluación de Deployment Gate falla.
Después de crear la plantilla de análisis, haga referencia a ella desde la estrategia de Argo Rollouts:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-demo
labels:
tags.datadoghq.com/service: transaction-backend
tags.datadoghq.com/env: dev
spec:
replicas: 5
strategy:
canary:
steps:
...
- analysis:
templates:
- templateName: datadog-job-analysis
clusterScope: true # Only needed for cluster analysis
args:
- name: env
valueFrom:
fieldRef:
fieldPath: metadata.labels['tags.datadoghq.com/env']
- name: service
valueFrom:
fieldRef:
fieldPath: metadata.labels['tags.datadoghq.com/service']
- name: version #Required for APM Faulty Deployment Detection rules
valueFrom:
fieldRef:
fieldPath: metadata.labels['tags.datadoghq.com/version']
- ...
La Datadog Deployment Gate GitHub Action ejecuta la evaluación como parte de un flujo de trabajo. Confirme un archivo de configuración de Deployment Gate en el repositorio y pase su ruta con la entrada config. La entrada config requiere la versión v2.1.0 o superior:
name: Deploy with Datadog Deployment Gate
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Deploy Canary
run: |
echo "Deploying canary release for service:'my-service' in 'production'. Version 1.0.1"
# Your deployment commands here
- name: Evaluate Deployment Gate
uses: DataDog/deployment-gate-github-action@v2.1.0
env:
DD_API_KEY: ${{ secrets.DD_API_KEY }}
DD_APP_KEY: ${{ secrets.DD_APP_KEY }}
with:
service: my-service
env: production
version: 1.0.1
config: .github/gate-config.json
- name: Deploy
run: |
echo "Deployment Gate passed, proceeding with deployment"
# Your deployment commands here
Ejemplo .github/gate-config.json:
{
"dryRun": false,
"rules": [
{
"type": "monitor",
"name": "Service monitors",
"options": {
"query": "service:my-service env:production",
"duration": 300
}
},
{
"type": "faulty_deployment_detection",
"name": "APM Faulty Deployment Detection",
"options": {
"duration": 900,
"excluded_resources": ["GET /healthcheck"]
}
}
]
}
La acción:
- Envía una solicitud para iniciar la evaluación de Deployment Gate y se bloquea hasta que se complete la evaluación.
- Proporciona un tiempo de espera configurable para cuánto tiempo esperar una evaluación.
- Tiene reintentos automáticos integrados para errores.
- Acepta
fail-on-error para personalizar el comportamiento ante errores inesperados de Datadog.
Variables de entorno requeridas:
Para obtener opciones de configuración completas y ejemplos de uso, consulte el DataDog/deployment-gate-github-action repositorio.
Utilice este script como punto de partida. Evalúa una puerta mediante reglas JIT integradas.
Reemplace lo siguiente:
#!/bin/sh
# Configuration
MAX_RETRIES=3
DELAY_SECONDS=5
POLL_INTERVAL_SECONDS=15
MAX_POLL_TIME_SECONDS=10800 # 3 hours
API_URL="https://api.<YOUR_DD_SITE>/api/v2/deployments/gates/evaluation"
API_KEY="<YOUR_API_KEY>"
APP_KEY="<YOUR_APP_KEY>"
PAYLOAD=$(cat <<EOF
{
"data": {
"type": "deployment_gates_evaluation_request",
"attributes": {
"service": "$1",
"env": "$2",
"version": "$3",
"configuration": {
"dry_run": false,
"rules": [
{
"type": "monitor",
"name": "Service monitors",
"options": {
"query": "service:$1 env:$2",
"duration": 300
}
},
{
"type": "faulty_deployment_detection",
"name": "APM Faulty Deployment Detection",
"options": {
"duration": 900,
"excluded_resources": ["GET /healthcheck"]
}
}
]
}
}
}
}
EOF
)
# Step 1: Request evaluation
echo "Requesting evaluation..."
current_attempt=0
while [ $current_attempt -lt $MAX_RETRIES ]; do
current_attempt=$((current_attempt + 1))
RESPONSE=$(curl -s -w "%{http_code}" -o response.txt -X POST "$API_URL" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: $API_KEY" \
-H "DD-APPLICATION-KEY: $APP_KEY" \
-d "$PAYLOAD")
HTTP_CODE=$(echo "$RESPONSE" | tail -c 4)
RESPONSE_BODY=$(cat response.txt)
if [ ${HTTP_CODE} -ge 500 ] && [ ${HTTP_CODE} -le 599 ]; then
echo "Attempt $current_attempt: 5xx Error ($HTTP_CODE). Retrying in $DELAY_SECONDS seconds..."
sleep $DELAY_SECONDS
continue
elif [ ${HTTP_CODE} -ge 400 ] && [ ${HTTP_CODE} -le 499 ]; then
echo "Client error ($HTTP_CODE): $RESPONSE_BODY"
exit 1
fi
EVALUATION_ID=$(echo "$RESPONSE_BODY" | jq -r '.data.attributes.evaluation_id')
if [ "$EVALUATION_ID" = "null" ] || [ -z "$EVALUATION_ID" ]; then
echo "Failed to extract evaluation_id from response: $RESPONSE_BODY"
exit 1
fi
echo "Evaluation started with ID: $EVALUATION_ID"
break
done
if [ $current_attempt -eq $MAX_RETRIES ]; then
echo "All retries exhausted for evaluation request, but treating 5xx errors as success."
exit 0
fi
# Step 2: Poll for results
echo "Polling for results..."
start_time=$(date +%s)
poll_count=0
while true; do
poll_count=$((poll_count + 1))
current_time=$(date +%s)
elapsed_time=$((current_time - start_time))
if [ $elapsed_time -ge $MAX_POLL_TIME_SECONDS ]; then
echo "Evaluation polling timeout after ${MAX_POLL_TIME_SECONDS} seconds"
exit 1
fi
RESPONSE=$(curl -s -w "%{http_code}" -o response.txt -X GET "$API_URL/$EVALUATION_ID" \
-H "DD-API-KEY: $API_KEY" \
-H "DD-APPLICATION-KEY: $APP_KEY")
HTTP_CODE=$(echo "$RESPONSE" | tail -c 4)
RESPONSE_BODY=$(cat response.txt)
if [ ${HTTP_CODE} -eq 404 ]; then
echo "Evaluation not ready yet (404), retrying in $POLL_INTERVAL_SECONDS seconds... (attempt $poll_count, elapsed: ${elapsed_time}s)"
sleep $POLL_INTERVAL_SECONDS
continue
elif [ ${HTTP_CODE} -ge 500 ] && [ ${HTTP_CODE} -le 599 ]; then
echo "Server error ($HTTP_CODE) while polling, retrying in $POLL_INTERVAL_SECONDS seconds... (attempt $poll_count, elapsed: ${elapsed_time}s)"
sleep $POLL_INTERVAL_SECONDS
continue
elif [ ${HTTP_CODE} -ge 400 ] && [ ${HTTP_CODE} -le 499 ]; then
echo "Client error ($HTTP_CODE) while polling: $RESPONSE_BODY"
exit 1
fi
GATE_STATUS=$(echo "$RESPONSE_BODY" | jq -r '.data.attributes.gate_status')
if [ "$GATE_STATUS" = "pass" ]; then
echo "Gate evaluation PASSED"
exit 0
elif [ "$GATE_STATUS" = "fail" ]; then
echo "Gate evaluation FAILED"
exit 1
else
echo "Evaluation still in progress (status: $GATE_STATUS), retrying in $POLL_INTERVAL_SECONDS seconds... (attempt $poll_count, elapsed: ${elapsed_time}s)"
sleep $POLL_INTERVAL_SECONDS
continue
fi
done
El script:
- Recibe tres entradas:
service, environment y version. version es obligatorio si se evalúa una o más reglas de detección de despliegue defectuoso de APM. - Envía una solicitud para iniciar la evaluación y registra el
evaluation_id. Maneja códigos de respuesta HTTP:- 5xx: error del servidor, reintenta con retraso.
- 4xx: error del cliente, la evaluación falla.
- 2xx: evaluación iniciada.
- Consulta el punto de conexión de estado de evaluación con el
evaluation_id hasta que la evaluación se complete:- 5xx: error del servidor, reintenta con retraso.
- 404: evaluación aún no iniciada, reintenta con retraso.
- 4xx (excepto 404): error del cliente, la evaluación falla.
- 2xx: verificación
gate_status y reintente con retraso si no se ha completado.
- Consulta cada 15 segundos hasta que la evaluación se complete o se alcance el tiempo máximo de consulta (10800 segundos = 3 horas por defecto).
- Si se agotan todos los reintentos para la solicitud inicial (respuestas 5xx), el script trata esto como un éxito para ser resiliente ante fallas de la API.
Adapte el script a su caso de uso. Utiliza curl (para realizar la solicitud) y jq (para procesar el JSON devuelto). Si esos comandos no están disponibles, instálelos al principio del script (por ejemplo, con apk add --no-cache curl jq).
Las evaluaciones de Deployment Gate son asíncronas. Cuando activa una evaluación, esta se inicia en segundo plano y la API devuelve un ID de evaluación que puede usar para seguir su progreso:
- Primero, solicite una evaluación de Deployment Gate, lo cual inicia el proceso y devuelve un ID de evaluación.
- Luego, consulte periódicamente el punto de conexión de estado de evaluación con el ID de evaluación para recuperar el resultado cuando la evaluación se complete. Se recomienda consultar cada 10-20 segundos.
Reemplace lo siguiente:
Pase configuration con reglas en línea (snake_case en el límite de la API):
curl -X POST "https://api.<YOUR_DD_SITE>/api/v2/deployments/gates/evaluation" \
-H "Content-Type: application/json" \
-H "DD-API-KEY: <YOUR_API_KEY>" \
-H "DD-APPLICATION-KEY: <YOUR_APP_KEY>" \
-d @- << 'EOF'
{
"data": {
"type": "deployment_gates_evaluation_request",
"attributes": {
"service": "transaction-backend",
"env": "production",
"version": "1.2.3",
"configuration": {
"dry_run": false,
"rules": [
{
"type": "monitor",
"name": "Service monitors",
"options": {
"query": "service:transaction-backend env:production",
"duration": 300
}
},
{
"type": "faulty_deployment_detection",
"name": "APM Faulty Deployment Detection",
"options": {
"duration": 900,
"excluded_resources": ["GET /healthcheck"]
}
}
]
}
}
}
}
EOF
Si la evaluación de la puerta se inició correctamente, se devuelve un código de estado HTTP 202:
{
"data": {
"id": "<random_response_uuid>",
"type": "deployment_gates_evaluation_response",
"attributes": {
"evaluation_id": "e9d2f04f-4f4b-494b-86e5-52f03e10c8e9"
}
}
}
El campo data.attributes.evaluation_id contiene el identificador único para esta evaluación de puerta.
Obtenga el estado de una evaluación de puerta consultando el punto de conexión de estado con el ID de evaluación:
curl -X GET "https://api.<YOUR_DD_SITE>/api/v2/deployments/gates/evaluation/<evaluation_id>" \
-H "DD-API-KEY: <YOUR_API_KEY>" \
-H "DD-APPLICATION-KEY: <YOUR_APP_KEY>"
Nota: Si llama a este punto de conexión demasiado pronto después de solicitar la evaluación, es posible que se devuelva una respuesta HTTP 404 porque la evaluación aún no ha comenzado. Vuelva a intentarlo unos segundos después.
Cuando se devuelve una respuesta HTTP 200, tiene el siguiente formato:
{
"data": {
"id": "<random_response_uuid>",
"type": "deployment_gates_evaluation_result_response",
"attributes": {
"dry_run": false,
"evaluation_id": "e9d2f04f-4f4b-494b-86e5-52f03e10c8e9",
"evaluation_url": "https://app.datadoghq.com/ci/deployment-gates/evaluations?index=cdgates&query=level%3Agate+%40evaluation_id%3Ae9d2f04f-4f4b-494b-86e5-52f03e10c8e9",
"gate_id": "e140302e-0cba-40d2-978c-6780647f8f1c",
"gate_status": "pass",
"rules": [
{
"name": "Service monitors",
"status": "fail",
"reason": "One or more monitors in ALERT state: https://app.datadoghq.com/monitors/34330981",
"dry_run": false
}
]
}
}
}
El campo data.attributes.gate_status contiene el resultado de la evaluación, con uno de estos valores:
in_progress: La evaluación de Deployment Gate aún está en curso; continúe consultando.pass: La evaluación de Deployment Gate fue aprobada.fail: La evaluación de Deployment Gate falló.
Nota: Si el campo data.attributes.dry_run es true, el campo data.attributes.gate_status siempre es pass.