Delen via


Platformoverschrijdende scripting

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

Azure Pipelines kan pijplijnen uitvoeren op Linux-, macOS- en Windows-computers. Als u platformoverschrijdende ontwikkeltechnologieën zoals .NET Core, Node.jsof Python gebruikt, brengen deze platformoverschrijdende buildmogelijkheden zowel voordelen als uitdagingen met zich mee. De meeste pijplijnen bevatten bijvoorbeeld een of meer scripts die tijdens het buildproces moeten worden uitgevoerd, maar scriptsyntaxis verschillen vaak ten opzichte van platforms.

In dit artikel wordt uitgelegd hoe u platformoverschrijdende scripting kunt gebruiken om verschillende buildplatforms te ondersteunen. U kunt een Azure Pipelines-stap script gebruiken om het schrijven van platformoverschrijdende scripts te vereenvoudigen. U kunt voorwaarden ook gebruiken om scripts te richten op specifieke platforms.

Scriptstap

Het trefwoord script is een snelkoppeling voor de commandoregeltaak, waarop Bash wordt uitgevoerd op Linux en macOS of cmd.exe op Windows.

U kunt argumenten script eenvoudig doorgeven aan een platformoverschrijdend hulpprogramma. De script stap wordt uitgevoerd in de systeemeigen script-interpreter van elk platform, Bash in macOS en Linux of cmd.exe in Windows. In het volgende voorbeeld wordt er een stap gebruikt om script aan te roepen met een set argumenten.

steps:
- script: |
    npm install
    npm test

Omgevingsvariabelen

Opdrachtregel, PowerShell en Bash verwerken omgevingsvariabelen verschillend. Als u toegang wilt krijgen tot een door het systeem geleverde waarde, zoals PATH, moet u een andere syntaxis per platform gebruiken.

Azure Pipelines maakt gebruik van macrosyntaxis als platformoverschrijdende manier om tijdens runtime te verwijzen naar variabelen. Variabelen met macrosyntaxis worden verwerkt voordat een taak tijdens runtime wordt uitgevoerd. De variabele wordt uitgebreid voordat de platformshell deze tegenkomt.

Als u de macrosyntaxis in een pijplijn wilt gebruiken, moet u de naam van de variabele als volgt omsluiten: $(<variable name>) In het volgende platformonafhankelijke voorbeeldscript wordt de ID van de pijplijn weergegeven.

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

Deze syntaxis werkt ook voor variabelen die u in de pijplijn definieert.

variables:
  Example: 'myValue'

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

Bash-taak

Als u complexere scripts nodig hebt, kunt u ze schrijven in Bash en de Bash-taak in uw pijplijn gebruiken. De meeste macOS- en Linux-agents gebruiken Bash als shell en Windows-agents kunnen Git Bash of Windows-subsysteem voor Linux Bash gebruiken. Door Microsoft gehoste agents hebben standaard Bash vooraf geïnstalleerd.

In het volgende voorbeeld wordt een Bash-taak uitgevoerd waarmee u kunt bepalen of een build moet worden geactiveerd.

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

Opmerking

PowerShell is ook een optie voor scripts. Met de pwsh snelkoppeling wordt PowerShell 7.x uitgevoerd op macOS, Linux of Windows. Agents moeten PowerShell 7.x geïnstalleerd hebben. Door Microsoft gehoste agents zijn standaard PowerShell 7.x geïnstalleerd.

Overschakelen op basis van platform

Platformspecifieke scripting om pijplijnlogica te dupliceren zorgt voor extra werk en een verhoogd foutrisico. Maar als u platformspecifieke scripts niet kunt vermijden, kunt u voorwaarden gebruiken om te detecteren op welk platform u zich bevindt.

Als u bijvoorbeeld het IP-adres van de buildagent wilt ophalen, moet u ifconfig gebruiken op macOS, ip addr op Ubuntu Linux en de Get-NetIPAddress cmdlet in Windows PowerShell. De volgende pijplijn haalt die informatie van agents op verschillende platforms op met behulp van voorwaarden.

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

# use the value
- script: |
    echo The IP address is $(IP_ADDR)