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)