Megosztás a következőn keresztül:


Platformfüggetlen szkriptelés

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

Az Azure Pipelines linuxos, macOS és Windows rendszerű gépeken futtathat folyamatokat. Ha platformfüggetlen fejlesztési technológiákat, például .NET Core-t, Node.jsvagy Pythont használ, ezek a platformfüggetlen buildelési 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 a buildelési folyamat során, de a szkriptszintaxis gyakran különbözik a platformoktól.

Ez a cikk bemutatja, hogyan használhat platformfüggetlen szkripteket a különböző buildplatformok támogatásához. Egy Azure Pipelines-lépéssel script megkönnyítheti a platformfüggetlen szkriptek írását. Feltételeket is használhat a szkriptek meghatározott platformokra való célzásához.

Szkript lépés

A szkript kulcsszó a parancssori feladat gyorsbillentyűje, amely Linux és macOS rendszeren a Bash-t, illetve Windows rendszeren a cmd.exe-t futtatja.

A script segítségével könnyedén átadhatóak argumentumok egy platformfüggetlen eszköznek. A script lépés az egyes platformok natív szkript-értelmezőjében, a MacOS-en és Linuxon futó Bashben vagy a Windows cmd.exe fut. Az alábbi példa egy script lépéssel hívja meg a npm-et argumentumokkal.

steps:
- script: |
    npm install
    npm test

Környezeti változók

A parancssor, a PowerShell és a Bash eltérően oldja fel a környezeti változókat . A rendszer által biztosított értékek, például a PATH eléréséhez platformonként eltérő szintaxist kell használnia.

Az Azure Pipelines makrószintaxissal többplatformos módon hivatkozik a futtatókörnyezet változóira. A makrószintaxissal rendelkező változók feldolgozása a feladat futásideje során történő végrehajtása előtt történik. A változó kiterjed, mielőtt a platform shell találkozik vele.

Ha makrószintaxist szeretne használni egy folyamatban, vegye körül a változó nevét az alábbiak szerint: $(<variable name>). Az alábbi platformfüggetlen példaszkript a folyamat azonosítóját tükrözi.

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

Ez a szintaxis a folyamaton belül definiált változók esetében is működik.

variables:
  Example: 'myValue'

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

Bash-feladat

Ha összetettebb szkriptekre van szüksége, fontolja meg az írásukat a Bashben, és használja a Bash-feladatot a folyamatban. A legtöbb macOS- és Linux-ügynök a Basht használja rendszerhéjként, a Windows-ügynökök pedig a Git Basht vagy a Linux Bash Windows alrendszerét . A Microsoft által üzemeltetett ügynökök alapértelmezés szerint előre telepítették a Basht.

Az alábbi példa egy Bash-feladatot futtat, amely segít eldönteni, hogy aktiválja-e a buildet.

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

Megjegyzés:

A PowerShell szkriptekhez is használható. A pwsh parancsikon MacOS, Linux vagy Windows rendszeren futtatja a PowerShell 7.x-et. Az ügynököknek telepítve kell lenniük a PowerShell 7.x-nek. A Microsoft által üzemeltetett ügynökök alapértelmezés szerint telepítették a PowerShell 7.x-et.

Platformalapú váltás

A folyamatlogika duplikálására szolgáló platformspecifikus szkriptek további munkát és nagyobb hibakockázatot okoznak. Ha azonban nem tudja elkerülni a platformspecifikus szkriptelést, feltételekkel észlelheti, hogy melyik platformon van.

Például a buildügynök IP-címének lekéréséhez a macOS rendszerben ifconfig, Ubuntu Linuxon ip addr, és a Windows PowerShellben a Get-NetIPAddress parancsmagot kell használnia. Az alábbi folyamat ezeket az információkat különböző platformokon lévő ügynököktől szerzi be feltételek használatával.

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)