Uruchamianie skryptów międzyplatformowych

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

Usługa Azure Pipelines umożliwia uruchamianie kompilacji na komputerach z systemami macOS, Linux i Windows. Jeśli tworzysz aplikacje na różnych platformach, takich jak .NET Core, Node.js i Python, te możliwości przynoszą korzyści i wyzwania.

Na przykład większość potoków obejmuje co najmniej jeden skrypt, który chcesz uruchomić podczas procesu kompilacji. Jednak skrypty często nie działają w ten sam sposób na różnych platformach. Możesz użyć skrótu kluczowego script , aby ułatwić pisanie skryptów, a także używać warunków do określania docelowych platform za pomocą skryptów.

Uruchamianie narzędzi międzyplatformowych za pomocą kroku skryptu

Słowo kluczowe skryptu jest skrótem do zadania wiersza polecenia. Słowo script kluczowe uruchamia powłokę Bash w systemach Linux i macOS oraz cmd.exe w systemie Windows.

Użycie script metody może być przydatne, gdy zadanie po prostu przekazuje argumenty do wieloplatformowego narzędzia. Na przykład wywołanie npm za pomocą zestawu argumentów można łatwo wykonać za pomocą script kroku. script działa w natywnym interpreterze skryptów każdej platformy: Bash w systemach macOS i Linux, cmd.exe w systemie Windows.

steps:
- script: |
    npm install
    npm test

Obsługa zmiennych środowiskowych

Zmienne środowiskowe zgłaszają pierwszą zmarszczk do pisania skryptów międzyplatformowych. Wiersz polecenia, program PowerShell i powłoka Bash mają różne sposoby odczytywania zmiennych środowiskowych. Jeśli potrzebujesz dostępu do wartości podanej przez system operacyjny, takiej jak PATH, potrzebujesz różnych technik dla każdej platformy.

Jednak usługa Azure Pipelines oferuje międzyplatformowy sposób odwoływania się do zmiennych, o których wie o nazwie składni makra. Otaczając nazwę zmiennej w elemencie $( ), jest ona rozszerzana, zanim powłoka platformy kiedykolwiek zobaczy ją. Jeśli na przykład chcesz wyświetlić identyfikator potoku, następujący skrypt jest przyjazny dla wielu platform:

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

Działa to również w przypadku zmiennych, które określisz w potoku.

variables:
  Example: 'myValue'

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

Rozważ powłokę Bash lub pwsh

Jeśli masz bardziej złożone potrzeby dotyczące skryptów niż pokazane powyżej przykłady, rozważ napisanie ich w powłoce Bash. Większość agentów systemu macOS i Linux ma powłokę Bash jako dostępną powłokę, a agenci systemu Windows obejmują powłokę Git Bash lub Podsystem Windows dla systemu Linux Bash.

W przypadku usługi Azure Pipelines agenci hostowani przez firmę Microsoft zawsze mają dostępną powłokę Bash.

Jeśli na przykład musisz podjąć decyzję o tym, czy kompilacja jest wyzwalana przez żądanie ściągnięcia:

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

Program PowerShell Core (pwsh) jest również opcją. Wymaga to, aby każdy agent miał zainstalowany program PowerShell Core.

Przełączanie na podstawie platformy

Ogólnie rzecz biorąc, zalecamy unikanie skryptów specyficznych dla platformy, aby uniknąć problemów, takich jak duplikowanie logiki potoku. Duplikowanie powoduje dodatkową pracę i dodatkowe ryzyko błędów. Jeśli jednak nie ma możliwości uniknięcia skryptów specyficznych dla platformy, możesz użyć elementu , condition aby wykryć platformę, na której się znajdujesz.

Załóżmy na przykład, że z jakiegoś powodu potrzebny jest adres IP agenta kompilacji. W systemie Windows ipconfig pobiera te informacje. W systemie macOS jest to ifconfig. I w systemie Ubuntu Linux jest to ip addr.

Skonfiguruj poniższy potok, a następnie spróbuj uruchomić go względem agentów na różnych platformach.

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)