Ga naar inhoud

Pipelines en workflows

Elke deployment draait vanuit een entry pipeline in de configuratierepository: Azure DevOps YAML onder pipelines/, of een GitHub Actions workflow onder .github/workflows/. Entry pipelines zijn dun. Ze geven een paar parameters door aan een herbruikbaar template in de coderepository, en dat template roept de Xebia.Mcp module aan. Azure DevOps en GitHub Actions worden functioneel identiek gehouden (docs/PIPELINE_SYNCHRONIZATION.md en .github/workflows/COUNTERPARTS.md in de coderepository).

Entry pipelines

Entry (ADO pipelines/ en GitHub .github/workflows/) Roept template aan (coderepository) Gebruik voor
hub.yaml ADO .azure-devops/pipelines/templates/stage-mcp-hub.yaml, GitHub .github/workflows/stage-mcp-hub.yaml Elke hub-wijziging: firewall, App Gateway, policies, features, tags, management groups
hub-destroy.yaml idem, met destroy: true Een hub afbreken (in de referentierepository alleen canary)
spoke.yaml stage-mcp-spoke.yaml Spokes aanmaken of wijzigen
spoke-destroy.yaml stage-mcp-spoke.yaml, met destroy: true Spokes verwijderen
infrastructure.yaml stage-infrastructure.yaml De job runners deployen of bijwerken
container.yaml stage-container.yaml Het mcp container image bouwen

De coderepository heeft daarnaast:

  • update-spn.yaml: slaat het secret van de deployment-SPN op in de hub Key Vault en roteert het;
  • test.yaml: stresstest van de runner;
  • pull-request.yaml (ADO) en ci.yml (GitHub): CI voor de code zelf, zie Nieuwe functionaliteit bouwen;
  • report-version.yaml (alleen Azure DevOps, gepland): rapporteert de gepinde codeversie van klantrepositories aan de platformstatus-API (scripts/version-watcher);
  • trigger-sync.yaml (alleen GitHub): synct de code naar klant-remotes, zie Releasen en Code synchronisation.

Welke platformomgeving target elke entry?

Elke entry geeft per stage of job één mcp.json mee. Controleer dit voordat je draait, zeker bij de spoke pipelines: spoke-destroy moet dezelfde mcp.json gebruiken als de spoke-run die de spoke heeft aangemaakt. In de referentieconfiguratierepository target spoke.yaml prod, terwijl spoke-destroy.yaml canary target.

Parameters die je gaat wijzigen

Dit zijn template-parameters. In de referentieconfiguratierepository zijn de meeste hard-coded in de entry-YAML. Om er een te wijzigen pas je het entry-bestand aan in een pull request, of maak je er een run-time parameter van (zie Mode en whatIf tijdens het draaien beschikbaar maken).

Parameter Waarden Effect
mode Plan, Apply, ApproveModifications, ApproveDestroys Plan plant alleen. Apply plant en past toe zonder te stoppen. ApproveModifications stopt voor goedkeuring als een plan iets aanmaakt, wijzigt of verwijdert. ApproveDestroys stopt alleen als het plan iets verwijdert.
whatIf true, false true: Terraform plant nog steeds, maar de apply-stap wordt overgeslagen. Zie hieronder de uitzondering voor spokes.
approveLayers (alleen hub) lijst met layernamen, standaard [] Beperkt goedkeuringen tot deze layers. Leeg betekent dat elke layer goedkeuring kan vereisen.
destroy true, false Plant en past een destroy toe. Wordt gezet door de *-destroy entry-bestanden.
spokeGlob (alleen spoke) wildcardpatroon, relatief aan <env-folder>/spokes/ Selecteert de spoke-bestanden, bijv. team-a/canvas_app1_dev.json of team-a/*. Niet hoofdlettergevoelig.
environments (alleen spoke) geordende lijst van spoke-omgevingen Welke spoke-omgevingen draaien en in welke volgorde. Een gematcht bestand waarvan de environment niet in de lijst staat laat de config test falen.
imageRef bijv. mcp:latest De container image tag waarin de jobs draaien.

Uitzondering voor spokes bij whatIf

De spoke subscription layer wordt tijdens de Plan-stap altijd geplant en toegepast, ook met whatIf: true (Invoke-XebiaSpokePlanAction.ps1). Alleen de spoke canvas layer houdt zich aan whatIf. Op dit moment maakt de subscription layer alleen een subscription-alias aan als azureSubscriptionId leeg is.

Controleer voordat je draait

In de referentieconfiguratierepository (xms-cloud-platform-config) gebruikt hub.yaml mode: Apply met whatIf: false, dus canary en prod passen toe zonder goedkeuring. spoke.yaml gebruikt mode: Apply met whatIf: true, dus die plant alleen de spoke canvas. Bepaal welk gedrag je wilt en pas de entry-bestanden aan voordat je erop vertrouwt.

Wat een hub-run doet

  1. Prepare. Draait de unit tests en de config tests (Pester):

    • firewall-JSON tegen src/Xebia.Mcp/Files/json/firewallschema.json, IP group-verwijzingen en prioriteiten;
    • App Gateway- en WAF-JSON tegen hun schema's;
    • de DNS baseline.

    Het bouwt ook de region matrix. Een falende config test stopt de run voordat Terraform start. 2. Voor elke layer, in layervolgorde: 1. <layer>_plan: terraform plan. Het plan-bestand en een JSON-samenvatting worden gepubliceerd als artifacts <layer>_<region>_<level> en <layer>_<region>_<level>_json. De samenvatting verschijnt als waarschuwing: Plan: X to add, Y to change, Z to destroy. 2. <layer>_analyse en <layer>_approve: alleen in de Approve* modes. Ze pauzeren voor goedkeuring als het plan bij de mode past. 3. <layer>_apply: past het opgeslagen plan-bestand toe, dus wat je hebt goedgekeurd wordt exact toegepast. Wordt overgeslagen in Plan mode. 3. Clean: geeft de reservering van de runner vrij.

Een plan dat resources verwijdert markeert de plan-taak als Succeeded with issues (oranje). Zie dat als signaal om het plan te lezen.

Wat een spoke-run doet

Om de identity, service connections, codetoegang en integraties voor spoke-deployments voor te bereiden, zie De spoke pipeline voorbereiden en Spoke-integraties voorbereiden.

  1. Prepare: draait de unit tests en de hub config tests (dus een kapotte firewall-JSON blokkeert ook spoke-runs), daarna de spoke config tests. Het zoekt *.json onder <env-folder>/spokes/ die bij spokeGlob passen en groepeert ze per spoke- omgeving. De run faalt als:
    • de glob geen enkel bestand matcht;
    • een gematcht bestand niet geldig is volgens spokeschema.json;
    • de environment van een gematcht bestand niet in environments staat;
    • de managementGroupId van een gematcht bestand geen id is in <env-folder>/<targetRegions.primary>/foundation.auto.tfvars.
  2. Per spoke-omgeving, in de volgorde van environments, en pas nadat de vorige is geslaagd of overgeslagen:
    1. Plan: plant en past toe de subscription layer, en plant daarna de spoke canvas.
    2. Analyse en Approve: alleen Approve* modes.
    3. Apply: past het plan van de spoke canvas toe.
  3. Clean.

Wat de apply aanmaakt, staat beschreven in Spoke canvas. Om daarna te zien of een spoke nog overeenkomt met zijn bestand, zie Configuratie-driftdetectie.

Goedkeuringsmomenten

Hoe de beslissing wordt genomen:

  • Hub: per layer leest de analyse-stap de plansamenvattingen van de regio's van die layer en vraagt om goedkeuring als een plan bij de mode past (Invoke-XebiaHubAnalyseAction.ps1). Bekijk de Bekende problemen: in de versie die je pint leest de analyse-stap mogelijk alleen de samenvatting van de laatste regio.
  • Spoke: één analyse-stap per spoke-omgeving-stage. Die leest elke plansamenvatting die in die run is gedownload, inclusief plannen van de subscription layer en van eerdere omgevingen. Goedkeuring geldt dus per omgeving-stage, niet per spoke.

Waar je goedkeurt:

  • Azure DevOps: de <layer>_approve job is een ManualValidation@1 server job. Het template stelt geen approvers en geen notifyUsers in, dus niemand krijgt een melding. Houd de run in de gaten.
  • GitHub Actions: de goedkeuringsjob gebruikt de GitHub environment approval-required. Maak deze environment aan in de configuratierepository en voeg required reviewers toe. Zonder reviewers gaat de job door zonder te wachten.

Mode en whatIf tijdens het draaien beschikbaar maken

Azure DevOps (pipelines/hub.yaml):

parameters:
  - name: mode
    type: string
    default: Plan
    values: [Plan, Apply, ApproveModifications, ApproveDestroys]
  - name: whatIf
    type: boolean
    default: false

stages:
  - template: .azure-devops/pipelines/templates/stage-mcp-hub.yaml@mcp-code
    parameters:
      # ...existing parameters...
      mode: ${{ parameters.mode }}
      whatIf: ${{ parameters.whatIf }}

GitHub Actions (.github/workflows/hub.yaml):

on:
  workflow_dispatch:
    inputs:
      mode:
        type: choice
        options: [Plan, Apply, ApproveModifications, ApproveDestroys]
        default: Plan

jobs:
  canary:
    uses: xmms/xms-cloud-platform-code/.github/workflows/stage-mcp-hub.yaml@release/v4.12
    with:
      # ...existing inputs...
      mode: ${{ inputs.mode }}

Doe hetzelfde op beide platformen om de pariteit te bewaren.

Een pipeline draaien

Azure DevOps: Pipelines → de entry pipeline (bijvoorbeeld hub) → Run pipeline → kies de branch → vul de parameters in (bijvoorbeeld spokeGlob) → Run. Open een plan-job om het Terraform-plan te lezen, of download het plan-artifact.

GitHub Actions: Actions → de workflow (bijvoorbeeld spoke) → Run workflow → kies de branch → vul de inputs in → Run workflow. De planuitvoer staat in de joblogs en de geüploade artifacts.

Vereisten voor de pipelines

Azure DevOps

  • Service connections met de namen uit pipelines/variables.yaml (bijvoorbeeld <env>.serviceConnectionNameHub en <env>.serviceConnectionNameSpoke).
  • Een GitHub Enterprise service connection voor de mcp-code repository resource (endpoint: in elk entry-bestand; in de referentierepository xebia-managed-services-eu.ghe.com).
  • De agent pools <AgentPool> (Managed DevOps Pool) en <AgentPool>-CTR (container jobs), aangemaakt door de infrastructure pipeline.

GitHub Actions

  • Een federated credential (OIDC) op de service principals in mcp.json (Azure.TerraformState.Hub.ServicePrincipalId en .Spoke.ServicePrincipalId).
  • Repository-variabele cloud_platform_gh_app_id en secret cloud_platform_gh_app_private_key: de GitHub App die de coderepository uitcheckt (.github/actions/checkout-mcp-code).
  • De environment approval-required.

Een nieuwe platformomgeving opzetten (volgorde)

  1. Maak de Terraform state storage account(s), de spoke state container en de deployment service principal(s) aan, en geef ze toegang. Dit zijn vereisten die de pipelines niet aanmaken.
  2. Maak <env-folder>/mcp.json, global.auto.tfvars en de regio-tfvars aan.
  3. Draai infrastructure: job runners, plus de blob container in het hub state storage account.
  4. Draai container: het mcp image.
  5. Draai hub (eerst in Plan mode, daarna Apply).
  6. Draai spoke voor elke spoke.