Udostępnij za pomocą


Wykonywanie skryptów międzyplatformowych

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

Usługa Azure Pipelines może uruchamiać potoki na maszynach z systemami Linux, macOS i Windows. Jeśli używasz międzyplatformowych technologii programowania, takich jak .NET Core, Node.jslub Python, te międzyplatformowe możliwości kompilacji przynoszą korzyści i wyzwania. Na przykład większość potoków obejmuje co najmniej jeden skrypt do uruchomienia podczas procesu kompilacji, ale składnia skryptu często różni się w zależności od platform.

W tym artykule wyjaśniono, jak można używać skryptów międzyplatformowych do obsługi różnych platform kompilacji. Możesz użyć kroku usługi Azure Pipelines script , aby ułatwić pisanie skryptów międzyplatformowych. Możesz również użyć warunków , aby kierować skrypty do określonych platform.

Krok skryptu

Słowo kluczowe skrypt jest skrótem zadania wiersza poleceń, które uruchamia Bash w systemach Linux i macOS oraz cmd.exe w systemie Windows.

Możesz użyć script, aby łatwo przekazać argumenty do narzędzia wieloplatformowego. Krok script jest uruchamiany w natywnym interpreterze skryptów każdej platformy: Bash w systemach macOS i Linux lub cmd.exe w systemie Windows. W poniższym przykładzie użyto kroku script do wywołania npm z zestawem argumentów.

steps:
- script: |
    npm install
    npm test

Zmienne środowiskowe

Interfejs wiersza poleceń, PowerShell i Bash inaczej przetwarzają zmienne środowiskowe. Aby uzyskać dostęp do wartości podanej przez system, takiej jak PATH, należy użyć innej składni na platformę.

Usługa Azure Pipelines używa składni makr jako międzyplatformowego sposobu odwoływania się do zmiennych w czasie wykonywania. Zmienne ze składnią makr są przetwarzane przed uruchomieniem zadania podczas wykonywania. Zmienna rozszerza się, zanim powłoka platformy ją napotka.

Aby użyć składni makr w potoku, umieść nazwę zmiennej w następujący sposób: $(<variable name>). Poniższy przykładowy skrypt międzyplatformowy wyświetla identyfikator pipeline'u.

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

Ta składnia działa także w przypadku zmiennych, które zdefiniujesz w potoku.

variables:
  Example: 'myValue'

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

Zadanie powłoki Bash

Jeśli potrzebujesz bardziej złożonych skryptów, rozważ napisanie ich w języku Bash i użycie zadania Bash w potoku. Większość agentów systemu macOS i Linux używa powłoki Bash, a agenci systemu Windows mogą używać Git Bash lub powłoki Bash w ramach Podsystemu Windows dla systemu Linux. Agenci hostowani przez firmę Microsoft domyślnie mają preinstalowaną powłokę Bash.

Poniższy przykład uruchamia zadanie Bash, które pomaga podjąć decyzję o tym, czy uruchomić kompilację.

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

Uwaga / Notatka

Program PowerShell jest również opcją dla skryptów. Skrót pwsh uruchamia program PowerShell 7.x w systemach macOS, Linux lub Windows. Agenci muszą mieć zainstalowany program PowerShell 7.x. Agenci hostowani przez firmę Microsoft domyślnie mają zainstalowany program PowerShell 7.x.

Przełączanie oparte na platformie

Skrypty specyficzne dla platformy, które duplikują logikę przetwarzania, powodują dodatkową pracę i zwiększają ryzyko błędów. Jeśli jednak nie możesz uniknąć skryptów specyficznych dla platformy, możesz użyć warunków do wykrywania platformy, na której się znajdujesz.

Aby na przykład uzyskać adres IP agenta kompilacji, należy użyć ifconfig w systemie macOS, ip addr w systemie Ubuntu Linux i Get-NetIPAddress polecenia cmdlet w programie Windows PowerShell. Następujący pipeline pobiera te informacje od agentów na różnych platformach, wykorzystując określone warunki.

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)