La commande datadog-ci deployment gate exécute l’évaluation en une seule commande :
datadog-ci deployment gate --service transaction-backend --env staging --identifier default
Si la porte de déploiement contient des règles de détection de déploiement défectueux APM, spécifiez également la version (par exemple, --version 1.0.1).
La commande :
- Envoie une requête pour démarrer l’évaluation de la porte et bloque jusqu’à ce que l’évaluation soit terminée.
- Fournit un délai d’expiration configurable pour la durée d’attente d’une évaluation.
- Dispose de tentatives automatiques intégrées en cas d’erreurs.
- Accepte
--fail-on-error pour personnaliser le comportement en cas d’erreurs Datadog inattendues.
La commande deployment gate est disponible dans les versions v3.17.0 et ultérieures de datadog-ci.
Variables d’environnement requises :
DD_API_KEY : Votre clé d’API.DD_APP_KEY : Votre clé d’application.DD_BETA_COMMANDS_ENABLED=1: La commande deployment gate est une commande bêta.
Pour obtenir des options de configuration complètes et des exemples d’utilisation, consultez la deployment gate documentation de la commande.
Appelez les Deployment Gates depuis une ressource Kubernetes Argo Rollouts en créant un AnalysisTemplate ou un ClusterAnalysisTemplate. Le modèle exécute la commande de porte de déploiement datadog-ci pour interagir avec l’API Deployment Gates.
Utilisez le modèle ci-dessous comme point de départ :
- Remplacez
<YOUR_DD_SITE> par votre nom de site Datadog (par exemple, ). - Définissez la clé d’API et la clé d’application en tant que variables d’environnement. L’exemple utilise un Secret Kubernetes nommé
datadog avec deux valeurs de données : api-key et app-key. Vous pouvez également transmettre les valeurs en texte brut avec value au lieu de valueFrom.
apiVersion: argoproj.io/v1alpha1
kind: ClusterAnalysisTemplate
metadata:
name: datadog-job-analysis
spec:
args:
- name: service
- name: env
metrics:
- name: datadog-job
provider:
job:
spec:
ttlSecondsAfterFinished: 300
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: datadog-check
image: datadog/ci:v3.17.0
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 }} --identifier default
- Le modèle d’analyse peut recevoir des arguments de la ressource Rollout (tels que
service, env et version). Pour plus d’informations, consultez la documentation officielle d’Argo Rollouts. ttlSecondsAfterFinished supprime les jobs terminés après 5 minutes.backoffLimit est défini sur 0 car le job ne doit pas être relancé si l’évaluation de la porte échoue.
Après avoir créé le modèle d’analyse, référencez-le depuis la stratégie 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']
- ...
L’action GitHub Datadog Deployment Gate exécute l’évaluation dans le cadre d’un workflow.
Ajoutez une étape DataDog/deployment-gate-github-action à votre workflow de déploiement existant :
name: Deploy with Datadog Deployment Gate
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- 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
identifier: default
- name: Deploy
run: |
echo "Deployment Gate passed, proceeding with deployment"
# Your deployment commands here
Si la porte de déploiement contient des règles de détection de déploiement défectueux APM, spécifiez également la version (par exemple, version: 1.0.1).
L’action :
- Envoie une requête pour démarrer l’évaluation de la porte et bloque jusqu’à ce que l’évaluation soit terminée.
- Fournit un délai d’expiration configurable pour la durée d’attente d’une évaluation.
- Dispose de tentatives automatiques intégrées en cas d’erreurs.
- Accepte
fail-on-error pour personnaliser le comportement en cas d’erreurs Datadog inattendues.
Variables d’environnement requises :
Pour des options de configuration complètes et des exemples d’utilisation, consultez le DataDog/deployment-gate-github-action dépôt.
Utilisez ce script comme point de départ. Il évalue une porte préconfigurée sans règles en ligne.
Remplacez ce qui suit :
#!/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"
}
}
}
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
Le script :
- Reçoit trois entrées :
service, environment et version. version est requis si la porte comporte des règles de détection de déploiement défectueux APM. Vous pouvez également ajouter identifier et primary_tag si nécessaire. - Envoie une requête pour démarrer l’évaluation et enregistre le
evaluation_id. Gère les codes de réponse HTTP :- 5xx : erreur serveur, réessaie avec un délai.
- 4xx : erreur client, l’évaluation échoue.
- 2xx : évaluation lancée.
- Interroge l’endpoint du statut de l’évaluation avec le
evaluation_id jusqu’à ce que l’évaluation soit terminée :- 5xx : erreur serveur, réessaie avec un délai.
- 404 : évaluation pas encore lancée, réessaie avec un délai.
- 4xx (sauf 404) : erreur client, l’évaluation échoue.
- 2xx : vérifiez
gate_status et réessayez avec un délai si ce n’est pas terminé.
- Interroge toutes les 15 secondes jusqu’à ce que l’évaluation soit terminée ou que le temps d’interrogation maximal (10800 secondes = 3 heures par défaut) soit atteint.
- Si toutes les tentatives sont épuisées pour la requête initiale (réponses 5xx), le script traite cela comme un succès pour être résilient aux défaillances de l’API.
Adaptez le script à votre cas d’utilisation. Il utilise curl (pour effectuer la requête) et jq (pour traiter le JSON renvoyé). Si ces commandes ne sont pas disponibles, installez-les au début du script (par exemple, avec apk add --no-cache curl jq).
Les évaluations Deployment Gate sont asynchrones. Lorsque vous déclenchez une évaluation, elle est lancée en arrière-plan et l’API renvoie un ID d’évaluation que vous pouvez utiliser pour suivre sa progression :
- Tout d’abord, demandez une évaluation Deployment Gate, ce qui lance le processus et renvoie un ID d’évaluation.
- Ensuite, interrogez périodiquement l’endpoint du statut de l’évaluation avec l’ID d’évaluation pour récupérer le résultat une fois l’évaluation terminée. Il est recommandé d’interroger toutes les 10 à 20 secondes.
Remplacez ce qui suit :
Demandez une évaluation pour une porte qui existe déjà dans Datadog :
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": "staging",
"identifier": "my-custom-identifier",
"version": "v123-456",
"primary_tag": "region:us-central-1"
}
}
}
EOF
Attributs facultatifs :
identifier: Facultatif, par défaut default.version: Requis pour les règles de détection de déploiement défectueux APM.primary_tag: Optionnel, restreint l’analyse de détection de déploiement défectueux APM au tag principal sélectionné.
Note : Une réponse HTTP 404 peut signifier que la porte n’a pas été trouvée, ou que la porte a été trouvée mais ne contient aucune règle.
Si l’évaluation Deployment Gate a été lancée avec succès, un code d’état HTTP 202 est renvoyé :
{
"data": {
"id": "<random_response_uuid>",
"type": "deployment_gates_evaluation_response",
"attributes": {
"evaluation_id": "e9d2f04f-4f4b-494b-86e5-52f03e10c8e9"
}
}
}
Le champ data.attributes.evaluation_id contient l’identifiant unique de cette évaluation Deployment Gate.
Récupérez le statut d’une évaluation Deployment Gate en interrogeant l’endpoint de statut avec l’identifiant d’évaluation :
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>"
Remarque : Si vous appelez cet endpoint trop tôt après avoir demandé l’évaluation, une réponse HTTP 404 peut être renvoyée car l’évaluation n’a pas encore commencé. Réessayez quelques secondes plus tard.
Lorsqu’une réponse HTTP 200 est renvoyée, elle présente le format suivant :
{
"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%3Ae9d2f14f-4f4b-494b-86e5-52f03e10c8e9",
"gate_id": "e140302e-0cba-40d2-978c-6780647f8f1c",
"gate_status": "pass",
"rules": [
{
"name": "Check service monitors",
"status": "fail",
"reason": "One or more monitors in ALERT state: https://app.datadoghq.com/monitors/34330981",
"dry_run": true
}
]
}
}
}
Le champ data.attributes.gate_status contient le résultat de l’évaluation, avec l’une de ces valeurs :
in_progress : L’évaluation Deployment Gate est toujours en cours ; continuez à interroger.pass : L’évaluation Deployment Gate a réussi.fail : L’évaluation Deployment Gate a échoué.
Remarque : Si le champ data.attributes.dry_run est true, le champ data.attributes.gate_status est toujours pass.