Platformoverschrijdende scripts uitvoeren

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Met Azure Pipelines kunt u uw builds uitvoeren op MacOS-, Linux- en Windows-computers. Als u ontwikkelt op platformoverschrijdende technologieën zoals .NET Core, Node.js en Python, brengen deze mogelijkheden zowel voordelen als uitdagingen met zich mee.

De meeste pijplijnen bevatten bijvoorbeeld een of meer scripts die u wilt uitvoeren tijdens het buildproces. Maar scripts worden vaak niet op verschillende platforms op dezelfde manier uitgevoerd. U kunt de script sneltoets voor trefwoorden gebruiken om het schrijven van scripts gemakkelijker te maken en ook voorwaarden te gebruiken om specifieke platforms met uw scripts te targeten.

Platformoverschrijdende hulpprogramma's uitvoeren met een scriptstap

Het trefwoord script is een snelkoppeling voor de opdrachtregeltaak. Het script trefwoord voert Bash uit op Linux en macOS en cmd.exe in Windows.

Het gebruik script kan handig zijn wanneer uw taak alleen argumenten doorgeeft aan een platformoverschrijdend hulpprogramma. Aanroepen npm met een set argumenten kan bijvoorbeeld eenvoudig worden uitgevoerd met een script stap. script wordt uitgevoerd in de systeemeigen script-interpreter van elk platform: Bash op macOS en Linux, cmd.exe in Windows.

steps:
- script: |
    npm install
    npm test

Omgevingsvariabelen verwerken

Omgevingsvariabelen gooien de eerste rimpel in het schrijven van platformoverschrijdende scripts. Opdrachtregel, PowerShell en Bash hebben elk verschillende manieren om omgevingsvariabelen te lezen. Als u toegang nodig hebt tot een door het besturingssysteem geleverde waarde, zoals PATH, hebt u verschillende technieken per platform nodig.

Azure Pipelines biedt echter een platformoverschrijdende manier om te verwijzen naar variabelen die het kent over de aangeroepen macrosyntaxis. Door de naam van een variabele in $( )te ronden, wordt deze uitgevouwen voordat de shell van het platform deze ooit ziet. Als u bijvoorbeeld de id van de pijplijn wilt echoën, is het volgende script platformoverschrijdend:

steps:
- script: echo This is pipeline $(System.DefinitionId)

Dit werkt ook voor variabelen die u in de pijplijn opgeeft.

variables:
  Example: 'myValue'

steps:
- script: echo The value passed in is $(Example)

Overweeg Bash of pwsh

Als u complexere scriptbehoeften hebt dan de bovenstaande voorbeelden, kunt u overwegen deze in Bash te schrijven. De meeste macOS- en Linux-agents hebben Bash als beschikbare shell en Windows-agents bevatten Git Bash of Windows-subsysteem voor Linux Bash.

Voor Azure Pipelines hebben de door Microsoft gehoste agents altijd Bash beschikbaar.

Als u bijvoorbeeld een beslissing moet nemen over of uw build wordt geactiveerd door een pull-aanvraag:

trigger:
    batch: true
    branches:
        include:
        - main
steps:
- bash: |
    echo "Hello world from $AGENT_NAME running on $AGENT_OS"
    case $BUILD_REASON in
            "Manual") echo "$BUILD_REQUESTEDFOR manually queued the build." ;;
            "IndividualCI") echo "This is a CI build for $BUILD_REQUESTEDFOR." ;;
            "BatchedCI") echo "This is a batched CI build for $BUILD_REQUESTEDFOR." ;;
        *) $BUILD_REASON ;;
    esac
  displayName: Hello world

PowerShell Core (pwsh) is ook een optie. Voor elke agent moet PowerShell Core zijn geïnstalleerd.

Overschakelen op basis van platform

Over het algemeen raden we u aan platformspecifieke scripts te vermijden om problemen zoals duplicatie van uw pijplijnlogica te voorkomen. Duplicatie veroorzaakt extra werk en extra risico op bugs. Als er echter geen manier is om platformspecifieke scripts te voorkomen, kunt u een condition gebruiken om te detecteren op welk platform u zich bevindt.

Stel dat u om een of andere reden het IP-adres van de buildagent nodig hebt. In Windows haalt ipconfig u die informatie op. In macOS is het ifconfig. En op Ubuntu Linux is het ip addr.

Stel de onderstaande pijplijn in en voer deze vervolgens uit op agents op verschillende platforms.

steps:
# Linux
- bash: |
    export IPADDR=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')
    echo "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Linux' )
  displayName: Get IP on Linux
# macOS
- bash: |
    export IPADDR=$(ifconfig | grep 'en0' -A3 | grep inet | tail -n1 | awk '{print $2}')
    echo "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Darwin' )
  displayName: Get IP on macOS
# Windows
- powershell: |
    Set-Variable -Name IPADDR -Value ((Get-NetIPAddress | ?{ $_.AddressFamily -eq "IPv4" -and !($_.IPAddress -match "169") -and !($_.IPaddress -match "127") } | Select-Object -First 1).IPAddress)
    Write-Host "##vso[task.setvariable variable=IP_ADDR]$IPADDR"
  condition: eq( variables['Agent.OS'], 'Windows_NT' )
  displayName: Get IP on Windows

# now we use the value, no matter where we got it
- script: |
    echo The IP address is $(IP_ADDR)