Zum Inhalt

Pipelines und Skripte der Bibliothek

Das Repository automatisiert Tests, Dokumentation, Release und Auslieferung. Diese Seite listet die pipelines in pipelines/ und die Skripte in scripts/ auf, damit das pflegende Team weiß, was wann läuft. Der Release-Ablauf selbst steht in Release und Dokumentation, die Tests in Testen.

Referenzdesign, dein Deployment kann abweichen

Die pipelines sind Azure-Pipelines-Definitionen, die auf privaten Agents laufen und eine service connection zu einer Test- subscription nutzen. Namen von Pools, service connections und subscriptions sind spezifisch für das pflegende Team und stehen hier nicht.

Pipelines

Pipeline Trigger Zweck
CI für Terraform (CI-terraform.yaml) Pull requests, die modules/terraform, examples/terraform oder tests/terraform ändern, und ein wöchentlicher Zeitplan Erzeugt die Moduldokumentation, legt die shared resources an, führt die Terratest-Tests aus
CI für Bicep (CI-bicep.yaml) Pull requests, die modules/bicep, examples/bicep oder tests/bicep ändern, und ein wöchentlicher Zeitplan Dasselbe für Bicep, mit Pester
Release (release.yaml) Jeder push auf main Legt die neuen Versions-tags pro Modul an
Manuelles Deploy und Destroy (deploy_destroy_manual.yaml) Manuell Deployt oder entfernt ein Beispiel, um ein Modul zu bauen und auszuprobieren
IaC Accelerator für Terraform und für Bicep (terraform_iac_accelerator.yaml, bicep_iac_accelerator.yaml) Manuell Deployt das Accelerator-Projekt in die Dev- oder Prod-Test-subscription

Die pipelines nutzen vier gemeinsame Templates in pipelines/templates/: eines, um die shared resources anzulegen (dependencies.yaml), eines, um Dokumentation zu erzeugen und zu committen (docs.yaml), und je eines, um Terraform- und Bicep- Beispiele zu deployen (terraform.yaml, bicep.yaml).

CI-pipelines

Beide CI-pipelines haben dieselben drei Jobs:

flowchart LR
    docs["docs: generate and commit documentation"] --> shared["shared_resources: create dependencies"]
    shared --> deploy["deployment: run the tests"]
Job Was er tut
docs Läuft auf jedem Branch außer main. Aktualisiert den Template-Index in der Haupt-README, erzeugt die Moduldokumentation neu (terraform-docs für Terraform, das Skript Set-Module für Bicep) und committet die geänderten Dateien README.md und main.json mit der Nachricht Updated documentation [skip ci] zurück auf den Branch.
shared_resources Legt den Storage für den Terraform-state mit einem Bicep-Template an, führt terraform apply für dependencies/ aus und exportiert die Ausgabe shared_resources als JSON für den nächsten Job (Shared resources).
deployment Schreibt das JSON nach shared_resources.json, führt die Tests aus, wandelt die Ergebnisse in einen JUnit-Bericht um (der Terraform-Log-Parser von Terratest, der Pester-JUnit-Export) und veröffentlicht die Testergebnisse. Der Job hat ein Timeout von 180 Minuten.

Die Tests laufen parallel: Terratest mit -parallel 10, Pester mit einem thread job pro Testfile.

Was getestet wird. Ein geplanter Lauf und ein manueller Lauf testen alles. Ein pull request führt nur die Tests der Module aus, die er ändert. Er findet sie anhand der geänderten Dateien in modules, examples und tests. Ändert der pull request irgendetwas anderes (zum Beispiel eine pipeline oder ein Skript), laufen alle Tests. Änderungen an Markdown-Dateien und an iac_accelerator/ zählen nicht als solche Änderungen. Der wöchentliche Lauf (dienstags, früh am Morgen, UTC) läuft immer auf main, auch wenn sich nichts geändert hat.

Parameter für einen manuellen Lauf.

Pipeline Parameter Bedeutung
CI für Terraform SpecificTest Der Name eines Tests (zum Beispiel TestKeyVault). Der Standard * führt alle Tests aus.
CI für Terraform DocsOnly Nur die Dokumentation erzeugen und die Tests überspringen
CI für Bicep SpecificTest Ein Filter für Testfiles (zum Beispiel keyVault.Tests.ps1). Der Standard führt alle aus.
CI für Bicep SkipTests, SkipDocs Die Tests oder die Dokumentation überspringen
CI für Bicep moduleName Das Modul, für das Dokumentation erzeugt wird, oder all

Release-pipeline

Die Release-pipeline läuft bei jedem push auf main und nicht bei pull requests. Sie checkt das Repository mit zwei Commits Historie aus und führt scripts/New-Release.ps1 aus, das alle Modulordner durchgeht und für jedes Modul, das sich geändert hat, einen tag anlegt. Siehe Release und Dokumentation und Versionierung.

Die pipeline führt keine Tests aus. Die Tests laufen beim pull request und jede Woche.

Manuelles Deploy und Destroy

Parameter Bedeutung
action apply oder destroy
template_path Der Pfad, aus dem deployt wird. Er muss terraform oder bicep enthalten. Der Standard ist der Ordner mit den Terraform-Beispielen.
enable_policy_scan Die Policy-Prüfung nach dem Deployment ausführen

Die pipeline legt zuerst die shared resources an und deployt dann das Beispiel. Für Terraform führt sie init (mit dem state- Storage als Backend), validate, plan und apply oder destroy aus. Für Bicep führt sie az deployment sub create aus, und bei destroy löscht sie die resource group, die das Deployment zurückgegeben hat.

Skripte

Alle Skripte sind PowerShell.

Skript Zweck
New-Release.ps1 Geht jeden Modulordner durch und ruft dafür New-ModuleRelease auf. Leere Ordner werden übersprungen.
New-ModuleRelease.ps1 Für ein Modul: prüft, ob das Modul für ein Release infrage kommt, berechnet die Zielversion und legt den tag an und pusht ihn.
Set-Module.ps1 Erzeugt, was sich für ein Bicep-Modul erzeugen lässt: die kompilierte main.json, die README.md und fehlende Dateien und Ordner. Optionen überspringen jeweils eines der drei, und -Recurse behandelt alle Module in einem Pfad.
New-TerraformModule.ps1 Legt ein neues Terraform-Modul als Gerüst an: den Ordner, _header.md, CHANGELOG.md, version.json, main.tf, leere Variablen- und Output-Dateien, das Docs-Beispiel, einen Terratest-Test und ein Beispiel, mit eingetragenem Modulnamen.
Set-XmtIndex.ps1 Erzeugt den Template-Index in der Haupt-README neu: eine Tabelle mit jedem Modul und einem Link für jede Technologie, die es hat.
Publish-ModuleToACR.ps1 Veröffentlicht die Bicep-Module eines Moduls in einer Container Registry, für eine Version oder alle Versionen, aus den Git-tags.
helper/ Funktionen, die die obigen Skripte nutzen: Versionsberechnung, Erkennung von Änderungen, Anlegen von tags, README-Erzeugung für Bicep und Prüfungen für referenzierte Module. Templates für neue Module liegen in helper/module_templates.

Publish-ModuleToACR.ps1 prüft, dass der tag existiert, dass das Modul eine main.bicep hat und dass die Registry mit Push-Rechten erreichbar ist. Es überspringt Versionen, die die Registry schon hat, und veröffentlicht die anderen als modules/<technology>/<module>:<version>, mit einem Link zur README an diesem tag als Dokumentation. Die pipeline, die es für jeden Nutzer aufruft, liegt außerhalb dieses Repositorys (Release und Dokumentation).

Versionsberechnung in Kürze

Die Skripte vergleichen die Dateien des letzten Commits mit dem Filter in version.json, um zu entscheiden, ob sich ein Modul geändert hat. Dann bilden sie die Version aus MAJOR.MINOR der version.json und einem berechneten PATCH: auf 0 zurückgesetzt, wenn sich version.json geändert hat, sonst der höchste vorhandene Patch plus eins. Details stehen in Versionierung.

Entwicklungsumgebung

Der Ordner .devcontainer/ definiert einen Development Container mit Terraform, terraform-docs, Azure CLI mit Bicep, PowerShell, Go, Git und Docker-in-Docker. Sein Setup-Skript meldet sich mit einem Service Principal an, legt die shared resources an und schreibt shared_resources.json für die Terraform- und Bicep-Tests und installiert Pester. Contributors nutzen ihn, um Tests lokal auszuführen.

Automatische Updates des Accelerators

Ein geplanter Workflow führt jede Woche Renovate auf dem Repository aus, beschränkt auf iac_accelerator/. Er hält die Modulversionen und Provider im Accelerator aktuell und öffnet pro Update-Gruppe einen pull request. Nutzer bekommen dasselbe Setup in ihrer Kopie des Accelerators (Module aktuell halten).