Executar scripts entre plataformas
Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019
Com o Azure Pipelines, pode executar as suas compilações em computadores macOS, Linux e Windows. Se você desenvolver em tecnologias multiplataforma, como .NET Core, Node.js e Python, esses recursos trazem benefícios e desafios.
Por exemplo, a maioria dos pipelines inclui um ou mais scripts que você deseja executar durante o processo de compilação.
Mas os scripts muitas vezes não são executados da mesma maneira em plataformas diferentes. Você pode usar o atalho de palavra-chave para facilitar a script
escrita de scripts e também pode usar condições para segmentar plataformas específicas com seus scripts.
Execute ferramentas multiplataforma com uma etapa de script
A palavra-chave script é um atalho para a tarefa de linha de comando. A script
palavra-chave roda Bash no Linux e macOS e cmd.exe no Windows.
O uso script
pode ser útil quando sua tarefa apenas passa argumentos para uma ferramenta multiplataforma. Por exemplo, chamar npm
com um conjunto de argumentos pode ser facilmente realizado com uma script
etapa.
script
é executado no interpretador de script nativo de cada plataforma: Bash no macOS e Linux cmd.exe no Windows.
Manipular variáveis de ambiente
As variáveis de ambiente lançam a primeira ruga na escrita de scripts entre plataformas. Linha de comando, PowerShell e Bash têm maneiras diferentes de ler variáveis de ambiente. Se você precisar acessar um valor fornecido pelo sistema operacional como PATH, precisará de técnicas diferentes por plataforma.
No entanto, o Azure Pipelines oferece uma maneira multiplataforma de fazer referência a variáveis que ele conhece chamadas sintaxe de macro. Ao cercar um nome de variável no $( )
, ele é expandido antes que o shell da plataforma o veja. Por exemplo, se você quiser ecoar a ID do pipeline, o script a seguir é amigável entre plataformas:
steps:
- script: echo This is pipeline $(System.DefinitionId)
Isso também funciona para variáveis especificadas no pipeline.
variables:
Example: 'myValue'
steps:
- script: echo The value passed in is $(Example)
Considere Bash ou pwsh
Se você tiver necessidades de script mais complexas do que os exemplos mostrados acima, considere escrevê-las em Bash. A maioria dos agentes macOS e Linux tem Bash como um shell disponível, e os agentes do Windows incluem Git Bash ou Windows Subsystem for Linux Bash.
Para o Azure Pipelines, os agentes hospedados pela Microsoft sempre têm o Bash disponível.
Por exemplo, se você precisar tomar uma decisão sobre se sua compilação é acionada por uma solicitação pull:
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
O PowerShell Core (pwsh
) também é uma opção.
Ele requer que cada agente tenha o PowerShell Core instalado.
Switch com base na plataforma
Em geral, recomendamos que você evite scripts específicos da plataforma para evitar problemas como a duplicação da lógica do pipeline. A duplicação causa trabalho extra e risco extra de bugs.
No entanto, se não houver nenhuma maneira de evitar scripts específicos da plataforma, você pode usar um condition
para detetar em qual plataforma você está.
Por exemplo, suponha que, por algum motivo, você precise do endereço IP do agente de compilação.
No Windows, ipconfig
obtém essas informações.
No macOS, é ifconfig
.
E no Ubuntu Linux, é ip addr
.
Configure o pipeline abaixo e tente executá-lo contra agentes em plataformas diferentes.
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)