Platformlar arası betikleri çalıştırma
Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018
Bu Azure Pipelines, derlemelerinizi macOS, Linux ve linux makinelerde Windows çalıştırabilirsiniz. .NET Core, Node.js ve Python gibi platformlar arası teknolojiler üzerinde geliştirmeler yaptısanız bu özellikler hem avantajlar hem de zorluklar 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. Bu tür bir zor durumla nasıl başa çıkabilirsiniz? aşağıda bazı ipuçları verilmiştir.
Betik adımıyla platformlar arası araçları çalıştırma
script anahtar sözcüğü, komut satırı görevi için bir kısayol sağlar. anahtar script sözcüğü Linux ve macOS üzerinde Bash çalıştırır ve cmd.exe üzerinde Windows.
kullanımı, script göreviniz bağımsız değişkenleri platformlar arası bir araça iletirken yararlı olabilir. Örneğin, bir npm dizi bağımsız değişkenle çağrı yapmak bir adımla kolayca script gerçek olabilir.
scripther platformun yerel betik yorumlayıcıda çalışır: macOS ve Linux üzerinde Bash, cmd.exe üzerinde Windows.
Ortam değişkenlerini işleme
Ortam değişkenleri, platformlar arası betikler yazmanın ilk adımlarını atar. Komut satırı, PowerShell ve Bash'in ortam değişkenlerini okumanın farklı yolları vardır. PATH gibi işletim sistemi tarafından sağlanan bir değere erişmeniz gerekirse platform başına farklı tekniklere ihtiyacınız olacaktır.
Ancak Azure Pipelines, makro söz dizimi olarak adlandırılan değişkenlere başvurmak için platformlar arası bir yol sunar. içinde bir değişken adını çevrelerken, platform kabuğu onu $( ) hiç göremeden genişletilir. Örneğin, işlem hattının kimliğini yankıya almak için aşağıdaki betik platformlar arası kolay bir komut dosyasıdı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'yi düşünün
Yukarıda gösterilen örneklerden daha karmaşık betik ihtiyaçlarına sahipsiniz, bunları Bash'te yazmayı göz önünde bulundurabilirsiniz. MacOS ve Linux aracılarının çoğu kullanılabilir bir kabuk olarak Bash'e ve Windows Git Bash'i veya Bash'Linux için Windows Alt Sistemi içerir.
Örneğin Azure Pipelines Microsoft tarafından barındırılan aracılarda her zaman Bash kullanılabilir.
Örneğin, bunun bir çekme isteği derlemesi olup olmadığını temel alan bir karara ihtiyacınız varsa:
trigger:
batch: true
branches:
include:
- master
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 yüklü PowerShell Core gerekir.
Platforma dayalı geçiş
Genel olarak, işlem hattı mantığınızı yineleme gibi sorunları önlemek için platforma özgü betiklerden kaçınmanızı öneririz. Yineleme, ek iş ve hata riskine neden olur.
Ancak platforma özgü betiklerden kaçınmanın bir yolu yoksa, hangi platformda olduğunu algılamak için condition kullanabilirsiniz.
Örneğin, bir nedenle derleme aracılarının IP adresine ihtiyacınız olduğunu varsayalım.
Bu Windows bilgileri ipconfig alır.
macOS'ta, ifconfig 'dır.
Bu Ubuntu Linux ise ' ip addr dır.
Aşağıdaki işlem hattını ayarlayın ve 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)