Eseguire script multipiattaforma
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Con Azure Pipelines è possibile eseguire le build su computer macOS, Linux e Windows. Se si sviluppano tecnologie multipiattaforma come .NET Core, Node.js e Python, queste funzionalità comportano vantaggi e sfide.
Ad esempio, la maggior parte delle pipeline include uno o più script da eseguire durante il processo di compilazione.
Ma gli script spesso non vengono eseguiti nello stesso modo su piattaforme diverse. È possibile usare il collegamento con parole chiave per semplificare la script
scrittura di script e usare le condizioni per definire piattaforme specifiche con gli script.
La parola chiave script è un'abbreviazione per l'attività della riga di comando. La script
parola chiave esegue Bash in Linux e macOS e cmd.exe in Windows.
L'uso di script
può essere utile quando il tuo compito è solo passare argomenti a uno strumento multipiattaforma. Ad esempio, la chiamata npm
con un set di argomenti può essere eseguita facilmente con un script
passaggio.
script
viene eseguito nell'interprete di script nativo di ogni piattaforma: Bash in macOS e Linux, cmd.exe in Windows.
- YAML
- Classico
steps:
- script: |
npm install
npm test
Le variabili di ambiente introducono la prima difficoltà nella scrittura di script multipiattaforma. La riga di comando, PowerShell e Bash hanno modi diversi per leggere le variabili di ambiente. Se è necessario accedere a un valore fornito dal sistema operativo come PATH, sono necessarie tecniche diverse per ogni piattaforma.
Azure Pipelines offre tuttavia un modo multipiattaforma per fare riferimento alle variabili che essa conosce chiamato macro sintassi. Circondando un nome di variabile in $( )
, viene espanso prima che la shell della piattaforma lo veda. Ad esempio, se si vuole visualizzare l'ID della pipeline, lo script seguente è compatibile con più piattaforme.
- YAML
- Classico
steps:
- script: echo This is pipeline $(System.DefinitionId)
Questo funziona anche per le variabili specificate nella pipeline.
variables:
Example: 'myValue'
steps:
- script: echo The value passed in is $(Example)
Se sono necessari scripting più complessi rispetto agli esempi illustrati in precedenza, è consigliabile scriverli in Bash. La maggior parte degli agenti macOS e Linux ha Bash come shell disponibile e gli agenti Windows includono Git Bash o sottosistema Windows per Linux Bash.
Per Azure Pipelines, gli agenti ospitati da Microsoft hanno sempre Bash disponibile.
Ad esempio, se è necessario prendere una decisione se la compilazione viene attivata da una pull request:
- YAML
- Classico
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
) è anche un'opzione.
Richiede che ogni agente abbia installato PowerShell Core.
In generale, è consigliabile evitare script specifici della piattaforma per evitare problemi come la duplicazione della logica della pipeline. La duplicazione causa un lavoro aggiuntivo e un rischio aggiuntivo di bug.
Tuttavia, se non è possibile evitare script specifici della piattaforma, è possibile usare un condition
per rilevare la piattaforma in uso.
Si supponga, ad esempio, che per qualche motivo sia necessario l'indirizzo IP dell'agente di compilazione.
In Windows ottiene ipconfig
tali informazioni.
In macOS è ifconfig
.
E in Ubuntu Linux, è ip addr
.
Configurare la pipeline seguente, quindi provare a eseguirla su agenti in piattaforme diverse.
- YAML
- Classico
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)