Menetapkan variabel dalam skrip

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

Saat Anda menggunakan skrip PowerShell dan Bash di alur Anda, seringkali berguna untuk dapat mengatur variabel yang kemudian dapat Anda gunakan dalam tugas mendatang. Variabel yang baru ditetapkan tidak tersedia dalam tugas yang sama.

Skrip sangat bagus ketika Anda ingin melakukan sesuatu yang tidak didukung oleh tugas seperti memanggil REST API kustom dan mengurai respons.

Anda akan menggunakan task.setvariable perintah pengelogan untuk mengatur variabel di skrip PowerShell dan Bash .

Catatan

Pekerjaan penyebaran menggunakan sintaks yang berbeda untuk variabel output. Untuk mempelajari selengkapnya tentang dukungan untuk variabel output dalam pekerjaan penyebaran, lihat Pekerjaan penyebaran.

Untuk menggunakan variabel dengan kondisi dalam alur, lihat Menentukan kondisi.

Tentang task.setvariable

Saat Anda menambahkan variabel dengan task.setvariable, tugas berikut dapat menggunakan variabel menggunakan sintaks $(myVar)makro . Variabel hanya akan tersedia untuk tugas dalam pekerjaan yang sama secara default. Jika Anda menambahkan parameter isoutput, sintaks untuk memanggil perubahan variabel Anda. Lihat Mengatur variabel output untuk digunakan dalam pekerjaan yang sama.

Atur variabel myVar dengan nilai foo.

- bash: |
    echo "##vso[task.setvariable variable=myVar;]foo"

Baca variabel myVar:

- bash: |
    echo "You can use macro syntax for variables: $(myVar)"

Mengatur properti variabel

Perintah ini task.setvariable mencakup properti untuk mengatur variabel sebagai rahasia, sebagai variabel output, dan sebagai baca saja. Properti yang tersedia meliputi:

  • variable = nama variabel (Diperlukan)
  • issecret = boolean (Opsional, default ke false)
  • isoutput = boolean (Opsional, default ke false)
  • isreadonly = boolean (Opsional, default ke false)

Untuk menggunakan variabel di tahap berikutnya, atur properti ke isoutputtrue. Untuk mereferensikan variabel dengan set isoutput ke true, Anda akan menyertakan nama tugas. Contohnya,$(TaskName.myVar).

Saat Anda mengatur variabel sebagai baca saja, variabel tersebut tidak dapat ditimpa oleh tugas hilir. Atur isreadonly ke true. Mengatur variabel sebagai baca hanya meningkatkan keamanan dengan membuat variabel tersebut tidak dapat diubah.

Mengatur variabel sebagai rahasia

Ketika issecret diatur ke true, nilai variabel akan disimpan sebagai rahasia dan ditutupi dari log.

Catatan

Azure Pipelines berupaya menutupi rahasia saat memancarkan data ke log alur, sehingga Anda mungkin melihat variabel dan data tambahan yang diselubungi dalam output dan log yang tidak ditetapkan sebagai rahasia.

Atur variabel mySecretValrahasia .

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"

Dapatkan variabel mySecretValrahasia .

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

Output variabel rahasia dalam bash.

Cuplikan layar output variabel bash.

Tingkat variabel output

Ada empat jenis variabel output yang berbeda dengan sintaks yang berbeda:

Mengatur variabel output untuk digunakan dalam pekerjaan yang sama

Saat Anda menggunakan variabel output dalam pekerjaan yang sama, Anda tidak perlu menggunakan isoutput properti . Secara default, variabel akan tersedia untuk langkah-langkah hilir dalam pekerjaan yang sama. Namun, jika Anda menambahkan isoutput properti , Anda harus mereferensikan variabel dengan nama tugas.

Skrip di sini mengatur variabel myJobVar output pekerjaan yang sama tanpa menentukan isoutput dan mengatur myOutputJobVar dengan isoutput=true.

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myJobVar]this is the same job"
  - bash: |
     echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
    name: setOutput

Skrip ini mendapatkan variabel myJobVar pekerjaan yang sama dan myOutputJobVar. Perhatikan bahwa perubahan sintaks untuk mereferensikan variabel output setelah isoutput=true ditambahkan.

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myJobVar]this is the same job"
  - bash: |
     echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
    name: setOutput
  - bash: |
     echo $(myJobVar) 
  - bash: |
     echo $(setOutput.myOutputJobVar)

Mengatur variabel output untuk digunakan dalam pekerjaan di masa mendatang

Saat Anda menggunakan variabel output di seluruh pekerjaan, Anda akan mereferensikannya dengan dependencies. Sintaks untuk mengakses variabel output dalam pekerjaan atau tahap mendatang bervariasi berdasarkan hubungan antara setter dan konsumen variabel. Pelajari tentang setiap kasus dalam dependensi.

Pertama, atur variabel myOutputVaroutput .

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput

Selanjutnya, akses myOutputVar dalam pekerjaan di masa mendatang dan keluarkan variabel sebagai myVarFromJobA. Untuk menggunakan dependencies, Anda perlu mengatur dependsOn properti pada pekerjaan di masa mendatang menggunakan nama pekerjaan sebelumnya di mana variabel output diatur.

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput
- job: B
  dependsOn: A
  variables:
    myVarFromJobA: $[ dependencies.A.outputs['passOutput.myOutputVar'] ]  
  steps:
  - bash: |
     echo $(myVarFromJobA)

Mengatur variabel output untuk digunakan pada tahap mendatang

Variabel output dapat digunakan di seluruh tahap dalam alur. Anda dapat menggunakan variabel output untuk meneruskan informasi yang berguna, seperti ID output yang dihasilkan, dari satu tahap ke tahap berikutnya.

Saat Anda mengatur variabel dengan properti , Anda dapat mereferensikan variabel tersebut isoutput di tahap selanjutnya dengan nama tugas dan stageDependencies sintaks. Pelajari selengkapnya tentang dependensi.

Variabel output hanya tersedia di tahap hilir berikutnya. Jika beberapa tahap menggunakan variabel output yang sama, gunakan kondisi tersebut dependsOn .

Pertama, atur variabel myStageValoutput .

steps:
  - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
    name: MyOutputVar

Kemudian, pada tahap mendatang, petakan variabel output ke variabel myStageVal tahap, pekerjaan, atau cakupan tugas seperti, misalnya, myStageAVar. Perhatikan sintaks pemetaan menggunakan ekspresi $[] runtime dan melacak jalur dari stageDependencies ke variabel output menggunakan nama tahap (A) dan nama pekerjaan (A1) untuk sepenuhnya memenuhi syarat variabel.

stages:
- stage: A
  jobs:
  - job: A1
    steps:
     - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
       name: MyOutputVar
- stage: B
  dependsOn: A
  jobs:
  - job: B1
    variables:
      myStageAVar: $[stageDependencies.A.A1.outputs['MyOutputVar.myStageVal']]
    steps:
      - bash: echo $(myStageAVar)

Jika nilai Anda berisi baris baru, Anda dapat menghindarinya dan agen akan secara otomatis membukanya:

steps:
- bash: |
    escape_data() {
      local data=$1
      data="${data//'%'/'%AZP25'}"
      data="${data//$'\n'/'%0A'}"
      data="${data//$'\r'/'%0D'}"
      echo "$data"
    }
    echo "##vso[task.setvariable variable=myStageVal;isOutput=true]$(escape_data $'foo\nbar')"
  name: MyOutputVar

FAQ

Variabel output saya tidak dirender. Apa yang salah?

Ada beberapa alasan mengapa variabel output Anda mungkin tidak muncul.

  • Variabel output yang diatur dengan isoutput tidak tersedia dalam pekerjaan yang sama dan sebaliknya hanya tersedia dalam pekerjaan hilir.
  • Bergantung pada sintaks variabel apa yang Anda gunakan, variabel yang mengatur nilai variabel output mungkin tidak tersedia saat runtime. Misalnya, variabel dengan sintaks makro ($(var)) diproses sebelum tugas berjalan. Sebaliknya, variabel dengan sintaks templat diproses saat runtime ($[variables.var]). Anda biasanya ingin menggunakan sintaks runtime saat mengatur variabel output. Untuk informasi selengkapnya tentang sintaks variabel, lihat Menentukan variabel.
  • Mungkin ada ruang tambahan dalam ekspresi Anda. Jika variabel Anda tidak dirender, periksa ruang tambahan di sekitarnya isOutput=true.

Anda dapat memecahkan masalah dependencies output untuk pekerjaan atau tahap alur dengan menambahkan variabel untuk dependensi lalu mencetak variabel tersebut. Misalnya, dalam pekerjaan A alur ini mengatur variabel MyTaskoutput . Pekerjaan kedua (B) tergantung pada pekerjaan A. Variabel baru, deps menyimpan representasi JSON dari dependensi pekerjaan. Langkah kedua dalam Pekerjaan B menggunakan PowerShell untuk mencetak deps sehingga Anda dapat melihat dependensi pekerjaan.

trigger:
- '*'

pool:
  vmImage: 'ubuntu-latest'
 
jobs:
- job: A
  steps:
    - script: |
        echo "##vso[task.setvariable variable=MyTask;isOutput=true]theoutputval"
      name: ProduceVar  
- job: B
  dependsOn: A
  variables:
    varFromA: $[ dependencies.A.outputs['ProduceVar.MyTask'] ]
    deps: $[convertToJson(dependencies)] # create a variable with the job dependencies
  steps:
  - script: echo $(varFromA) # 
  - powershell: Write-Host "$(deps)"