Suche

über alle News und Events

 

Alle News

 

Durable Function ist eine Erweiterung der...

Weiterlesen

Wir haben eine gute, vor allem spannende und hoch...

Weiterlesen

Am 09.05.2022 wurde ein Artikel von Microsoft...

Weiterlesen

Neben den altbekannten Logic Apps (Consumption),...

Weiterlesen

Im Jahr 2022 fallen eine Reihe von .Net Versionen...

Weiterlesen

SAP in die Power Platform integrieren – In einem...

Weiterlesen

Bicep Templates benutzen eine deklarative Syntax...

Weiterlesen

In BizTalk gibt es einige Alternativen, wie...

Weiterlesen

Wir sind auf ein seltsames Phänomen bei einem...

Weiterlesen

Nach der Migration konnten in VS 2019 „normale“...

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