Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Azure Pipelines kan köra pipelines på Linux-, macOS- och Windows-datorer. Om du använder plattformsoberoende utvecklingstekniker som .NET Core, Node.jseller Python ger dessa plattformsoberoende byggfunktioner både fördelar och utmaningar. De flesta pipelines innehåller till exempel ett eller flera skript som ska köras under byggprocessen, men skriptsyntaxen skiljer sig ofta mellan olika plattformar.
Den här artikeln beskriver hur du kan använda plattformsoberoende skript för att stödja olika byggplattformar. Du kan använda ett Azure Pipelines-steg script för att underlätta skrivning av plattformsoberoende skript. Du kan också använda villkor för att rikta skript till specifika plattformar.
Skriptsteg
Skriptnyckelordet är en genväg för kommandoradsaktiviteten, som kör Bash på Linux och macOS eller cmd.exe i Windows.
Du kan använda script för att enkelt skicka argument till ett plattformsoberoende verktyg. Steget script körs i varje plattforms inbyggda skripttolkare, Bash på macOS och Linux eller cmd.exe i Windows. I följande exempel används ett script steg för att anropa npm med en uppsättning argument.
Miljövariabler
Kommandorad, PowerShell och Bash löser miljövariabler på olika sätt. Om du vill komma åt ett systembaserat värde som PATH måste du använda en annan syntax per plattform.
Azure Pipelines använder makrosyntax som ett plattformsoberoende sätt att referera till variabler vid körning. Variabler med makrosyntax bearbetas innan en aktivitet körs under körningen. Variabeln expanderas innan plattformsgränssnittet stöter på den.
Om du vill använda makrosyntax i en pipeline omger du variabelnamnet på följande sätt: $(<variable name>). Följande plattformsoberoende exempelskript återger ID:t för pipelinen.
steps:
- script: echo This is pipeline $(System.DefinitionId)
Den här syntaxen fungerar även för variabler som du definierar i pipelinen.
variables:
  Example: 'myValue'
steps:
- script: echo The value passed in is $(Example)
Bash-uppgift
Om du behöver mer komplexa skript kan du skriva dem i Bash och använda Bash-uppgiften i din pipeline. De flesta macOS- och Linux-agenter använder Bash som gränssnitt, och Windows-agenter kan använda Git Bash eller Windows-undersystem för Linux Bash. Microsoft-värdbaserade agenter har Bash förinstallerat som standard.
I följande exempel körs en Bash-uppgift som hjälper dig att fatta ett beslut om huruvida ett bygge ska utlösas.
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
Anmärkning
PowerShell är också ett alternativ för skript. Genvägen pwsh kör PowerShell 7.x på macOS, Linux eller Windows. Agenter måste ha PowerShell 7.x installerat. Microsoft-värdbaserade agenter har PowerShell 7.x installerat som standard.
Plattformsbaserad växling
Plattformsspecifik skriptning för att duplicera pipelinelogik orsakar extra arbete och ökad felrisk. Men om du inte kan undvika plattformsspecifika skript kan du använda villkor för att identifiera vilken plattform du är på.
Om du till exempel vill hämta IP-adressen för byggagenten måste du använda ifconfig på macOS, ip addr Ubuntu Linux och cmdleten Get-NetIPAddress i Windows PowerShell. Följande pipeline hämtar den informationen från agenter på olika plattformar genom att använda villkor.
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)