Compartilhar via


Scripts multiplataforma

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

O Azure Pipelines pode executar pipelines em computadores Linux, macOS e Windows. Se você usar tecnologias de desenvolvimento multiplataforma, como .NET Core, Node.jsou Python, essas funcionalidades de build multiplataforma trazem benefícios e desafios. Por exemplo, a maioria dos pipelines inclui um ou mais scripts a serem executados durante o processo de build, mas a sintaxe de script geralmente difere em relação às plataformas.

Este artigo explica como você pode usar scripts multiplataforma para dar suporte a diferentes plataformas de build. Você pode usar uma etapa do Azure Pipelines script para facilitar a gravação de scripts multiplataforma. Você também pode usar condições para direcionar scripts para plataformas específicas.

Etapa de script

A palavra-chave script é um atalho para a tarefa de linha de comandos, executando o Bash no Linux e no macOS ou o cmd.exe no Windows.

Você pode usar script para passar facilmente argumentos para uma ferramenta multiplataforma. A script etapa é executada no interpretador de script nativo de cada plataforma, bash no macOS e Linux ou cmd.exe no Windows. O exemplo a seguir usa uma script etapa para chamar npm com um conjunto de argumentos.

steps:
- script: |
    npm install
    npm test

Variáveis de ambiente

Linha de comando, PowerShell e Bash resolvem variáveis de ambiente de forma diferente. Para acessar um valor fornecido pelo sistema como PATH, você deve usar uma sintaxe diferente por plataforma.

O Azure Pipelines usa a sintaxe de macro como uma maneira multiplataforma de se referir a variáveis em runtime. Variáveis com sintaxe de macro são processadas antes que uma tarefa seja executada durante o runtime. A variável se expande antes que o shell de plataforma a encontre.

Para usar a sintaxe de macro em um pipeline, envolva o nome da variável da seguinte maneira: $(<variable name>). O seguinte script de exemplo multiplataforma ecoa a ID do pipeline.

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

Essa sintaxe também funciona para variáveis que você define dentro do pipeline.

variables:
  Example: 'myValue'

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

Tarefa Bash

Se você precisar de scripts mais complexos, considere escrevê-los no Bash e usar a tarefa Bash em seu pipeline. A maioria dos agentes macOS e Linux usa o Bash como um shell, e os agentes do Windows podem usar o Git Bash ou o Subsistema do Windows para Linux Bash. Os agentes hospedados pela Microsoft têm o Bash pré-instalado por padrão.

O exemplo a seguir executa uma tarefa Bash que ajuda a tomar uma decisão sobre a possibilidade de disparar um build.

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

Observação

O PowerShell também é uma opção para scripts. O pwsh atalho executa o PowerShell 7.x no macOS, Linux ou Windows. Os agentes devem ter o PowerShell 7.x instalado. Os agentes hospedados pela Microsoft têm o PowerShell 7.x instalado por padrão.

Comutação baseada em plataforma

Scripts específicos para cada plataforma que duplicam a lógica de pipeline causam trabalho extra e aumento no risco de erros. No entanto, se você não puder evitar scripts específicos para a plataforma, poderá usar condições para detectar em qual plataforma você está.

Por exemplo, para obter o endereço IP do agente de build, você deve usar ifconfig no macOS, ip addr no Ubuntu Linux e no Get-NetIPAddress cmdlet no Windows PowerShell. O pipeline a seguir obtém essas informações de agentes em plataformas diferentes usando condições.

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)