Azure App Onboard Scaffold — Génération IaC + Auto-examen
Générez un code d'infrastructure prêt pour le déploiement à partir d'un plan d'architecture, vérifiez-le avec un auto-examen contradictoire et faites le lien vers la validation — tout cela sans déployer.
Référence rapide
| Propriété | Valeur |
|---|---|
| Parent | azure-app-onboard |
| Meilleur pour | Convertir la liste de services de prepare-plan.json en modèles Bicep avec des patterns sécurisés par défaut |
| Entrées | prepare-plan.json (services, nommage, quotas), context.json (remplacements, composants, info repo) |
| Sorties | scaffold-manifest.json, fichiers IaC générés dans infra/ |
| Position dans le pipeline | Phase 3 sur 4 : prérequis → préparation → scaffold → déploiement |
| Format IaC | Bicep (v1 par défaut). Terraform quand .tf existant détecté ou remplacement utilisateur. |
Quand utiliser cette compétence
Invoquée par l'orchestrateur azure-app-onboard en Phase 3 quand prepare-plan.json existe avec services[]. Non directement routée par l'utilisateur en v1.
Retour à l'orchestrateur : Une fois terminé, retournez le contrôle à
azure-app-onboard. N'invoquez PAS directement deploy — l'orchestrateur gère les transitions de phase.
Quand NE PAS utiliser
| Scénario | Utiliser plutôt |
|---|---|
IaC déclenchée par l'utilisateur (pas de prepare-plan.json) |
azure-prepare |
| Zones de destination au niveau de l'abonnement | azure-enterprise-infra-planner |
Exécuter le déploiement (azd up) |
azure-deploy (ne PAS invoquer depuis le pipeline AppOnboard) |
Outils MCP
Voir outils partagés pour les outils inter-phases et les paramètres globaux. Voir outils scaffold pour les tableaux de paramètres complets.
| Outil | Sous-commande | Objectif | Paramètres |
|---|---|---|---|
mcp_azure_mcp_bicepschema |
bicepschema_get |
Schémas de type de ressource ARM | resource_type (Requis), api_version (Optionnel) |
mcp_bicep_list_avm_metadata |
(plat) | Catalogue de modules AVM | Aucun |
mcp_bicep_get_bicep_best_practices |
(plat) | Meilleures pratiques Bicep | Aucun |
mcp_bicep_get_az_resource_type_schema |
(plat) | Schéma JSON de type de ressource ARM | azResourceType, apiVersion (Requis) |
mcp_bicep_build_bicep |
(plat) | Valider les fichiers .bicep (auto-examen L3) |
filePath (Requis) |
mcp_bicep_format_bicep_file |
(plat) | Formater les fichiers .bicep (application LF) |
filePath (Requis) |
mcp_azure_mcp_deploy |
deploy_iac_rules_get |
Meilleures pratiques et règles IaC | deployment-tool, iac-type, resource-types |
mcp_azure_mcp_deploy |
deploy_pipeline_guidance_get |
Configuration pipeline CI/CD | is-azd-project, pipeline-platform, deploy-option |
mcp_azure_mcp_get_azure_bestpractices |
get_azure_bestpractices_get |
Meilleures pratiques SDK/Functions | resource, action |
mcp_azure_mcp_azureterraformbestpractices |
(plat) | Patterns Terraform (chemin TF uniquement) | resource_type (Requis) |
Flux de travail
Dossier de session : .copilot-azure/sessions/{uuid}/ — lit prepare-plan.json + context.json, écrit scaffold-manifest.json.
DÉTECTION (Étapes 1–4)
- Lire
prepare-plan.json— vérifier queservices[]existe, lire la confignaming(notammentnaming.resourcePrefix,naming.suffix,naming.resources[]). Lire le nom du groupe de ressources depuiscontext.json.azure.resourceGroup. ⛔ Utiliser EXACTEMENT ces noms dans l'IaC générée — ne PAS inventer de noms, les dériver deenvironmentName, ou ajouter vos propres suffixes. ⛔ Utiliser EXACTEMENT les noms deprepare-plan.json.naming.resources[]comme paramètres Bicep. Ne PAS dériver les noms avectake(),substring(), ou manipulation de chaîne. Le plan est la source de vérité. Manquant → déclencher le remplissage de préparation via l'orchestrateurazure-app-onboard. - Lire
context.json— vérifieroverrides[]pour la préférenceiacFormat,detectedInfra[]pour.tfexistant,detectedInfraProviderpour la classification du fournisseur cloud. - Vérifier le workspace pour l'IaC existant — ⛔ Ignorer si
context.json.overrides[]contientignoreExistingInfra: true. Sinon :- IaC Azure (
.bicep,azure.yaml,.tfavecazurerm) :ask_user→ « Recommencer à zéro » (renommerinfra/eninfra.bak/) ou « Utiliser le code existant » (router versazure-prepare, arrêter le pipeline). - IaC non-Azure (
.tfavec GCP/AWS) : respectercontext.json.overrides[].iacFormatde la préparation. Par défaut : Bicep à côté du TF existant. - TF inconnu (
detectedInfraProvider.terraform=="unknown") : demander à l'utilisateur quel fournisseur avant le routage. - Pas d'IaC : continuer.
- IaC Azure (
- Déterminer les cibles de calcul — Vérifier quelles cibles de calcul se trouvent dans le plan (App Service/Functions, Container Apps, ou les deux) et si PostgreSQL/Redis est présent. Ne PAS lire de fichiers de référence — transmettre ces informations au sous-agent à l'Étape 5.
4b. Pré-vérification des versions d'API (thread principal) — L'accès aux outils MCP est peu fiable dans les agents
task— appeler ceux-ci dans le thread principal avant la dispatch. Appelermcp_bicep_list_az_resource_types_for_provider(oubicep-list_az_resource_types_for_provider) une fois par espace de noms de fournisseur dansprepare-plan.json.services[](par ex.Microsoft.Web,Microsoft.App,Microsoft.DBforPostgreSQL,Microsoft.Cache,Microsoft.KeyVault,Microsoft.ContainerRegistry). Extraire la dernière version d'API GA (sans-preview) pour chaque type de ressource. Construire une carteapiVersionset la transmettre au sous-agent de génération IaC à l'Étape 5. Fallback : si MCP indisponible, exécuteraz provider show --namespace {ns} --query "resourceTypes[?resourceType=='{type}'].apiVersions[?!contains(@, 'preview')] | [0][0]" -o tsvpar type de ressource — cela filtre sur GA uniquement et choisit la plus récente. Transmettre"MCP unavailable"uniquement si MCP ET CLI échouent. Le sous-agent valide toujours le Bicep généré viaaz bicep build.
ACTION (Étapes 5–12)
⛔ Limite de fichier : Ne JAMAIS modifier les fichiers en dehors de
infra/,.copilot-azure/. Scaffold ne fait qu'écrire des fichiers — pas de commandes install/build.
⛔ La délégation au sous-agent est OBLIGATOIRE pour les Étapes 5, 6–9 et 10–12. Chaque étape lit son modèle
subagent-*.md, puis dispatch un appeltask. Ne PAS lire de fichier de référence qui n'est pas explicitement nommé dans ces étapes.⛔ Type de dispatch :
taskUNIQUEMENT — JAMAISgeneral-purpose.general-purposefuite le contexte du sous-agent dans le thread principal, accélérant la compaction et expulsant le workflow de l'orchestrateur.taskisole le contexte du sous-agent.⛔ Comment dispatcher — COPIE VERBATIM requise :
viewle fichier modèlesubagent-*.md- Votre action SUIVANTE DOIT être un appel à l'outil
task— pasview,powershell,create, ou TOUT autre outil- Le prompt de la task DOIT contenir le texte du modèle COMPLET et NON MODIFIÉ. Copier le modèle entre les délimiteurs
<<<TEMPLATE_START>>>/<<<TEMPLATE_END>>>exactement comme montré ci-dessous. Ne PAS résumer, paraphraser, reformuler, ou omettre AUCUNE partie — le sous-agent a besoin de chaque instruction « Lire [fichier] » et « Faire : »- APRÈS le bloc de modèle, ajouter les sections de données (JSON du plan, remplacements, etc.)
Anti-pattern (cause des régressions) : Écrire votre PROPRE prompt listant les étapes de workflow ou décrivant ce qu'il faut générer. Le modèle contient déjà le workflow complet — votre rôle est le COPIER, pas le réécrire.
-
Génération IaC — ⛔ Vous DEVEZ dispatcher
subagent-iac-gen.mdcomme unetask. ⛔ agent_type:"task"— JAMAIS"general-purpose".<<<TEMPLATE_START>>> {coller le CONTENU ENTIER de subagent-iac-gen.md ici — non modifié} <<<TEMPLATE_END>>> ## Données (ajoutées par l'orchestrateur) ### prepare-plan.json {JSON complet} ### context.json.overrides {tableau overrides} ### prereq-output.json.buildRequirements {objet buildRequirements} ### prereq-output.json.warnings[] {tableau warnings} ### Cibles de calcul {App Service/Functions, Container Apps, ou les deux + si PostgreSQL/Redis présent} ### apiVersions {map depuis l'Étape 4b, par ex. {"Microsoft.KeyVault/vaults": "2023-07-01", ...} — ou "MCP unavailable" si ignoré} ### Répertoire de travail {chemin absolu}- Attendu : Fichiers IaC écrits dans
infra/, liste de fichiers retournée pourscaffold-manifest.json.files[] - La balise
app-onboard-skill: 'true'DOIT apparaître textuellement dans le Bicep généré.
- Attendu : Fichiers IaC écrits dans
5b. Checklist de déploiement (en parallèle avec l'Étape 5) — Dispatcher comme une task en parallèle avec le sous-agent de génération IaC ci-dessus. ⛔ agent_type: "task" — JAMAIS "general-purpose".
<<<TEMPLATE_START>>>
Vous êtes un générateur de checklist de déploiement. N'invoquez AUCUNE compétence.
1. Lire la checklist de déploiement à : plugin/skills/azure-app-onboard/deploy/references/deploy-checklist-template.md
2. Remplir les {placeholders} avec les vraies valeurs de prepare-plan.json (appName, rgName, subscriptionId, sessionId).
3. Supprimer les sections qui ne s'appliquent pas à la cible de calcul de ce déploiement (par ex., supprimer la section App Service pour les déploiements Container Apps). Les en-têtes de section du modèle indiquent lesquels supprimer.
4. Écrire le résultat dans le dossier de session à l'aide de l'outil `create`. Ce fichier survit à la compaction de conversation — deploy le relit après chaque commande longue.
<<<TEMPLATE_END>>>
## Données (ajoutées par l'orchestrateur)
### prepare-plan.json
{JSON complet}
### Chemin de session
{.copilot-azure/sessions/{uuid}/}
### Cibles de calcul
{App Service, Container Apps, Static Web Apps, ou combinaison}
- Attendu :
deploy-checklist.mdécrit dans le dossier de session. Si ce sous-agent échoue, le sous-agent de validation (Étapes 10b–12.5) attrapera le fichier manquant.
6–9. Auto-examen — ⛔ Vous DEVEZ dispatcher subagent-review.md comme une task. ⛔ agent_type: "task" — JAMAIS "general-purpose".
<<<TEMPLATE_START>>>
{coller le CONTENU ENTIER de subagent-review.md ici — non modifié}
<<<TEMPLATE_END>>>
## Données (ajoutées par l'orchestrateur)
### Fichiers IaC générés
{contenu complet de chaque fichier .bicep/.tf}
### prepare-plan.json (services, naming, deploymentVariables)
{sections pertinentes}
### prereq-output.json.warnings[]
{tableau warnings}
- Attendu : JSON des findings → écrire dans
scaffold-manifest.json.selfReview - FLAGGÉ au L1/L3 → corriger l'IaC avant de continuer
VALIDATION → MANIFESTE → APPROBATION (Étapes 10–12.5)
10a. Formater l'IaC (thread principal) — Pour chaque fichier .bicep dans infra/ (y compris modules/) : appeler mcp_bicep_format_bicep_file (ou bicep-format_bicep_file) avec { filePath: "<chemin absolu>" }. Cela applique les fins de ligne LF via le bicepconfig.json écrit pendant la génération IaC. Fallback : ignorer si indisponible.
10a-conf. Porte de conformité (thread principal — OBLIGATOIRE pour Bicep) — ⛔ Ignorer cette étape entière quand le scaffold a émis Terraform (infra/main.bicep absent) — ces vérifications sont Bicep uniquement (Terraform est validé syntaxiquement via terraform validate dans le sous-agent de validation). Sinon exécuter le script de conformité du répertoire scripts/ de cette compétence ; il capture déterministes les valeurs rejetées par ARM que az bicep build ne peut pas (valeurs Bicep invalides, mauvaise version DB, connexion DB réservée, enablePurgeProtection) :
{scaffoldDir}/scripts/scaffold-conformance.ps1 -SessionPath ".copilot-azure/sessions/{uuid}" -InfraPath infra # pwsh (préféré)
bash {scaffoldDir}/scripts/scaffold-conformance.sh ".copilot-azure/sessions/{uuid}" infra # bash (seulement si pwsh indisponible ; a besoin de jq pour les vérifications dépendantes du plan)
⛔ Préférer le .ps1 quand pwsh est disponible — il exécute chaque vérification inconditionnellement. Le jumeau .sh ignore les vérifications dépendantes du plan (DB-VERSION-MATCH, SERVICES-COMPLETE, DB-NAME-PRESENT, WARN-FIXED) quand jq est absent.
⛔ Tout échec BLOCK → corriger l'IaC, relancer (max 3) ; ne jamais présenter la porte de déploiement avec un BLOCK ouvert. L'exécuter ici dans le thread principal — ne PAS déléguer au sous-agent de validation ou juger manuellement le résultat quand un shell existe. Passer le JSON au sous-agent de validation pour scaffold-manifest.json.conformance.
10b–12.5. Validation + manifeste — ⛔ Vous DEVEZ dispatcher subagent-validate.md comme une task. ⛔ agent_type: "task" — JAMAIS "general-purpose".
<<<TEMPLATE_START>>>
{coller le CONTENU ENTIER de subagent-validate.md ici — non modifié}
<<<TEMPLATE_END>>>
## Données (ajoutées par l'orchestrateur)
### Chemins de fichiers IaC
{liste des fichiers générés}
### Findings d'auto-examen (depuis les Étapes 6–9)
{JSON des findings}
### prepare-plan.json
{JSON complet}
### prereq-output.json.warnings[]
{tableau warnings}
### prereq-output.json.healthEndpoint
{chaîne de chemin santé détecté ou null}
### Résultat de conformité
{JSON depuis l'Étape 10a-conf}
### Chemin de session
{.copilot-azure/sessions/{uuid}/}
- Attendu :
scaffold-manifest.jsonavecvalidationResult, checklist de déploiement généré - Vérifier que
deploy-checklist.mdexiste (écrit à l'Étape 5b) — si manquant, créer MAINTENANT depuisdeploy-checklist-template.md. Vérifier quedeploy-result.jsonexiste — si manquant, créer depuisdeploy-schemas.ts. - ⛔ Vérifier la mise à jour
context.json(thread principal — ne PAS déléguer). Lire.copilot-azure/sessions/{uuid}/context.json. SicompletedPhasesn'inclut pas"scaffold"OUcurrentPhasen'est pas"deploy", l'écrire vous-même viaedit/create: ajouter"scaffold"àcompletedPhases, définircurrentPhaseà"deploy", mettre à jourlastModifiedUtcen UTC ISO 8601 courant. C'est une écriture de limite de phase requise par pipeline-rules.md — ne pas l'ignorer. - ⛔ Retour à l'orchestrateur pour l'Étape 8 (Porte d'approbation de déploiement). Votre ACTION SUIVANTE DOIT être de présenter la Porte de Déploiement selon le SKILL.md de l'orchestrateur — ne PAS écrire un message « résumé des fichiers générés », ne PAS émettre de rapport d'achèvement. Le prompt de Porte de Déploiement (
🚀 Prêt à déployer ? ...) est la SEULE sortie correcte suivante.
Boucle d'auto-réparation
En cas d'échec de validation → lire scaffold-healing-rules.md (cadence de réparation, PLAN_LEVEL_CHANGE, cohérence des artefacts). Ne PAS pré-lire.
Gestion des erreurs
prepare-plan.jsonmanquant : déclencher le remplissage via orchestrateur.- IaC existant : géré dans l'Étape DÉTECTION 3.
- MCP indisponible : se rabattre sur les patterns de référence, flaguer comme « non vérifié ».
- Findings FLAGGÉS et épuisement de la réparation : voir scaffold-healing-rules.md.