Bagikan melalui


Pembuatan skrip lintas platform

Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

Azure Pipelines dapat menjalankan alur di komputer Linux, macOS, dan Windows. Jika Anda menggunakan teknologi pengembangan lintas platform seperti .NET Core, Node.js, atau Python, kemampuan build lintas platform ini membawa manfaat dan tantangan. Misalnya, sebagian besar alur menyertakan satu atau beberapa skrip untuk dijalankan selama proses build, tetapi sintaks skrip sering berbeda dari platform.

Artikel ini menjelaskan bagaimana Anda dapat menggunakan scripting lintas platform untuk mendukung platform build yang berbeda. Anda dapat menggunakan langkah Azure Pipelines script untuk memudahkan penulisan skrip lintas platform. Anda juga dapat menggunakan kondisi untuk menargetkan skrip ke platform tertentu.

Langkah skrip

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

Anda dapat menggunakan script untuk dengan mudah meneruskan argumen ke alat lintas platform. Langkah ini script dijalankan di setiap penerjemah skrip bawaan platform, Bash di macOS dan Linux, atau cmd.exe di Windows. Contoh berikut menggunakan script langkah untuk memanggil npm dengan sekumpulan argumen.

steps:
- script: |
    npm install
    npm test

Variabel lingkungan

Baris perintah, PowerShell, dan Bash menyelesaikan variabel lingkungan secara berbeda. Untuk mengakses nilai yang disediakan sistem seperti PATH, Anda harus menggunakan sintaks yang berbeda per platform.

Azure Pipelines menggunakan sintaks makro sebagai cara lintas platform untuk merujuk ke variabel saat runtime. Variabel dengan sintaks makro diproses sebelum tugas dijalankan selama runtime. Variabel mengembang sebelum shell platform menemukannya.

Untuk menggunakan sintaks makro dalam alur, kelilingi nama variabel sebagai berikut: $(<variable name>). Skrip contoh lintas platform berikut menampilkan ID dari pipeline.

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

Sintaks ini juga berfungsi untuk variabel yang Anda tentukan dalam alur.

variables:
  Example: 'myValue'

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

Tugas Bash

Jika Anda memerlukan skrip yang lebih kompleks, pertimbangkan untuk menulisnya di Bash dan menggunakan tugas Bash di alur Anda. Sebagian besar agen macOS dan Linux menggunakan Bash sebagai shell, dan agen Windows dapat menggunakan Git Bash atau Subsistem Windows untuk Linux Bash. Agen yang dihosting Microsoft memiliki Bash yang telah diinstal sebelumnya secara default.

Contoh berikut menjalankan tugas Bash yang membantu membuat keputusan tentang apakah akan memicu build.

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

Nota

PowerShell juga merupakan opsi untuk skrip. Pintasan pwsh menjalankan PowerShell 7.x di macOS, Linux, atau Windows. Agen harus menginstal PowerShell 7.x. Agen yang dihosting Microsoft memiliki PowerShell 7.x yang diinstal secara default.

Pengalihan berbasis platform

Pembuatan skrip khusus platform untuk menduplikasi logika alur menyebabkan pekerjaan ekstra dan peningkatan risiko kesalahan. Tetapi jika Anda tidak dapat menghindari pembuatan skrip khusus platform, Anda dapat menggunakan kondisi untuk mendeteksi platform apa yang Anda gunakan.

Misalnya, untuk mendapatkan alamat IP agen build, Anda harus menggunakan ifconfig di macOS, ip addr di Ubuntu Linux, dan Get-NetIPAddress cmdlet di Windows PowerShell. Alur kerja berikut mengumpulkan informasi tersebut dari agen di berbagai platform dengan menggunakan kondisi.

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

# use the value
- script: |
    echo The IP address is $(IP_ADDR)