Uruchamianie skryptów międzyplatformowych
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Usługa Azure Pipelines umożliwia uruchamianie kompilacji na komputerach z systemami macOS, Linux i Windows. Jeśli tworzysz aplikacje na różnych platformach, takich jak .NET Core, Node.js i Python, te możliwości przynoszą korzyści i wyzwania.
Na przykład większość potoków obejmuje co najmniej jeden skrypt, który chcesz uruchomić podczas procesu kompilacji.
Jednak skrypty często nie działają w ten sam sposób na różnych platformach. Możesz użyć skrótu kluczowego script
, aby ułatwić pisanie skryptów, a także używać warunków do określania docelowych platform za pomocą skryptów.
Uruchamianie narzędzi międzyplatformowych za pomocą kroku skryptu
Słowo kluczowe skryptu jest skrótem do zadania wiersza polecenia. Słowo script
kluczowe uruchamia powłokę Bash w systemach Linux i macOS oraz cmd.exe w systemie Windows.
Użycie script
metody może być przydatne, gdy zadanie po prostu przekazuje argumenty do wieloplatformowego narzędzia. Na przykład wywołanie npm
za pomocą zestawu argumentów można łatwo wykonać za pomocą script
kroku.
script
działa w natywnym interpreterze skryptów każdej platformy: Bash w systemach macOS i Linux, cmd.exe w systemie Windows.
Obsługa zmiennych środowiskowych
Zmienne środowiskowe zgłaszają pierwszą zmarszczk do pisania skryptów międzyplatformowych. Wiersz polecenia, program PowerShell i powłoka Bash mają różne sposoby odczytywania zmiennych środowiskowych. Jeśli potrzebujesz dostępu do wartości podanej przez system operacyjny, takiej jak PATH, potrzebujesz różnych technik dla każdej platformy.
Jednak usługa Azure Pipelines oferuje międzyplatformowy sposób odwoływania się do zmiennych, o których wie o nazwie składni makra. Otaczając nazwę zmiennej w elemencie $( )
, jest ona rozszerzana, zanim powłoka platformy kiedykolwiek zobaczy ją. Jeśli na przykład chcesz wyświetlić identyfikator potoku, następujący skrypt jest przyjazny dla wielu platform:
steps:
- script: echo This is pipeline $(System.DefinitionId)
Działa to również w przypadku zmiennych, które określisz w potoku.
variables:
Example: 'myValue'
steps:
- script: echo The value passed in is $(Example)
Rozważ powłokę Bash lub pwsh
Jeśli masz bardziej złożone potrzeby dotyczące skryptów niż pokazane powyżej przykłady, rozważ napisanie ich w powłoce Bash. Większość agentów systemu macOS i Linux ma powłokę Bash jako dostępną powłokę, a agenci systemu Windows obejmują powłokę Git Bash lub Podsystem Windows dla systemu Linux Bash.
W przypadku usługi Azure Pipelines agenci hostowani przez firmę Microsoft zawsze mają dostępną powłokę Bash.
Jeśli na przykład musisz podjąć decyzję o tym, czy kompilacja jest wyzwalana przez żądanie ściągnięcia:
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
Program PowerShell Core (pwsh
) jest również opcją.
Wymaga to, aby każdy agent miał zainstalowany program PowerShell Core.
Przełączanie na podstawie platformy
Ogólnie rzecz biorąc, zalecamy unikanie skryptów specyficznych dla platformy, aby uniknąć problemów, takich jak duplikowanie logiki potoku. Duplikowanie powoduje dodatkową pracę i dodatkowe ryzyko błędów.
Jeśli jednak nie ma możliwości uniknięcia skryptów specyficznych dla platformy, możesz użyć elementu , condition
aby wykryć platformę, na której się znajdujesz.
Załóżmy na przykład, że z jakiegoś powodu potrzebny jest adres IP agenta kompilacji.
W systemie Windows ipconfig
pobiera te informacje.
W systemie macOS jest to ifconfig
.
I w systemie Ubuntu Linux jest to ip addr
.
Skonfiguruj poniższy potok, a następnie spróbuj uruchomić go względem agentów na różnych platformach.
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)