Synthèse automatique
Déploie une révision Cloud Run sans trafic, exécute des contrôles de santé et la promeut en production si les tests réussissent.
Points forts
- Déploie d'abord une révision à trafic nul, ce qui évite d'exposer les utilisateurs à un build défectueux.
- Résout automatiquement le service cible à partir du bloc services: de .adlc/config.yml, avec un repli documenté pour les dépôts uniques.
- Enchaîne la construction de l'image, le push vers Artifact Registry, les smoke tests et la promotion en cas de succès.
- Accepte un identifiant de dépôt, un nom de service Cloud Run ou une détection depuis le worktree courant.
Limites
- Fortement lié à Google Cloud Run, gcloud et Artifact Registry ; inutilisable pour d'autres plateformes sans adaptation.
- Suppose que le service Cloud Run existe déjà et qu'une image Docker peut être construite ou récupérée.
- N'est plus déclenché automatiquement par /proceed ni /bugfix ; il faut lancer /canary manuellement.
À utiliser lorsqu'on doit déployer une nouvelle révision d'un service Cloud Run existant en production et qu'on veut la valider avant de basculer le trafic.
À ne pas utiliser pour créer un nouveau service Cloud Run, déployer hors de GCP, ou lorsque le service cible n'est pas configuré dans .adlc/config.yml.
Analyse de sécurité
PrudenceThe skill performs legitimate canary deployment operations using Docker, gcloud, and curl. No destructive, exfiltrating, or obfuscating commands are present. However, because it invokes shell and deployment tools, it warrants a caution rating.
- •Executes shell commands for context gathering via backtick-bang syntax (e.g., pwd, git, gcloud) and includes external partial scripts, but these are read-only/legitimate deployment operations.
- •Uses Docker build/push and gcloud run deploy, which are powerful but standard for canary deployment.
Exemples
/canary apiCanary deploy the current service with smoke tests before promoting it to live traffic./canary webname: canary description: Canary deployment with smoke tests — deploy to a zero-traffic revision, run health checks, and promote on success. Use when the user says "canary deploy", "deploy with canary", "smoke test the deploy", or wants deployment confidence before going live. argument-hint: Optional repo id (from .adlc/config.yml) or service name — auto-detected from current worktree if omitted
/canary — Canary Deployment with Smoke Tests
You are deploying code through a canary process: deploy a zero-traffic revision, verify it works, then promote to live traffic. This prevents broken deploys from reaching users.
Ethos
!sh .adlc/partials/ethos-include.sh 2>/dev/null || sh ~/.claude/skills/partials/ethos-include.sh
Context
- Current directory: !
pwd - Current branch: !
git branch --show-current 2>/dev/null || echo "Not a git repo" - GCP project: !
gcloud config get-value project 2>/dev/null || echo "No GCP project configured" - Active Cloud Run services: !
gcloud run services list --format="table(SERVICE,REGION,URL)" 2>/dev/null || echo "gcloud not configured"
Input
Target: $ARGUMENTS
Prerequisites
gcloudCLI must be authenticated and configured with the correct project- The service must already exist on Cloud Run (this skill deploys revisions, not new services)
- A Docker image must be available (either build locally or use the latest from Artifact Registry)
Service Resolution
Service configuration lives in .adlc/config.yml in the primary repo under a services: block, keyed by repo id. This is the single source of truth — no service names, regions, or image paths should be hardcoded in this skill.
Expected config shape (primary repo .adlc/config.yml):
repos:
api:
path: ../api
web:
path: ../web
services:
api:
cloud_run_service: api
region: us-central1
image_path: us-central1-docker.pkg.dev/<gcp-project>/api/api
web:
cloud_run_service: web
region: us-central1
image_path: us-central1-docker.pkg.dev/<gcp-project>/web/web
Resolution order:
- If
$ARGUMENTSis a repo id defined underrepos:in the primary's config, look upservices[<repo-id>]and use that. If the repo id has noservices:entry, stop and ask the user to add one. - If
$ARGUMENTSis a Cloud Run service name already (e.g., the user passedapiand it matchesservices.*.cloud_run_service), use that entry. - If no argument: detect which repo the current cwd is inside by walking up to find a git root and matching it against
repos[*].path(resolve each to an absolute path first). Then look up its service. - If the project has no
.adlc/config.yml(single-repo legacy setup) AND the current repo has a top-levelDockerfileand a single Cloud Run service name that matches the repo basename, fall back to auto-detection: service name = repo basename, region =us-central1, image path =$(gcloud config get-value project)/<service>. Surface this fallback in the logs so the user knows it's being inferred. - If none of the above resolves, stop with a clear error: "Could not determine Cloud Run service. Add a
services:block to.adlc/config.ymlor pass the service name as an argument."
Operating worktree: if the resolved repo has a feature-branch worktree (e.g., .worktrees/REQ-xxx) that matches the current /proceed pipeline, build from inside that worktree. Otherwise build from the repo's main checkout. The caller can also pass the worktree path explicitly.
Note (post-REQ-380, REQ-381): /canary is no longer auto-invoked from /proceed (REQ-380) or /bugfix (REQ-381). Operators run it manually when a production canary is needed.
Instructions
Step 1: Build and Push Image
- Determine the image tag: use the current git SHA (
git rev-parse --short HEAD) - Build the Docker image:
docker build -t <IMAGE_PATH>:canary-<SHA> ./<subdir if needed> - Push to Artifact Registry:
docker push <IMAGE_PATH>:canary-<SHA>
If the user says "use latest" or the image was already built by CI, skip the build and use the :latest tag from Artifact Registry.
Step 2: Deploy Canary Revision (Zero Traffic)
Deploy a new revision that receives NO traffic:
gcloud run deploy <SERVICE_NAME> \
--image=<IMAGE_PATH>:canary-<SHA> \
--region=us-central1 \
--no-traffic \
--tag=canary \
--format="json"
This creates a tagged revision accessible at https://canary---<SERVICE_NAME>-<hash>.a.run.app without affecting production traffic.
Capture the canary URL from the output.
Step 3: Health Checks
Run basic health checks against the canary URL:
-
Liveness:
curl -s -o /dev/null -w "%{http_code}" <CANARY_URL>/health- Expected:
200 - Retry up to 3 times with 5-second intervals (cold start grace period)
- Expected:
-
Readiness:
curl -s -o /dev/null -w "%{http_code}" <CANARY_URL>/api/health- Expected:
200(or the service's documented readiness endpoint)
- Expected:
If health checks fail after 3 retries, go to Step 6 (Rollback).
Step 4: Smoke Tests
Run smoke tests against the canary URL. Load test definitions from the primary repo's .adlc/context/smoke-tests.md if it exists, otherwise use defaults. In cross-repo mode the primary's smoke-tests.md is the authoritative source for every service — sibling repos do not need their own copy.
Default smoke tests (API services):
GET /health -> 200
GET /api/health -> 200
Custom smoke tests (from .adlc/context/smoke-tests.md):
Each entry should specify: method, path, expected status, optional body pattern.
For each test:
RESPONSE=$(curl -s -w "\n%{http_code}" <CANARY_URL><PATH>)
STATUS=$(echo "$RESPONSE" | tail -1)
BODY=$(echo "$RESPONSE" | head -n -1)
Report results:
## Smoke Test Results
| Test | Method | Path | Expected | Actual | Status |
|------|--------|------|----------|--------|--------|
| Health | GET | /health | 200 | 200 | PASS |
| API Health | GET | /api/health | 200 | 200 | PASS |
Result: 2/2 passed
If any test fails, go to Step 6 (Rollback).
Step 5: Promote to Production
All checks passed — promote the canary revision to 100% traffic:
gcloud run services update-traffic <SERVICE_NAME> \
--region=us-central1 \
--to-tags=canary=100
Verify promotion:
gcloud run services describe <SERVICE_NAME> \
--region=us-central1 \
--format="table(status.traffic[].percent,status.traffic[].revisionName,status.traffic[].tag)"
Confirm canary revision is now serving 100% traffic.
Remove the canary tag (clean up):
gcloud run services update-traffic <SERVICE_NAME> \
--region=us-central1 \
--remove-tags=canary
Report:
Canary promoted to production.
Service: <SERVICE_NAME>
Revision: <REVISION_NAME>
URL: <PRODUCTION_URL>
All smoke tests passed.
Step 6: Rollback (Failure Path)
If health checks or smoke tests fail:
-
Delete the canary revision tag (so it's not addressable):
gcloud run services update-traffic <SERVICE_NAME> \ --region=us-central1 \ --remove-tags=canary -
Report the failure:
CANARY FAILED — rolled back. Service: <SERVICE_NAME> Failed revision: canary-<SHA> Failures: - [list failed health checks or smoke tests] Production traffic is unchanged — still serving the previous revision. -
Suggest next steps:
- Check Cloud Run logs:
gcloud run services logs read <SERVICE_NAME> --region=us-central1 --limit=50 - Investigate the failure locally
- Fix and re-run
/canary
- Check Cloud Run logs:
Step 7: Update Pipeline State (if in /proceed context)
If pipeline-state.json exists for the current REQ:
- Add a
canaryentry tophaseHistorywith the result (passed/failed) - Include: service name, revision, smoke test results, canary URL
Smoke Test Configuration
To customize smoke tests, create .adlc/context/smoke-tests.md with this format:
# Smoke Tests
## api
| Method | Path | Expected Status | Body Pattern |
|--------|------|-----------------|--------------|
| GET | /health | 200 | |
| GET | /api/health | 200 | |
| GET | /api/v1/config | 200 | "version" |
## web
| Method | Path | Expected Status | Body Pattern |
|--------|------|-----------------|--------------|
| GET | / | 200 | |
| GET | /api/health | 200 | |
The keys above (api, web) are repo ids — the same ids you used under repos: in .adlc/config.yml. /canary looks up the smoke tests for the service it's deploying by matching repo id.
What This Skill Does NOT Do
- It does not create new Cloud Run services — the service must already exist
- It does not handle iOS deployments — TestFlight is already a canary-like process
- It does not modify CI/CD workflows — it's a manual deployment confidence tool
- It does not handle database migrations — run those separately before deploying
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/canary-deployment-with-smoke-tests-mse7inry/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/canary-deployment-with-smoke-tests-mse7inry' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/canary-deployment-with-smoke-tests-mse7inry/download' --output '.skill-downloads/canary-deployment-with-smoke-tests-mse7inry/SKILL.md.part' && mv '.skill-downloads/canary-deployment-with-smoke-tests-mse7inry/SKILL.md.part' '.skill-downloads/canary-deployment-with-smoke-tests-mse7inry/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Extrait original : Prerequisites
gcloudCLI must be authenticated and configured with the correct project- The service must already exist on Cloud Run (this skill deploys revisions, not new services)
- A Docker image must be available (either build locally or use the latest from Artifact Registry)
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.
Claude Code
test -f '.skill-downloads/canary-deployment-with-smoke-tests-mse7inry/SKILL.md' && test -s '.skill-downloads/canary-deployment-with-smoke-tests-mse7inry/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/canary' && cp -R '.skill-downloads/canary-deployment-with-smoke-tests-mse7inry' '.claude/skills/canary'OpenSkills
OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.
Installation officielle d’OpenSkillsopenskills install './.skill-downloads/canary-deployment-with-smoke-tests-mse7inry'openskills read 'canary-deployment-with-smoke-tests-mse7inry'La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.
Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.
openskills syncMode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/canary-deployment-with-smoke-tests-mse7inry/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Configurer un canal de discussion avec SecretRefs
DevOps
Configurez des canaux de discussion avec des commandes non interactives, les secrets étant uniquement des SecretRefs. Couvre les étapes de collecte, modification, réparation et vérification.
Enquêter sur les échecs CI de ClickHouse
DevOps
Investigue un échec CI de ClickHouse de bout en bout à partir d'une URL de PR ou de rapport S3. Récupère les tests échoués, classe flaky vs vraie régression, et cherche des issues/fixes existants.
Revue de PR Ansible
DevOps
Examine une PR Ansible selon le processus standardisé du projet, incluant la validation des changelogs, la couverture de tests et le suivi des commentaires.