Platformlar arası betikleri çalıştırma
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Azure Pipelines ile derlemelerinizi macOS, Linux ve Windows makinelerinde çalıştırabilirsiniz. .NET Core, Node.js ve Python gibi platformlar arası teknolojiler geliştirirseniz bu özellikler hem avantajları hem de zorlukları beraberinde getirir.
Örneğin, çoğu işlem hattı, derleme işlemi sırasında çalıştırmak istediğiniz bir veya daha fazla betik içerir.
Ancak betikler genellikle farklı platformlarda aynı şekilde çalışmaz. Betik yazmayı kolaylaştırmak için anahtar sözcük kısayolunu script
kullanabilir ve ayrıca betiklerinizle belirli platformları hedeflemek için koşulları kullanabilirsiniz.
Betik adımıyla platformlar arası araçları çalıştırma
Betik anahtar sözcüğü, komut satırı görevi için bir kısayoldur. anahtar script
sözcüğü Linux ve macOS üzerinde Bash ve Windows üzerinde cmd.exe çalıştırır.
Göreviniz bağımsız değişkenleri platformlar arası bir araca geçirdiğinde kullanmak script
yararlı olabilir. Örneğin, bir dizi bağımsız değişkenle çağırma npm
bir adımla script
kolayca gerçekleştirilebilir.
script
her platformun yerel betik yorumlayıcısında çalışır: MacOS ve Linux üzerinde Bash, Windows'da cmd.exe.
Ortam değişkenlerini işleme
Ortam değişkenleri, platformlar arası betikler yazmak için ilk kırışıklıkları oluşturur. Komut satırı, PowerShell ve Bash'in her birinin ortam değişkenlerini okumanın farklı yolları vardır. PATH gibi işletim sistemi tarafından sağlanan bir değere erişmeniz gerekiyorsa platform başına farklı tekniklere ihtiyacınız olacaktır.
Ancak Azure Pipelines, makro söz dizimi adı verilen değişkenlere başvurmak için platformlar arası bir yol sunar. içindeki $( )
bir değişken adını çevreleyerek, platformun kabuğu bunu görmeden önce genişletildi. Örneğin, işlem hattının kimliğini yansıtmak istiyorsanız, aşağıdaki betik platformlar arası kolaydır:
steps:
- script: echo This is pipeline $(System.DefinitionId)
Bu işlem hattında belirttiğiniz değişkenler için de çalışır.
variables:
Example: 'myValue'
steps:
- script: echo The value passed in is $(Example)
Bash veya pwsh kullanmayı göz önünde bulundurun
Yukarıda gösterilen örneklerden daha karmaşık betik gereksinimleriniz varsa bunları Bash'te yazmayı göz önünde bulundurun. MacOS ve Linux aracılarının çoğu kullanılabilir kabuk olarak Bash'e sahiptir ve Windows aracıları Git Bash veya Linux için Windows Alt Sistemi Bash'i içerir.
Azure Pipelines için Microsoft tarafından barındırılan aracılarda her zaman Bash kullanılabilir.
Örneğin, derlemenizin bir çekme isteği tarafından tetiklenip tetiklenmeyeceği konusunda karar vermeniz gerekiyorsa:
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
) da bir seçenektir.
Her aracıda PowerShell Core'un yüklü olması gerekir.
Platforma göre geçiş yapma
Genel olarak, işlem hattı mantığınızın çoğaltılması gibi sorunlardan kaçınmak için platforma özgü betiklerden kaçınmanızı öneririz. Yinelenenleri çoğaltma, fazladan çalışmaya ve hata riskinin artmasına neden olur.
Ancak platforma özgü betiklerden kaçınmanın bir yolu yoksa, hangi platformda olduğunuzu algılamak için bir condition
kullanabilirsiniz.
Örneğin, bir nedenle derleme aracısının IP adresine ihtiyacınız olduğunu varsayalım.
Windows'da bu ipconfig
bilgileri alır.
macOS'ta, şeklindedir ifconfig
.
Ubuntu Linux'ta ise ip addr
.
Aşağıdaki işlem hattını ayarlayın, ardından farklı platformlarda aracılara karşı çalıştırmayı deneyin.
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)