Spoke-bestanden valideren in een pull request¶
Spoke-bestanden zijn flexibel en hebben veel velden. Daardoor is een foute configuratie makkelijk te schrijven en duur om bij deployment te vinden. Een validatiepipeline controleert elk spoke-bestand als een pull request wordt aangemaakt of bijgewerkt, en blokkeert de merge als een bestand fout is. Deze pagina beschrijft wat zo'n pipeline controleert, hoe je hem in Azure DevOps inricht en welke delen van het JSON-schema je per organisatie aanpast.
Relatie met de config tests
De platformpipelines draaien vóór elke deployment config tests (Pipelines),
en je kunt ze lokaal draaien (De tests lokaal draaien). De validatiepipeline
op deze pagina is hetzelfde idee, eerder: hij draait op de pull request, zodat de auteur en de reviewer het
probleem zien vóór de merge. Hij maakt deel uit van het spoke canvas van eerdere versies. Controleer of jouw codeversie hem meelevert
(map Scripts van de coderepository) voordat je hem inricht.
Wat hij controleert¶
Het script leest alle spoke-bestanden onder de spoke-map en test elk bestand:
| Test | Resultaat |
|---|---|
| Het bestand is geldige JSON | Faalt met de positie van de fout |
| Het bestand voldoet aan het spoke-schema | Faalt met het bestand en het deel van de configuratie dat fout is |
De instelling isprivatelinksubnet is correct voor elk virtual network |
Faalt als dat niet zo is |
| De bestandsnaam komt overeen met de beoogde omgeving | Faalt als bijvoorbeeld een productieomgeving in een niet-productiebestandsnaam staat |
Al het andere in een spoke-bestand wordt niet gecontroleerd en vraagt om de handmatige review (Review van spoke-pull requests). De pipelineoutput vertelt welke bestanden faalden en, na selectie van een mislukt item, de problemen erin.
Onderdelen¶
| Wat | Repository | Opmerking |
|---|---|---|
| Validatiescript (een PowerShell-script) | Coderepository | Onderdeel van het platform. Wijzig het niet in je kopie. |
| Pipelinebestand | Configuratierepository | Er bestaat een starterbestand. Pas het aan. |
spokeschema.json |
Configuratierepository | Er bestaat een starterbestand. Pas het aan, zie Het schema aanpassen. |
.vscode/settings.json |
Configuratierepository | Koppelt het schema aan de spoke-bestanden in Visual Studio Code (De JSON-bestanden bewerken met schema-ondersteuning). |
De pipeline inrichten¶
- Maak een pipeline van het bestaande YAML-bestand in de configuratierepository. Noem hem bijvoorbeeld
VerifySpokeFiles. - Draai hem één keer met de hand en autoriseer de pipeline om de variable group, de agent pool en de service connection te gebruiken. Geplande en getriggerde runs kunnen niet om die goedkeuring vragen.
- Werk het pipelinebestand bij (volgende sectie).
- Voeg de pipeline toe als build validation aan de branch policy van
main(hieronder).
Pipelinebestand¶
Het bestand heeft geen eigen trigger (trigger: none). Het checkt de configuratierepository en de coderepository uit op een
versietag, en draait het script met deze argumenten. Een korte, geanonimiseerde excerpt:
trigger: none
variables:
- group: <variable-group-of-the-spoke-deployment>
resources:
repositories:
- repository: spokedeployment-tf
type: git
name: "<project>/<code-repository>"
ref: refs/tags/<version> # update with every new code version
steps:
- checkout: self
path: s/spokedeployment-params
- checkout: spokedeployment-tf
path: s/spokedeployment-tf
- task: AzurePowerShell@5
displayName: "Verify SpokeFiles"
inputs:
azureSubscription: $(ServiceConnectionName)
ScriptType: "FilePath"
ScriptPath: $(System.DefaultWorkingDirectory)/spokedeployment-tf/Scripts/<validation-script>.ps1
ScriptArguments: -SpokeFilePath <spoke-folder> -SpokeSchemaPath <schema-file> -ProdEnvironmentsList "acc,prd,prod" -NonProdEnvironmentsList "dev,tst,test" -ExludedFilenames ""
pwsh: true
Werk minstens deze bij:
| Item | Wat te doen |
|---|---|
| Variable group | Alleen als de naam afwijkt van de variable group van je spoke-deployment. |
ref van de coderepository |
Zet op de tag van de codeversie die je draait, en wijzig hem bij elke upgrade (Wat te doen als een nieuwe versie wordt gereleased). |
SpokeFilePath |
De map met de spoke-bestanden. Laat normaal de standaardwaarde van het starterbestand staan. |
SpokeSchemaPath |
Het pad van je spokeschema.json. Laat normaal de standaardwaarde staan. |
ProdEnvironmentsList |
Kommagescheiden omgevingen die als productie gelden. Standaard in het starterbestand: acc,prd,prod. |
NonProdEnvironmentsList |
Kommagescheiden omgevingen die als niet-productie gelden. Standaard: dev,tst,test. |
ExludedFilenames |
Kommagescheiden bestandsnamen die niet worden geverifieerd. Normaal leeg. De parameternaam is in het script zo gespeld. |
Verplicht stellen op main¶
In Azure DevOps: Repos, Branches, de branch main, Branch policies, Build validation, voeg de pipeline toe. Dan start elke
pull request, en elke nieuwe commit daarin, de controle, en een mislukte controle blokkeert de goedkeuring. Stel hem in als required.
Het schema aanpassen¶
Het starter-spokeschema.json volgt de algemene structuur van de spoke-JSON. De meeste
organisaties delen dezelfde structuur en verschillen in een paar toegestane waarden. Pas deze drie aan:
| Property | Wat het bevat | Aanpassen |
|---|---|---|
environment |
Een enum met de toegestane omgevingsnamen |
De omgevingen die je gebruikt, bijvoorbeeld dev, tst, acc, prd. Houd het in lijn met ProdEnvironmentsList en NonProdEnvironmentsList. |
managementGroupId |
Een enum met de management groups waarin een spoke-subscription mag worden geplaatst |
De namen van je landing zone management groups. Ze moeten bestaan in de hubconfiguratie (Spoke-JSON-referentie). |
tags |
Een object met de toegestane tags, en een required-lijst |
Je tagset. Zet een tag in required als een ontbrekende tag de controle moet laten falen. Zie Naamgeving en tags. |
Een excerpt, met placeholders:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Schema for spoke canvas deployment",
"type": "object",
"properties": {
"workloadShortName": { "type": "string", "maxLength": 6 },
"environment": { "type": "string", "enum": ["dev", "tst", "acc", "prd"] },
"managementGroupId": {
"type": "string",
"enum": ["<prefix>-landingzone-corp-prd", "<prefix>-landingzone-online-prd"]
},
"tags": {
"type": "object",
"properties": { "owner": { "type": "string" }, "pii": { "type": "string", "enum": ["yes", "no"] } },
"required": ["owner", "department", "workload", "pii", "costcentre", "environment"]
}
}
}
Het volledige schema beschrijft ook adInfo (ledenlijsten, PIMGroupConfig met de waarden nopim, self-approve en
approval, en de toegestane SPNGraphPermissions), targetRegions, azdo en resourceconfiguration. Neem het schema van
jouw codeversie als basis en houd het na elke upgrade actueel, omdat het schema elk veld moet accepteren dat de
Terraform leest (Bekende problemen).
In de editor¶
Koppel het schema in .vscode/settings.json aan de spoke-bestanden, zodat auteurs fouten zien terwijl ze typen: een probleem wordt onderstreept
en Ctrl+Space stelt waarden voor.
{
"json.schemas": [
{ "fileMatch": ["/**/canvas_*.json"], "url": "./spokeschema.json" }
]
}
Meer hierover in De JSON-bestanden bewerken met schema-ondersteuning.