Menjalankan skrip lintas platform

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Dengan Azure Pipelines, Anda dapat menjalankan build di komputer macOS, Linux, dan Windows. Jika Anda mengembangkan teknologi lintas platform seperti .NET Core, Node.js dan Python, kemampuan ini membawa manfaat dan tantangan.

Misalnya, sebagian besar alur menyertakan satu atau beberapa skrip yang ingin Anda jalankan selama proses build. Tetapi skrip sering tidak berjalan dengan cara yang sama pada platform yang berbeda. Anda dapat menggunakan script pintasan kata kunci untuk membuat penulisan skrip lebih mudah dan juga dapat menggunakan kondisi untuk menargetkan platform tertentu dengan skrip Anda.

Menjalankan alat lintas platform dengan langkah skrip

Kata kunci skrip adalah pintasan untuk tugas baris perintah. Kata script kunci menjalankan Bash di Linux dan macOS dan cmd.exe di Windows.

Menggunakan script dapat berguna ketika tugas Anda hanya meneruskan argumen ke alat lintas platform. Misalnya, panggilan npm dengan sekumpulan argumen dapat dengan mudah dicapai dengan langkah script . script berjalan di setiap penerjemah skrip asli platform: Bash di macOS dan Linux, cmd.exe di Windows.

steps:
- script: |
    npm install
    npm test

Menangani variabel lingkungan

Variabel lingkungan melemparkan kerutan pertama ke dalam menulis skrip lintas platform. Baris perintah, PowerShell, dan Bash masing-masing memiliki cara berbeda untuk membaca variabel lingkungan. Jika Anda perlu mengakses nilai yang disediakan sistem operasi seperti PATH, Anda memerlukan teknik yang berbeda per platform.

Namun, Azure Pipelines menawarkan cara lintas platform untuk merujuk ke variabel yang diketahuinya tentang yang disebut sintaks makro. Dengan mengelilingi nama variabel di $( ), itu diperluas sebelum shell platform pernah melihatnya. Misalnya, jika Anda ingin menggemakan ID alur, skrip berikut ramah lintas platform:

steps:
- script: echo This is pipeline $(System.DefinitionId)

Ini juga berfungsi untuk variabel yang Anda tentukan dalam alur.

variables:
  Example: 'myValue'

steps:
- script: echo The value passed in is $(Example)

Pertimbangkan Bash atau pwsh

Jika Anda memiliki kebutuhan pembuatan skrip yang lebih kompleks daripada contoh yang ditunjukkan di atas, pertimbangkan untuk menulisnya di Bash. Sebagian besar agen macOS dan Linux memiliki Bash sebagai shell yang tersedia, dan agen Windows termasuk Git Bash atau Subsistem Windows untuk Linux Bash.

Untuk Azure Pipelines, agen yang dihosting Microsoft selalu memiliki Bash yang tersedia.

Misalnya, jika Anda perlu membuat keputusan tentang apakah build Anda dipicu oleh permintaan 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

PowerShell Core (pwsh) juga merupakan opsi. Ini mengharuskan setiap agen menginstal PowerShell Core.

Beralih berdasarkan platform

Secara umum, kami sarankan Anda menghindari skrip khusus platform untuk menghindari masalah seperti duplikasi logika alur Anda. Duplikasi menyebabkan pekerjaan ekstra dan risiko ekstra bug. Namun, jika tidak ada cara untuk menghindari pembuatan skrip khusus platform, Anda dapat menggunakan condition untuk mendeteksi platform apa yang Anda gunakan.

Misalnya, anggaplah bahwa karena alasan tertentu Anda memerlukan alamat IP agen build. Di Windows, ipconfig mendapatkan informasi tersebut. Di macOS, itu ifconfigadalah . Dan di Ubuntu Linux, itu ip addradalah .

Siapkan alur di bawah ini, lalu coba jalankan terhadap agen pada platform yang berbeda.

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)