Spouštění skriptů pro různé platformy

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

S Azure Pipelines můžete spouštět buildy na počítačích s macOS, Linuxem a Windows. Pokud vyvíjíte na multiplatformních technologiích, jako jsou .NET Core, Node.js a Python, přináší tyto funkce výhody i výzvy.

Většina kanálů například obsahuje jeden nebo více skriptů, které chcete spustit během procesu sestavení. Skripty se ale často nespouštějí stejným způsobem na různých platformách. Pomocí klávesové zkratky klíčového slova můžete script usnadnit psaní skriptů a také můžete použít podmínky pro cílení na konkrétní platformy s vašimi skripty.

Spuštění nástrojů pro různé platformy pomocí kroku skriptu

Klíčové slovo skriptu je zkratka pro úlohu příkazového řádku. Klíčové script slovo spouští Bash v Linuxu a macOS a cmd.exe ve Windows.

Použití script může být užitečné, když úkol právě předává argumenty nástroji pro různé platformy. Volání pomocí sady argumentů lze například npm snadno provést pomocí script kroku. script běží v interpretu nativních skriptů jednotlivých platforem: Bash v systému macOS a Linux cmd.exe ve Windows.

steps:
- script: |
    npm install
    npm test

Zpracování proměnných prostředí

Proměnné prostředí hází první vrásku do psaní skriptů pro různé platformy. Příkazový řádek, PowerShell a Bash mají různé způsoby čtení proměnných prostředí. Pokud potřebujete získat přístup k hodnotě poskytované operačním systémem, jako je PATH, budete potřebovat různé techniky pro každou platformu.

Azure Pipelines ale nabízí multiplatformní způsob, jak odkazovat na proměnné, které zná volanou syntaxi maker. Když název $( )proměnné obklopíte , rozbalí se předtím, než ho prostředí platformy uvidí. Pokud například chcete vyhlásit ID kanálu, je pro různé platformy vhodný následující skript:

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

To funguje také pro proměnné, které zadáte v kanálu.

variables:
  Example: 'myValue'

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

Zvažte Bash nebo pwsh.

Pokud máte složitější skriptovací potřeby než výše uvedené příklady, zvažte jejich napsání v Bashu. Většina agentů pro macOS a Linux má Bash jako dostupné prostředí a agenti Windows zahrnují Git Bash nebo Subsystém Windows pro Linux Bash.

Pro Azure Pipelines mají agenti hostovaní Microsoftem vždy k dispozici Bash.

Pokud například potřebujete rozhodnout o tom, jestli je sestavení aktivované žádostí o přijetí změn:

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) je také možnost. Vyžaduje, aby každý agent měl nainstalovaný PowerShell Core.

Přepínač založený na platformě

Obecně doporučujeme, abyste se vyhnuli skriptům specifickým pro platformu, abyste se vyhnuli problémům, jako je duplikování logiky kanálu. Duplikace způsobuje nadbytečnou práci a riziko chyb. Pokud ale neexistuje způsob, jak se vyhnout skriptování specifické pro platformu, můžete pomocí nástroje zjistit, jakou platformu condition používáte.

Předpokládejme například, že z nějakého důvodu potřebujete IP adresu agenta sestavení. Ve Windows ipconfig získá informace. V macOS je to ifconfig. A v Ubuntu Linuxu ip addrje to .

Nastavte níže uvedený kanál a zkuste ho spustit s agenty na různých platformách.

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)