Platformlar arası betikleri çalıştırma

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019 | TFS 2018

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. script anahtar sözcüğü Linux üzerinde Bash, Windows üzerinde macOS ve 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.

steps:
- script: |
    npm install
    npm test

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)