De templates van versies voorzien¶
Workload teams moeten beslissen wanneer ze upgraden naar een nieuwe versie van een module. Daarom heeft de bibliotheek versies, en elke release is een tag die een team kan pinnen. De beslissing staat in Samenvatting van beslissingen.
Eén versie per module¶
Elke module heeft een eigen versielijn, met semantic versioning (MAJOR.MINOR.PATCH). Een git-tag
bevat de technologie, de modulenaam en de versie, bijvoorbeeld bicep/storage_account/1.0.1 of
terraform/storage_account/1.1.0.
| Optie | Waarom die niet is gekozen |
|---|---|
| Eén versie voor de hele oplossing | Het nummer is misleidend voor een team dat maar een deel van de modules gebruikt, of alleen Bicep of alleen Terraform. |
| Eén versie per technologie (Bicep, Terraform) | Nog steeds misleidend: een wijziging in één module verhoogt de versie van alle modules. |
| Eén versie per module | Gekozen. Het nummer zegt iets over de module die een team echt gebruikt. Het releaseproces is complexer. |
De strategie is gekozen met beperkte ervaring met gemengde Terraform- en Bicep-bibliotheken in één repository, en wordt in de praktijk getest.
Tags¶
| Technologie | Git-tag | Hoe een afnemer ernaar verwijst |
|---|---|---|
| Terraform | terraform/<module>/<version> |
De volledige tagnaam als ref in de modulebron |
| Bicep | bicep/<module>/<version> |
Alleen het versienummer, in de registryverwijzing .../modules/bicep/<module>:<version> |
Beide manieren staan in Een module aanroepen. De tags staan in de repository en in de alleen-lezen kopie van de afnemer. Wil je de documentatie van een versie lezen, schakel dan eerst over naar de bijbehorende tag.
Wie welk nummer wijzigt¶
Het proces is semi-automatisch:
| Onderdeel | Wie wijzigt het | Hoe |
|---|---|---|
MAJOR en MINOR |
De contributor | Met de hand, in het bestand version.json van de module |
PATCH |
De releasepipeline | Automatisch: de pipeline zet het nummer en maakt de tag aan als dat nodig is |
Het bestand version.json heeft twee eigenschappen: version (het nummer MAJOR.MINOR) en pathFilters (de bestanden die
meetellen). De versie van een module verandert als een bestand dat het filter selecteert wijzigt in de gemergete commit, of als
version.json zelf wijzigt. Een wijziging buiten de module (bijvoorbeeld in de pipelines) verhoogt hem niet. Wijzigingen die
alleen de documentatie raken ook niet.
| Technologie | Bestanden die een release starten |
|---|---|
| Terraform | De .tf-bestanden direct in de modulemap (niet in submappen), en version.json |
| Bicep | De gecompileerde main.json, en version.json. De main.json wordt door de documentatiejob uit main.bicep gegenereerd, dus een wijziging van de Bicep-code komt daarlangs in een release terecht. |
Het PATCH-nummer wordt berekend: het begint bij 0 als MAJOR.MINOR is gewijzigd, en anders is het het hoogste bestaande
patchnummer voor die MAJOR.MINOR plus één. Een tag die al bestaat voor de commit wordt niet opnieuw aangemaakt.
De pipeline moet draaien vanaf de branch main, en wijzigingen moeten via een squash commit in main komen, zodat de wijzigingen
sinds de vorige commit als één wijziging te lezen zijn (Release en documentatie).
Wanneer wat wijzigen¶
| Wijziging | Nummer |
|---|---|
| Een fix die de interface niet wijzigt | PATCH (automatisch) |
| Een nieuwe optionele parameter of output | MINOR |
| Een wijziging die bestaande aanroepen breekt: een verwijderde of hernoemde parameter, een gewijzigde standaardwaarde die het gedrag verandert, een nieuwe vaste waarde die niet compatibel is | MAJOR |
Deze tabel past de regels van semantic versioning toe op een module. Dezelfde principes als voor het platform zelf gelden: kondig een wijziging van een standaardwaarde aan voordat je hem doorvoert (Achterwaartse compatibiliteit).
Wijzigingen die in de praktijk een MAJOR-wijziging waren:
- Een instelling die een policy afdwingt werd verplicht, dus de parameter is verwijderd (bijvoorbeeld
enableAllLogsin diagnostics). - Een standaardwaarde veranderde naar de compliant waarde (bijvoorbeeld public network access van de Bicep-module voor het storage account).
- Een module stapte over op een andere providerresource, of wijzigde de vorm van een objectparameter.
De changelog¶
Elke module heeft een eigen changelogbestand (CHANGELOG.md in de modulemap), zodat een team kan zien wat er tussen twee
versies is veranderd zonder de hele geschiedenis van de repository te lezen. Een regel in de changelog hoort bij elke wijziging
die de versie verandert. Een item bevat de versie, een link die hem vergelijkt met de vorige tag, de datum en de kopjes
Features en Bug Fixes. Een kopje Known limitations wordt gebruikt als een release een kanttekening heeft die het team moet
kennen voor het upgradet, bijvoorbeeld een provider die na de update een tweede run nodig heeft. De pull-requesttemplate van de
repository vraagt om de changelog, om het versiebestand als MAJOR of MINOR wijzigt, en om tests voor een nieuwe module.
Upgradenotities¶
Een module met een brekende wijziging kan upgradenotities hebben in de map upgrade/, één bestand per major versie
(notes-v<major>.md). Daarin staan de stappen voor je code, en waar nodig voor de Terraform-state. Lees ze voor je de tag
wijzigt, en test de upgrade eerst in dev.
| Module | Technologie | Major versie | Wat er voor jou verandert |
|---|---|---|---|
storage_account |
Terraform | 1 | Objectparameters voor queue-eigenschappen en statische websites worden maps. Het ene Data Lake Gen2-bestandssysteem wordt een map van bestandssystemen. |
storage_account |
Bicep | 1 | Public network access staat standaard uit. Netwerkregels staan standaard op deny, met de bypass voor Azure-services. Zet publicNetworkAccess expliciet als je op het oude gedrag vertrouwde. |
sql_server |
Bicep | 1 | Waarden voor availability zones worden integers. De diagnostic-eigenschappen enableAllLogs en enableAllMetrics worden verwijderd. De sleutelparameters worden een object customerManagedKey. De identiteitsparameter krijgt een andere naam. De eigenschap voor system-assigned identity wordt verwijderd omdat die wordt afgedwongen. |
container_registry |
Terraform | 1 | retention_policy wordt retention_policy_in_days. De diagnostic-eigenschappen enable_allLogs en enable_allMetrics worden verwijderd. |
network_security_group |
Terraform en Bicep | 1 | De flow log-parameter wordt verwijderd, omdat flow logs op dit niveau niet meer worden ondersteund. In Terraform krijgt de parameter voor de diagnostic setting een andere naam, en een plan toont de verplaatsing. In Bicep worden de logcategorieën afgedwongen en wordt de parameter verwijderd. |
postgresql_flexibleserver |
Terraform | 1 | Het object voor de customer-managed key wordt vervangen door sleutel- en identiteits-ID's, ook voor de geo-back-up. |
container_app |
Terraform | 1 | De module stapt over van azurerm_container_app naar de provider azapi. Declareer azapi, bekijk de state moves in het plan, en hernoem een aantal variabelen (timeouts, custom domains, IP-restricties). |
container_app |
Terraform | 2 | De module bezit zijn eigen resourcelogica in plaats van een andere module te omwikkelen. Inputs en outputs zijn ongewijzigd. Het plan toont moves, en de eerste apply kan mislukken met een fout over een inconsistent resultaat die een tweede apply oplost. |
De tabel is een samenvatting. De notities in de modulemap zijn de bron.
Wat een gebruikend team doet¶
Het team pint een tag in de module-aanroep, en verzet de tag als het de changelog heeft gelezen en de nieuwe versie heeft getest (Managed templates gebruiken). De module declareert ook de providerversies die hij ondersteunt: een module die een provider nog beperkt tot een oudere major versie blokkeert een upgrade van de provider in de eigen code van het team (Providerversies). Een bot kan nieuwe versies voor je voorstellen (Houd modules up-to-date).