CONNECTED Conference 2023 - Aufzeichnungen jetzt hier verfügbar +++                     

Suche

über alle News und Events

 

Alle News

 

Messaging mit dem Service Bus ermöglicht die...

Weiterlesen

Sebastian Meyer, Microsoft & SAP...

Weiterlesen

Für Entwickler, Architekten, Projektleiter und...

Weiterlesen

In der Welt der Softwareentwicklung ist die...

Weiterlesen

QUIBIQ spendet für den guten Zweck – und für...

Weiterlesen

Eine bestimmte Antwort auf einen HTTP Request zu...

Weiterlesen

In einer Welt, die von stetigem Wandel geprägt...

Weiterlesen

In einem unserer Kundenprojekte, war das Ziel eine...

Weiterlesen

QUIBIQ Hamburg wird mit dem Hamburger...

Weiterlesen

Zwei Tage lang wurde vom 14.-15.11 wieder das...

Weiterlesen

How-to: Wie man eine modulare Azure-Deployment-Pipeline in YML baut

Will man in Azure eine Deployment-Pipeline bauen, stehen dafür mehrere Möglichkeiten zur Verfügung, z.B. ARM Templates. In diesem Artikel stelle ich das Deployment mittels einer YML Pipeline in Unterstützung von Powershell vor. Dabei möchte ich zeigen, wie man die Pipeline modular so bauen kann, sdass man diverse Templates in einem zentralen Repository liegen hat, die man dann in diversen Pipelines in mehreren Projekten verwenden kann.

Ein zentrales Repository anlegen

Zunächst sollte ein Repository angelegt werden. Dieses soll unsere Powershell Scripts und YML Templates beinhalten. Ich schlage hierfür folgende Ordnerstruktur vor:

Das Powershell Script

Als nächstes sollte das Powershell Script angelegt werden. Ein solches Script könnte wie folgt aussehen:

[CmdletBinding()]
param (

    # Name of the Event Grid Domain.
    [Parameter(Mandatory=$true, HelpMessage="Name of the Event Grid Domain.")]
    [Alias("n")]*
    [string]$Name,

    # Name of the Location, like westeurope.
    [Parameter(Mandatory=$true, HelpMessage="Name of the Location.")]
    [Alias("l")]
    [string]$Location,   

    # Name of the Resource Group.
    [Parameter(Mandatory=$true, HelpMessage="Name of the Resource Group.")]
    [Alias("g")]
    [string]$ResourceGroup

)

Write-Verbose"Deploy Event Grid Domain $Name..."

azeventgriddomaincreate--name"$Name"-g"$ResourceGroup"-l"$Location"

 

$endpoint= $(azeventgriddomainlist-g"$ResourceGroup"--query"[?name=='$Name'].endpoint"-otsv)
Write-Output ("##vso[task.setvariable variable=DeployEventGridDomainOutput.Endpoint;issecret=true]$endpoint")

$domainKey= $(azeventgriddomainkeylist--name"$Name"--resource-group"$ResourceGroup"--query"key1"-otsv)
if (!$domainKey)
{
    Write-Error"EventGrid Domain key '$Key' could not be found in EventGrid Domain '$Name'!"

}
else
{
    Write-Output ("##vso[task.setvariable variable=DeployEventGridDomainOutput.Key;issecret=true]$domainKey")

}

Write-Verbose"Event Grid Domain created"

 

Das YML Template

Anschließend können wir ein YML Step Template erzeugen, dieses könnte in etwa so aussehen:

parameters:
nameAzureSubscription
  typestring
nameName
  typestring
nameLocation
  typestring
nameResourceGroup
  typestring
nameScriptPath
  typestring
  default'$(Build.SourcesDirectory)/shared/pipelines/scripts'

steps:
taskAzureCLI@2
  displayName'Deploy EventGrid Domain ${{ parameters.Name }}'
  inputs:
    azureSubscription${{ parameters.AzureSubscription }}
    scriptTypepscore
    scriptPath'${{ parameters.ScriptPath }}/Deploy-EventGrid-Domain.ps1'
    arguments'-Name "${{ parameters.Name }}" -Location "${{ parameters.Location }}" -ResourceGroup "${{ parameters.ResourceGroup }}"'
    powerShellErrorActionPreferencestop
    addSpnToEnvironmentfalse
    useGlobalConfigfalse
    failOnStandardErrorfalse
    powerShellIgnoreLASTEXITCODEfalse

Das Template nimmt die Parameter entgegen, die das PowerShell Script selbst benötigt und leitet diese als Argumente weiter. Außerdem nimmt es den ScriptPath als Parameter entgegen, gibt hierfür jedoch einen Standardpfad an. Das erlaubt es uns, das zugehörige Script auch als lokale Kopie einzubinden, falls Beispielsweise kurzzeitig etwas am Script lokal getestet werden soll.

Einbinden in eine Pipeline

Nun, da das YML-Template und das Powershell-Script existieren, können wir das Ganze in einer tatsächlichen Pipeline einbauen und verwenden.

name'1.$(Year:yy).$(DayOfYear)$(Rev:rr)'

# TODO: Hier stünden natürlich noch Dinge wie Trigger, Pools, Variablen etc.

resources:
  pipelines:
  - 
pipelineshared
    sourceMy.Project.SharedPipelineRepository

stages:
stagedeploy_eventgrid_domain_stage
  displayNameDeploy EventGrid Domain
  dependsOn: [dependency_stage_a, dependency_stage_b]
  jobs:
  - 
deploymentdeploy_eventgrid_domain_job
    displayNameDeploy EventGrid Domain
    workspace:
      cleanall
    environment$(MyProject.Environment)
    strategy:
      runOnce:
        deploy:
          steps:
          - 
checkout: self
            path: s
          -
checkout: shared
            path: shared

          - templatetemplates/steps/Deploy-EventGrid-Domain.yml@shared
            parameters:
              AzureSubscription$(Shared.ServiceConnection.Stateful)
              Name$(MyProject.EventGridDomainName)
              Location$(MyProject.DefaultLocation)
              ResourceGroup$(MyProject.ResourceGroupNameStateless)

Wichtig sind hierbei folgende Punkte:

  • Wenn ein Repository wie shared eingebunden wurde, und etwas aus dem eigentlichen Repository benötigt wird, muss self, sofern im Job benötigt, explizit ausgecheckt werden. Hierbei sollte der Pfad auf den Wert „s“ gesetzt werden, da dies das Standardverhalten wäre, wenn der Checkout nicht explizit vorgenommen werden würde.
  • Das shared-Repository sollte mit dem Pfad „shared“ ausgecheckt werden. Im Template haben wir den Standardpfad so konfiguriert, dass dieser automatisch passt. Sollte ein anderer Name gewollt sein, so sollte dieser überall angepasst werden

 

Schlusswort

Dieses Beispiel stellt natürlich keine komplette Pipeline dar, sondern lediglich einen simplen Step. Man kann sich damit aber wunderbar Module aufbauen, um alles Mögliche zu erreichen und einzustellen, ganz nach den jeweiligen Bedürfnissen.

Und da man alle Steps und Scripte an einem Ort hat, kann man diese einfacher pflegen und verhindert so gekonnt, dass sich mehrere Pipelines individuell auseinanderentwickeln.

Ihre Kontaktmöglichkeiten

Sie haben eine konkrete Frage an uns


 

Bleiben Sie immer auf dem Laufenden


 

Mit meinem "Ja" erkläre ich mich mit der Verarbeitung meiner Daten zur Zusendung von Informationen einverstanden. Ich weiß, dass ich diese Erklärung jederzeit durch einfache Mitteilung widerrufen kann. Bei einem Nein an dieser Stelle erhalte ich zukünftig keine Informationen mehr.

© QUIBIQ GmbH · Impressum · Datenschutz