datadog-ci deployment gateコマンドは、単一のコマンドで評価を実行します。
datadog-ci deployment gate --service transaction-backend --env staging --identifier default
デプロイメントゲートに APM Faulty Deployment Detection ルールが含まれている場合は、バージョンも指定してください (例: --version 1.0.1)。
コマンド:
- ゲート評価を開始するリクエストを送信し、評価が完了するまでブロックします。
- 評価の待機時間を構成できるタイムアウトを提供します。
- エラーに対する組み込みの自動再試行機能があります。
- 予期しない Datadog エラー時の動作をカスタマイズするための
--fail-on-error を受け付けます。
deployment gate コマンドは、datadog-ci バージョン v3.17.0 以降で使用可能です。
必要な環境変数:
DD_API_KEY: API キー。DD_APP_KEY: アプリケーションキー。DD_BETA_COMMANDS_ENABLED=1: deployment gate コマンドはベータ版コマンドです。
完全な構成オプションと使用例については、deployment gate コマンドのドキュメント を参照してください。
AnalysisTemplate または ClusterAnalysisTemplate を作成して、Argo Rollouts Kubernetes Resource からデプロイメントゲートを呼び出します。このテンプレートは、datadog-ci デプロイメントゲートコマンド を実行して、Deployment Gates API とのやり取りを行います。
以下のテンプレートを開始点として使用します。
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
- 分析テンプレートは、Rollout リソースから引数 (
service、env、versionなど) を受け取ることができます。詳細については、Argo Rollouts の公式ドキュメント を参照してください。 ttlSecondsAfterFinishedは、5 分後に完了したジョブを削除します。backoffLimitは、ゲートの評価が失敗した場合にジョブを再試行されないよう 0 に設定されています。
分析テンプレートを作成した後、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']
- ...
Datadog Deployment Gate GitHub Action は、ワークフローの一部として評価を実行します。
既存のデプロイワークフローに DataDog/deployment-gate-github-action ステップを追加します。
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
デプロイメントゲートに APM Faulty Deployment Detection ルールが含まれている場合は、バージョンも指定してください (例: version: 1.0.1)。
アクション:
- ゲート評価を開始するリクエストを送信し、評価が完了するまでブロックします。
- 評価の待機時間を構成できるタイムアウトを提供します。
- エラーに対する組み込みの自動再試行機能があります。
- 予期しない Datadog エラー時の動作をカスタマイズするための
fail-on-error を受け付けます。
必要な環境変数:
完全な構成オプションと使用例については、DataDog/deployment-gate-github-action リポジトリ を参照してください。
このスクリプトを開始点として使用します。インラインルールなしで、事前構成されたゲートを評価します。
以下を置き換えます。
#!/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
スクリプト:
- 次の 3 つの入力を受け付けます。
service、environment、version。ゲートに APM Faulty Deployment Detection ルールがある場合は、version が必要です。必要に応じて、identifier と primary_tag を追加することもできます。 - 評価を開始するためのリクエストを送信し、
evaluation_id を記録します。HTTP レスポンスコードを処理します。- 5xx: サーバーエラー、遅れて再試行します。
- 4xx: クライアントエラー、評価が失敗します。
- 2xx: 評価が開始されました。
- 評価が完了するまで、
evaluation_idを使用して評価ステータスエンドポイントをポーリングします。- 5xx: サーバーエラー、遅れて再試行します。
- 404: 評価がまだ開始されていません。遅れて再試行します。
- 4xx (404 を除く): クライアントエラー、評価が失敗します。
- 2xx:
gate_status をチェックし、完了していない場合は遅れて再試行します。
- 評価が完了するか、最大ポーリング時間 (デフォルトで 10800 秒 = 3 時間) に達するまで 15 秒ごとにポーリングします。
- 初期リクエスト (5xx レスポンス) のすべての再試行が使い果たされた場合、API 障害に対する回復力を確保するため、スクリプトはこれを成功として扱います。
ユースケースに合わせてスクリプトを調整してください。これは curl (リクエストを実行) と jq (返された JSON を処理) を使用します。これらのコマンドが利用できない場合は、スクリプトの冒頭で (例: apk add --no-cache curl jq を使用) インストールしてください。
デプロイメントゲートの評価は非同期です。評価をトリガーするとバックグラウンドで開始され、API は進捗状況を追跡するために使用できる評価 ID を返します。
- まず、デプロイメントゲート評価をリクエストします。これによってプロセスが開始され、評価 ID が返されます。
- 次に、評価ステータスエンドポイントを評価 ID で定期的にポーリングし、評価が完了した時点で結果を取得します。10 ~ 20 秒ごとのポーリングが推奨されます。
以下を置き換えます。
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
オプションの属性:
identifier: オプション、デフォルトは default。version: APM Faulty Deployment Detection ルールに必須です。primary_tag: オプション。APM Faulty Deployment Detection の分析を選択したプライマリタグに絞り込みます。
注: 404 HTTP レスポンスは、ゲートが見つからなかったか、ゲートは見つかったもののルールが存在しないことを意味する場合があります。
ゲート評価が正常に開始された場合、202 HTTP ステータスコードが返されます。
{
"data": {
"id": "<random_response_uuid>",
"type": "deployment_gates_evaluation_response",
"attributes": {
"evaluation_id": "e9d2f04f-4f4b-494b-86e5-52f03e10c8e9"
}
}
}
フィールド data.attributes.evaluation_id には、このゲート評価の一意の識別子が含まれます。
評価 ID を使用してステータスエンドポイントをポーリングし、ゲート評価のステータスを取得します。
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>"
注: 評価をリクエストした直後にこのエンドポイントを呼び出すと、評価がまだ開始されていないため、404 HTTP レスポンスが返される場合があります。数秒後に再試行してください。
200 HTTP レスポンスが返される場合、その形式は以下の通りです。
{
"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
}
]
}
}
}
data.attributes.gate_status フィールドには評価結果が含まれ、値は以下のいずれかです。
in_progress: デプロイメントゲート評価は進行中です。ポーリングを続けてください。pass: デプロイメントゲート評価が成功しました。fail: デプロイメントゲート評価が失敗しました。
注: data.attributes.dry_run フィールドが true の場合、data.attributes.gate_status フィールドは常に pass となります。