Exécuter des scripts multiplateformes

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

Avec Azure Pipelines, vous pouvez exécuter vos builds sur des machines macOS, Linux et Windows. Si vous développez sur des technologies multiplateformes, telles que .NET Core, Node.js et Python, ces fonctionnalités présentent des avantages et des difficultés.

Par exemple, la plupart des pipelines incluent un ou plusieurs scripts que vous souhaitez exécuter pendant le processus de génération. Mais souvent, les scripts ne s’exécutent pas de la même façon sur différentes plateformes. Vous pouvez utiliser le raccourci mot clé script pour faciliter l’écriture de scripts et également utiliser des conditions pour cibler des plateformes spécifiques avec vos scripts.

Exécuter des outils multiplateformes avec une étape de script

Le mot clé script est un raccourci pour la tâche de ligne de commande. Le mot clé script exécute Bash sur Linux et macOS et cmd.exe sur Windows.

Il peut être utile d’utiliser script lorsque votre tâche passe simplement des arguments à un outil multiplateforme. Par instance, il est facile d’appeler npm avec un ensemble d’arguments à l’aide d’une étape script. script s’exécute dans l’interpréteur de scripts natif de chaque plateforme : Bash sur macOS et Linux, cmd.exe sur Windows.

steps:
- script: |
    npm install
    npm test

Gérer les variables d’environnement

Les variables d’environnement entraînent la première difficulté dans l’écriture de scripts multiplateformes. Ligne de commande, PowerShell et Bash ont tous des façons différentes de lire les variables d’environnement. Si vous souhaitez accéder à une valeur fournie par le système d’exploitation, comme PATH, vous aurez besoin d’utiliser des techniques différentes en fonction de la plateforme.

Azure Pipelines offre toutefois un moyen multiplateforme de référencer des variables qu’il connaît : la syntaxe macro. Lorsqu’un nom de variable est entouré par $( ), il est développé avant que l’interpréteur de commandes de la plateforme ne le voie. Par exemple, si vous souhaitez faire écho à l’ID du pipeline, le script suivant est compatible multiplateforme :

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

Cela fonctionne également pour les variables que vous spécifiez dans le pipeline.

variables:
  Example: 'myValue'

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

Prenons l’exemple de Bash ou pwsh

Si vous avez besoin de scripts plus complexes que les exemples présentés ci-dessus, envisagez de les écrire dans Bash. Bash est un interpréteur de commandes disponible pour la plupart des agents macOS et Linux, et les agents Windows incluent Git Bash ou le Sous-système Windows pour Linux Bash.

Pour Azure Pipelines, Bash est toujours disponible pour les agents hébergés par Microsoft.

Par exemple, si vous devez décider si votre build est déclenchée par une demande de tirage :

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) est également une possibilité. Dans ce cas, chaque agent doit installer PowerShell Core.

Basculer en fonction de la plateforme

En général, nous vous recommandons de ne pas utiliser de scripts spécifiques à une plateforme pour éviter des problèmes tels que la duplication de la logique de votre pipeline. La duplication entraîne une surcharge de travail et un risque de bogues accru. Toutefois, s’il n’existe aucun moyen d’éviter les scripts spécifiques à une plateforme, vous pouvez utiliser un condition pour détecter la plateforme sur laquelle vous vous trouvez.

Par exemple, supposons que, pour une raison quelconque, vous avez besoin de l’adresse IP de l’agent de build. Sur Windows, ipconfig obtient ces informations. Sur macOS, il s’agit de ifconfig, et de ip addr sur Ubuntu Linux.

Configurez le pipeline ci-dessous, puis essayez de l’exécuter sur des agents sur différentes plateformes.

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)