Platformfüggetlen szkriptek futtatása

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

Az Azure Pipelines segítségével macOS, Linux és Windows rendszerű gépeken futtathatja a buildeket. Ha olyan platformfüggetlen technológiákon fejleszt, mint a .NET Core, a Node.js és a Python, ezek a képességek előnyöket és kihívásokat is jelentenek.

A legtöbb folyamat például egy vagy több szkriptet tartalmaz, amelyet a buildelési folyamat során futtatni szeretne. A szkriptek azonban gyakran nem ugyanúgy futnak különböző platformokon. A kulcsszó-parancsikon használatával script egyszerűbbé teheti a szkriptek írását, és feltételeket is használhat adott platformok megcélzásához a szkriptekkel.

Platformfüggetlen eszközök futtatása szkriptlépéssel

A szkript kulcsszó a parancssori feladat parancsikonja. A script kulcsszó Linuxon, macOS-en és windowsos cmd.exe futtatja a Basht.

A használat script akkor lehet hasznos, ha a feladat csak egy platformfüggetlen eszköznek adja át az argumentumokat. Egy lépéssel például npm egyszerűen hívható script meg egy argumentumkészlettel. script Az egyes platformok natív szkript-értelmezőjében fut: Bash macOS és Linux rendszeren, cmd.exe Windows rendszeren.

steps:
- script: |
    npm install
    npm test

Környezeti változók kezelése

A környezeti változók az első ráncot a platformfüggetlen szkriptek írására vetik. A parancssor, a PowerShell és a Bash különböző módokon olvashatók a környezeti változókban. Ha hozzá kell férnie egy operációs rendszer által biztosított értékhez, például a PATH-hoz, platformonként különböző technikákra lesz szüksége.

Az Azure Pipelines azonban platformfüggetlen módot kínál a makrószintaxisról ismert változókra való hivatkozásra. Ha körülvesz egy változónevet $( ), az ki van bontva, mielőtt a platform rendszerhéja valaha is látni látná. Ha például vissza szeretné adni a folyamat azonosítóját, a következő szkript platformfüggetlen:

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

Ez a folyamat által megadott változók esetében is működik.

variables:
  Example: 'myValue'

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

Fontolja meg a Basht vagy a pwsh-t

Ha összetettebb szkriptelési igényei vannak, mint a fent bemutatott példák, fontolja meg a Bashben való írást. A legtöbb macOS- és Linux-ügynök rendelkezik Bash-lel elérhető rendszerhéjként, a Windows-ügynökök közé tartozik a Git Bash vagy Linuxos Windows-alrendszer Bash.

Az Azure Pipelines esetében a Microsoft által üzemeltetett ügynökök mindig elérhetők a Bash használatával.

Ha például döntést kell hoznia arról, hogy a buildet egy lekéréses kérelem aktiválja-e:

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

A PowerShell Core (pwsh) szintén lehetőség. Minden ügynöknek telepítve kell lennie a PowerShell Core-nak.

Váltás platform alapján

Általában azt javasoljuk, hogy kerülje a platformspecifikus szkripteket, hogy elkerülje az olyan problémákat, mint a folyamatlogika duplikálása. A duplikáció többletmunkát és a hibák fokozott kockázatát okozza. Ha azonban nincs mód a platformspecifikus szkriptek elkerülésére, akkor a használatával észlelheti condition , hogy melyik platformon van.

Tegyük fel például, hogy valamilyen okból szüksége van a buildügynök IP-címére. Windows ipconfig rendszeren lekéri ezeket az információkat. MacOS rendszeren ez a .ifconfig És az Ubuntu Linuxon ez .ip addr

Állítsa be az alábbi folyamatot, majd próbálja meg futtatni az ügynökökön különböző platformokon.

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)