İfadeler

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

Önemli

Select a version from Azure DevOps Content Version selector.

Bu makalenin platformunuza ve sürümünüze karşılık gelen sürümünü seçin. Sürüm seçici, içindekiler tablosunun üzerindedir. Azure DevOps platformunuzu ve sürümünüzü arayın.

İfadeler, işlem hattı yazarken dize, boole veya sayı değeri belirtmeniz gereken birçok yerde kullanılabilir. bir ifade bir dizi döndürdüğünde, normal dizin oluşturma kuralları uygulanır ve dizin ile 0başlar.

İfadelerin en yaygın kullanımı, bir işin veya adımın çalıştırılıp çalıştırılmayacağını belirleme koşullarıdır .

# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
  condition: <expression>

İfadelerin bir diğer yaygın kullanımı da değişkenleri tanımlamaktır. İfadeler derleme zamanında veya çalışma zamanında değerlendirilebilir. Derleme zamanı ifadeleri her yerde kullanılabilir; çalışma zamanı ifadeleri değişkenlerde ve koşullarda kullanılabilir. Çalışma zamanı ifadeleri, değişkenlerin ve durumun içeriğini hesaplamanın bir yolu olarak tasarlanmıştır (örnek: condition).

# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
  a: ${{ <expression> }}
  b: $[ <expression> ]

Çalışma zamanı ve derleme zamanı ifade söz dizimleri arasındaki fark öncelikle hangi bağlamın kullanılabilir olduğudur. Derleme zamanı ifadesinde ()${{ <expression> }} öğesine parameters erişiminiz vardır ve statik olarak tanımlanmıştır variables. Bir çalışma zamanı ifadesinde ()$[ <expression> ] daha fazla variables parametreye erişiminiz var ancak parametre yok.

Bu örnekte, çalışma zamanı ifadesi değerini $(isMain)ayarlar. Derleme ifadesindeki statik değişken değerini $(compileVar)ayarlar.

variables:
  staticVar: 'my value' # static variable
  compileVar: ${{ variables.staticVar }} # compile time expression
  isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] # runtime expression

steps:
  - script: |
      echo ${{variables.staticVar}} # outputs my value
      echo $(compileVar) # outputs my value
      echo $(isMain) # outputs True

İfade değişmez değer, değişken başvurusu, bağımlılık başvurusu, işlev veya bunların geçerli bir iç içe birleşimi olabilir.

Değişmez Değerler

bir ifadenin parçası olarak boole, null, sayı, dize veya sürüm değişmez değerlerini kullanabilirsiniz.

# Examples
variables:
  someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
  someNumber: ${{ -1.2 }}
  someString: ${{ 'a b c' }}
  someVersion: ${{ 1.2.3 }}

Boolean

True ve False boole değişmez değer ifadeleridir.

Boş

Null, sözlük kaçırmavariables['noSuch'] örneğinden () döndürülen özel bir değişmez değer ifadesidir. Null, bir ifadenin çıkışı olabilir ancak doğrudan bir ifade içinde çağrılamaz.

Sayı

'-', '.' veya '0' ile '9' arasında başlar.

String

Tek tırnak içine alınmalıdır. Örneğin: 'this is a string'.

Değişmez bir tek tırnak işaretini ifade etmek için tek bir tırnak işaretiyle kaçış tuşuna basılın. Örneğin: 'It''s OK if they''re using contractions.'.

Çok satırlı dizeler için bir kanal karakteri (|) kullanabilirsiniz.

myKey: |
  one
  two
  three

Sürüm

Dört segmente kadar olan bir sürüm numarası. Bir sayı ile başlamalıdır ve iki veya üç nokta (.) karakter içermelidir. Örneğin: 1.2.3.4.

Değişkenler

bir ifadenin parçası olarak, iki söz dizimlerinden birini kullanarak değişkenlere erişebilirsiniz:

  • Dizin söz dizimi: variables['MyVar']
  • Özellik başvuru kaldırma söz dizimi: variables.MyVar

Özellik başvuru kaldırma söz dizimini kullanmak için özellik adı şunları yapmalıdır:

  • veya ile a-Z başlayın _
  • Veya tarafından a-Z0-9 takip edilebilir _

Yürütme bağlamı bağlı olarak, farklı değişkenler kullanılabilir.

  • YAML kullanarak işlem hatları oluşturursanız işlem hattı değişkenleri kullanılabilir.
  • Derleme işlem hatlarını klasik düzenleyici kullanarak oluşturursanız derleme değişkenleri kullanılabilir.
  • Klasik düzenleyiciyi kullanarak yayın işlem hatları oluşturursanız yayın değişkenleri kullanılabilir.

Değişkenler her zaman dizedir. Yazılan değerleri kullanmak istiyorsanız, bunun yerine parametreleri kullanmanız gerekir.

Dekont

Değişkenler sekmesi kullanıcı arabirimi aracılığıyla bu tür değişkenleri ayarlarken hem Klasik hem de YAML işlem hatları için ifadelerle değişkenlerin kullanılmasına yönelik bir sınırlama vardır. İfade olarak tanımlanan değişkenler, her iki ifadenin de düzgün şekilde değerlendirileceği garanti edilmediğinden, değeri ifade olan başka bir değişkene bağımlı olmamalıdır. Örneğin, değeri değişkeninin a değeri $[ <expression> ] için bir parçası olarak kullanılan değişkenimiz bvar. Değişkenleri işleme sırası, değişkenin b değerlendirmeden sonra yanlış bir değişken a değerine sahip olabileceği garantili olmadığından.

Açıklanan yapılara yalnızca YAML işlem hattında değişkenler anahtar sözcüğü aracılığıyla değişkenleri ayarlarken izin verilir. İşlendikten sonra doğru değerleri almak için değişkenlerin işlenme sırasına göre ayarlanması gerekir.

İşlevler

İfadelerde aşağıdaki yerleşik işlevler kullanılabilir.

ve

  • Tüm parametrelerin TrueTrue
  • En düşük parametreler: 2. En fazla parametre: N
  • Parametreleri değerlendirme için Boole'a yayınlar
  • İlk devreden sonra kısa devreler False
  • Örnek: and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))

Coalesce

  • Parametreleri sırayla (soldan sağa) değerlendirir ve null veya boş dizeye eşit olmayan ilk değeri döndürür.
  • Parametre değerlerinin tümü null veya boş dizeyse değer döndürülür.
  • En düşük parametreler: 2. En fazla parametre: N
  • Örnek: coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')

içerir

  • Sol parametre Dizesinde True doğru parametre olup olmadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Parametreleri değerlendirme için Dizeye gönderir
  • Sıralı yoksayma-büyük/küçük harf karşılaştırması gerçekleştirir
  • Örnek: contains('ABCDE', 'BCD') (True döndürür)

containsValue

  • True Sol parametrenin bir dizi olup olmadığını ve herhangi bir öğenin doğru parametreye eşit olup olmadığını değerlendirir. Ayrıca sol parametrenin bir nesne olup olmadığını ve herhangi bir özelliğin değerinin doğru parametreye eşit olup olmadığını değerlendirir True .
  • En düşük parametreler: 2. En fazla parametre: 2
  • Sol parametre bir diziyse, her öğeyi doğru parametrenin türüyle eşleşecek şekilde dönüştürün. Sol parametre bir nesneyse, her özelliğin değerini doğru parametrenin türüyle eşleşecek şekilde dönüştürün. Her bir öğe için eşitlik karşılaştırması, dönüştürmenin başarısız olup olmadığını değerlendirir False .
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • İlk maçtan sonra kısa devreler

Dekont

YAML işlem hattında dizi belirtmek için değişmez söz dizimi yoktur. Bu işlev genel işlem hatlarında sınırlı kullanımdadır. Adım listesi gibi sistem tarafından sağlanan dizilerle işlem hattı dekoratörü bağlamında kullanıma yöneliktir.

bir nesnede eşleşen bir değer bulmak için ifadeyi containsValue kullanabilirsiniz. Burada, için eşleşme Build.SourceBranchiçin kaynak dallar listesine bakmayı gösteren bir örnek verilmiştir.

parameters:
- name: branchOptions
  displayName: Source branch options
  type: object
  default:
    - refs/heads/main
    - refs/heads/test

jobs:
  - job: A1 
    steps:
    - ${{ each value in parameters.branchOptions }}:
      - script: echo ${{ value }}

  - job: B1 
    condition: ${{ containsValue(parameters.branchOptions, variables['Build.SourceBranch']) }}
    steps:
      - script: echo "Matching branch found"

convertToJson

  • Karmaşık bir nesne alın ve JSON olarak çıkışını alır.
  • En düşük parametreler: 1. En fazla parametre: 1.
parameters:
  - name: listOfValues
    type: object
    default:
      this_is:
        a_complex: object
        with:
          - one
          - two

steps:
- script: |
    echo "${MY_JSON}"
  env:
    MY_JSON: ${{ convertToJson(parameters.listOfValues) }}

Betik çıkışı:

{
  "this_is": {
    "a_complex": "object",
    "with": [
      "one",
      "two"
    ]
  }
}

counter

  • Bu işlev yalnızca değişken tanımlayan bir ifadede kullanılabilir. Bir adım, iş veya aşama için bir koşulun parçası olarak kullanılamaz.
  • bir işlem hattının her çalıştırmasıyla artırılan bir sayıyı değerlendirir.
  • Parametreler: 2. prefix ve seed.
  • Ön ek bir dize ifadesidir. Her benzersiz ön ek değeri için ayrı bir sayaç değeri izlenir. UTF-16 prefix karakterlerini kullanmalıdır.
  • Tohum, sayacın başlangıç değeridir

İşlem hattınızın her yürütmesinde otomatik olarak bir artırılan bir sayaç oluşturabilirsiniz. Bir sayaç tanımladığınızda, bir prefix ve seedsağlarsınız. Bunu gösteren bir örnek aşağıda verilmiştir.

variables:
  major: 1
  # define minor as a counter with the prefix as variable major, and seed as 100.
  minor: $[counter(variables['major'], 100)]

steps:
- bash: echo $(minor)

minor İşlem hattının ilk çalıştırmasında yukarıdaki örnekte değeri 100 olacaktır. İkinci çalıştırmada değeri major hala 1 olması koşuluyla 101 olacaktır.

YAML dosyasını düzenler ve değişkenin major değerini 2 olarak güncelleştirirseniz, işlem hattının bir sonraki çalıştırmasında değeri minor 100 olur. Sonraki çalıştırmalar sayacı 101, 102, 103, ...

Daha sonra YAML dosyasını düzenler ve değerini major 1 olarak ayarlarsanız, sayacın değeri bu ön ek için kaldığı yerden devam eder. Bu örnekte 102'de devam eder.

Burada, 100'de başlayan, her çalıştırma için 1 artırılan ve her gün 100'e sıfırlanan bir sayaç olarak davranacak bir değişken ayarlamanın başka bir örneği verilmiştir.

Dekont

pipeline.startTime ifadelerin dışında kullanılamaz. pipeline.startTime bir tarih ve saat nesnesine biçimlendirerek system.pipelineStartTime ifadelerle çalışabilmesini sağlar. için pipeline.startTime varsayılan saat dilimi UTC'dir. Kuruluşunuzun saat dilimini değiştirebilirsiniz.

jobs:
- job:
  variables:
    a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
  steps:
  - bash: echo $(a)

Burada, PR'ler ve CI çalıştırmaları için ayrı bir değer tutan bir sayaç olması örneği verilmiştir.

variables:
  patch: $[counter(variables['build.reason'], 0)]

Sayaçların kapsamı bir işlem hattı olarak belirlenmiştir. Başka bir deyişle, bu işlem hattının her çalıştırması için değeri artırılır. Proje kapsamlı sayaç yok.

Endswith

  • Sol parametre Dizesinin True doğru parametreyle bitip bitmediğini değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Parametreleri değerlendirme için Dizeye gönderir
  • Sıralı yoksayma-büyük/küçük harf karşılaştırması gerçekleştirir
  • Örnek: endsWith('ABCDE', 'DE') (True döndürür)

eşittir

  • Parametrelerin True eşit olup olmadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Sağ parametreyi sol parametrenin türüyle eşleşecek şekilde dönüştürür. Dönüştürme başarısız olursa döndürür False .
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • Örnek: eq(variables.letters, 'ABC')

format

  • Sondaki parametreleri değerlendirir ve bunları baştaki parametre dizesine ekler
  • En düşük parametreler: 1. En fazla parametre: N
  • Örnek: format('Hello {0} {1}', 'John', 'Doe')
  • Tarih biçimlendirmesi (, , yy, MM, , ddM, HHmmHdm, ss, s, fff) Kffffiçin .NET özel tarih ve saat biçimi tanımlayıcılarını kullanır yyyy
  • Örnek: format('{0:yyyyMMdd}', pipeline.startTime). Bu durumda pipeline.startTime , özel bir tarih saat nesne değişkenidir.
  • Küme ayraçlarını ikiye katlayarak kaçış. Örneğin: format('literal left brace {{ and literal right brace }}')

ge

  • True Sol parametrenin doğru parametreden büyük veya buna eşit olup olmadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Sağ parametreyi sol parametrenin türüyle eşleşecek şekilde dönüştürür. Dönüştürme başarısız olursa hatalar.
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • Örnek: ge(5, 5) (True döndürür)

gt

  • True Sol parametrenin doğru parametreden büyük olup olmadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Sağ parametreyi sol parametrenin türüyle eşleşecek şekilde dönüştürür. Dönüştürme başarısız olursa hatalar.
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • Örnek: gt(5, 2) (True döndürür)

içinde

  • Sol parametrenin True herhangi bir doğru parametreye eşit olup olmadığını değerlendirir
  • En düşük parametreler: 1. En fazla parametre: N
  • Sağ parametreleri sol parametrenin türüyle eşleşecek şekilde dönüştürür. Eşitlik karşılaştırması False , dönüştürmenin başarısız olup olmadığını değerlendirir.
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • İlk maçtan sonra kısa devreler
  • Örnek: in('B', 'A', 'B', 'C') (True döndürür)

join

  • Sağ parametre dizisindeki tüm öğeleri sol parametre dizesiyle ayırarak birleştirir.
  • En düşük parametreler: 2. En fazla parametre: 2
  • Dizideki her öğe bir dizeye dönüştürülür. Karmaşık nesneler boş dizeye dönüştürülür.
  • Doğru parametre bir dizi değilse, sonuç dizeye dönüştürülen doğru parametredir.

Bu örnekte, dizideki her öğe arasına noktalı virgül eklenir. Parametre türü bir nesnedir.

parameters:
- name: myArray
  type: object
  default:
    - FOO
    - BAR
    - ZOO

variables:
   A: ${{ join(';',parameters.myArray) }}

steps:
  - script: echo $A # outputs FOO;BAR;ZOO

le

  • True Sol parametrenin doğru parametreden küçük veya buna eşit olup olmadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Sağ parametreyi sol parametrenin türüyle eşleşecek şekilde dönüştürür. Dönüştürme başarısız olursa hatalar.
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • Örnek: le(2, 2) (True döndürür)

uzunluk

  • Sistemden gelen veya bir parametreden gelen bir dizenin veya dizinin uzunluğunu verir
  • En düşük parametreler: 1. En fazla parametre 1
  • Örnek: length('fabrikam') 8 döndürür

Alt

  • Bir dizeyi veya değişken değerini tüm küçük harflere dönüştürür
  • En düşük parametreler: 1. En fazla parametre 1
  • Dizenin küçük harf eşdeğerini verir
  • Örnek: lower('FOO') döndürür foo

lt

  • True Sol parametrenin doğru parametreden küçük olup olmadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Sağ parametreyi sol parametrenin türüyle eşleşecek şekilde dönüştürür. Dönüştürme başarısız olursa hatalar.
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • Örnek: lt(2, 5) (True döndürür)

ne

  • Parametrelerin True eşit olup olmadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Sağ parametreyi sol parametrenin türüyle eşleşecek şekilde dönüştürür. Dönüştürme başarısız olursa döndürür True .
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • Örnek: ne(1, 2) (True döndürür)

not

  • True ParametreninFalse
  • En düşük parametreler: 1. En fazla parametre: 1
  • Değerlendirme için değeri Boole değerine dönüştürür
  • Örnek: not(eq(1, 2)) (True döndürür)

notIn

  • Sol parametrenin True herhangi bir doğru parametreye eşit olup olmadığını değerlendirir
  • En düşük parametreler: 1. En fazla parametre: N
  • Sağ parametreleri sol parametrenin türüyle eşleşecek şekilde dönüştürür. Eşitlik karşılaştırması False , dönüştürmenin başarısız olup olmadığını değerlendirir.
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • İlk maçtan sonra kısa devreler
  • Örnek: notIn('D', 'A', 'B', 'C') (True döndürür)

veya

  • True Herhangi bir parametrenin olup olmadığını değerlendirirTrue
  • En düşük parametreler: 2. En fazla parametre: N
  • Parametreleri değerlendirme için Boole'a yayınlar
  • İlk devreden sonra kısa devreler True
  • Örnek: or(eq(1, 1), eq(2, 3)) (True, short-circuits döndürür)

replace

  • Geçerli örnekteki bir dizenin tüm örneklerinin başka bir dizeyle değiştirildiği yeni bir dize döndürür
  • En düşük parametreler: 3. En fazla parametre: 3
  • replace(a, b, c): tüm b örneklerinin c ile değiştirilerek a döndürür
  • Örnek: replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server') (döndürür http://server/saml/consume)

split

  • Belirtilen sınırlandırma karakterlerine göre bir dizeyi alt dizelere böler
  • En düşük parametreler: 2. En fazla parametre: 2
  • İlk parametre bölünecek dizedir
  • İkinci parametre sınırlandırma karakterleridir
  • Bir alt dize dizisi döndürür. Sınırlayıcı karakterler ardışık olarak veya dizenin sonunda göründüğünde dizi boş dizeler içerir
  • Örnek:
    variables:
    - name: environments
      value: prod1,prod2 
    steps:  
      - ${{ each env in split(variables.environments, ',')}}:
        - script: ./deploy.sh --environment ${{ env }}
    
  • replace() ile split() kullanma örneği:
    parameters:
    - name: resourceIds
      type: object
      default:
      - /subscriptions/mysubscription/resourceGroups/myResourceGroup/providers/Microsoft.Network/loadBalancers/kubernetes-internal
      - /subscriptions/mysubscription02/resourceGroups/myResourceGroup02/providers/Microsoft.Network/loadBalancers/kubernetes
    - name: environments
      type: object
      default: 
      - prod1
      - prod2
    
    trigger:
    - main
    
    steps:
    - ${{ each env in parameters.environments }}:
      - ${{ each resourceId in parameters.resourceIds }}:
          - script: echo ${{ replace(split(resourceId, '/')[8], '-', '_') }}_${{ env }}
    

Startswith

  • Sol parametre dizesinin True doğru parametreyle başlayıp başlamaymadığını değerlendirir
  • En düşük parametreler: 2. En fazla parametre: 2
  • Parametreleri değerlendirme için Dizeye gönderir
  • Sıralı yoksayma-büyük/küçük harf karşılaştırması gerçekleştirir
  • Örnek: startsWith('ABCDE', 'AB') (True döndürür)

Üst

  • Bir dizeyi veya değişken değerini tüm büyük harflere dönüştürür
  • En düşük parametreler: 1. En fazla parametre 1
  • Dizenin büyük harf eşdeğerini verir
  • Örnek: upper('bah') döndürür BAH

xor

  • True Tam olarak bir parametre olup olmadığını değerlendirirTrue
  • En düşük parametreler: 2. En fazla parametre: 2
  • Parametreleri değerlendirme için Boole'a yayınlar
  • Örnek: xor(True, False) (True döndürür)

İş durumu denetimi işlevleri

Aşağıdaki durum denetimi işlevlerini koşullarda ifade olarak kullanabilirsiniz, ancak değişken tanımlarında kullanamazsınız.

her zaman

  • Her zaman olarak değerlendirilir True (iptal edildiğinde bile). Not: Kritik bir hata, bir görevin çalışmasını yine de engelleyebilir. Örneğin, kaynakları alma başarısız olursa.

Iptal

  • True İşlem hattının iptal edilip iptal edilmediğini değerlendirir.

başarısız

  • Bir adım için, ile eşdeğerdir eq(variables['Agent.JobStatus'], 'Failed').
  • bir iş için:
    • Bağımsız değişken olmadan, yalnızca bağımlılık grafiğindeki önceki bir iş başarısız olursa olarak değerlendirilir True .
    • bağımsız değişken olarak iş adları ile, yalnızca bu işlerden herhangi biri başarısız olursa olarak değerlendirilir True .

Başarılı

  • Bir adım için, in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues')
  • İşlerle çalışırken ile dependsOn kullanın ve önceki bir işin başarılı olup olmadığını değerlendirmek istiyorsunuz. İşler, aşamalar sırayla çalışırken paralel çalışacak şekilde tasarlanmıştır.
  • bir iş için:
    • Bağımsız değişken olmadan, yalnızca bağımlılık grafiğindeki önceki tüm işler başarılı veya kısmen başarılı olursa olarak değerlendirilir True .
    • bağımsız değişken olarak iş adları ile, bu işlerin tümünün başarılı mı yoksa kısmen başarılı mı olduğunu değerlendirir True .
    • False İşlem hattının iptal edilip iptal edilmediğini değerlendirir.

succeededOrFailed

  • Bir adım için, in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed')

  • bir iş için:

    • Bağımsız değişken olmadan, bağımlılık grafiğindeki herhangi bir işin başarılı veya başarısız olup olmadığına bakılmaksızın değerini değerlendirir True .
    • bağımsız değişken olarak iş adları ile, bu işlerden herhangi birinin başarılı mı yoksa başarısız mı olduğunu değerlendirir True .
    • Bunun yerine, bağımlılık grafiğinde daha önce atlanan işler olduğunda kullanmak not(canceled()) isteyebilirsiniz.

    İşlem hattı iptal edildiğinde değerlendirilecek False olması dışında bu, gibi always()bir işlemdir.

Koşullu ekleme

Değişken değerleri koşullu olarak atamak veya görevler için girişler ayarlamak için , elseifve else yan tümcelerini kullanabilirsinizif. Bir koşul karşılandığında bir adımı koşullu olarak da çalıştırabilirsiniz.

Değişken değerlerini koşullu olarak atamak veya görevler için girişler ayarlamak için kullanabilirsiniz if . Bir koşul karşılandığında bir adımı koşullu olarak da çalıştırabilirsiniz.

elseif ve else yan tümceleri Azure DevOps 2022'den itibaren kullanılabilir ve Azure DevOps Server 2020 ve Azure DevOps'un önceki sürümlerinde kullanılamaz.

Koşullular yalnızca şablon söz dizimi kullanılırken çalışır. Değişken söz dizimi hakkında daha fazla bilgi edinin.

Şablonlar için, bir dizi veya eşleme eklerken koşullu ekleme kullanabilirsiniz. Şablonlara koşullu ekleme hakkında daha fazla bilgi edinin.

Bir değişkeni koşullu olarak atama

variables:
  ${{ if eq(variables['Build.SourceBranchName'], 'main') }}: # only works if you have a main branch
    stageName: prod

pool:
  vmImage: 'ubuntu-latest'

steps:
- script: echo ${{variables.stageName}}

Görev girişini koşullu olarak ayarlama

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Pipeline.Workspace)'
    ${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
      artifact: 'prod'
    ${{ else }}:
      artifact: 'dev'
    publishLocation: 'pipeline'

Bir adımı koşullu olarak çalıştırma

Değişken kümesi yoksa veya değeri foo koşullarla if eşleşmiyorsa deyimi else çalıştırılır. Burada değeri foo koşulda elseif true değerini döndürür.

variables:
  - name: foo
    value: contoso # triggers elseif condition

pool:
  vmImage: 'ubuntu-latest'

steps:
- script: echo "start"
- ${{ if eq(variables.foo, 'adaptum') }}:
  - script: echo "this is adaptum"
- ${{ elseif eq(variables.foo, 'contoso') }}: # true
  - script: echo "this is contoso" 
- ${{ else }}:
  - script: echo "the value is not adaptum or contoso"

Her anahtar sözcük

Anahtar sözcüğünü each kullanarak nesne türüyle parametreler arasında döngü yapabilirsiniz.

parameters:
- name: listOfStrings
  type: object
  default:
  - one
  - two

steps:
- ${{ each value in parameters.listOfStrings }}:
  - script: echo ${{ value }}

Ayrıca, bir nesnenin içindeki iç içe öğeler arasında yineleme yapabilirsiniz.

parameters:
- name: listOfFruits
  type: object
  default:
  - fruitName: 'apple'
    colors: ['red','green']
  - fruitName: 'lemon'
    colors: ['yellow']
steps:
- ${{ each fruit in parameters.listOfFruits }} :
  - ${{ each fruitColor in fruit.colors}} :
    - script: echo ${{ fruit.fruitName}} ${{ fruitColor }}

Bağımlılıklar

İfadeler, önceki işlere veya aşamalara başvurmak için bağımlılıklar bağlamını kullanabilir. Bağımlılıkları kullanarak:

  • Önceki işin iş durumuna başvurma
  • Önceki bir aşamanın aşama durumuna başvurma
  • Aynı aşamadaki önceki işteki çıkış değişkenlerine başvurma
  • Bir aşamada önceki aşamadaki çıkış değişkenlerine başvurma
  • Aşağıdaki aşamada önceki bir aşamadaki bir işteki çıkış değişkenlerine başvuruda bulunur

Bağlam işler ve aşamalar için çağrılır dependencies ve değişkenlere çok benzer şekilde çalışır. Başka bir aşamadaki bir işten bir çıkış değişkenine başvurursanız, bağlam olarak adlandırılır stageDependencies.

Çıkış değişkenlerinde tırnak karakterleri (' veya ") bulunan sorunlarla karşılaşıyorsanız bu sorun giderme kılavuzuna bakın.

Bağımlılık söz dizimine genel bakış

Çıkış değişkenlerine bağımlılıklarla başvurma söz dizimi koşullara bağlı olarak değişir. En yaygın senaryolara genel bir bakış aşağıdadır. Alternatif söz dizimlerinin de işe yarayabileceği zamanlar olabileceğini unutmayın.

Türü

Açıklama

aşamadan aşamaya bağımlılık (farklı aşamalar)

içindeki bir koşuldaki farklı bir aşamadaki bir işin önceki aşamasından bir çıkış değişkenine stagesbaşvurma.

  • Söz dizimi: and(succeeded(), eq(stageDependencies.<stage-name>.outputs['<job-name>.<step-name>.<variable-name>'], 'true'))
  • Örnek: and(succeeded(), eq(stageDependencies.A.outputs['A1.printvar.shouldrun'], 'true'))

içinde aynı aşamadaki farklı bir işteki bir çıkış değişkenine stagesbaşvurma.

  • Söz dizimi: and(succeeded(), eq(dependencies.<stage-name>.outputs['<step-name>.<variable-name>'], 'true'))
  • Örnek: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))

Bağımlılığı hazırlama işi (farklı aşamalar)

içindeki farklı bir aşamadaki bir jobçıkış değişkenine başvurma.

  • Söz dizimi: eq(stageDependencies.<stage-name>.<job-name>.outputs['<step-name>.<variable-name>'], 'true')
  • Örnek: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')

içinde farklı bir aşamadaki bir dağıtım işinde çıkış değişkenine başvuruda bulunur stages.

  • Söz dizimi: eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<deployment-job-name>.<step-name>.<variable-name>'], 'true')
  • Örnek: eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')

Bağımlılığı aşamaya hazırlama (kaynakla dağıtım işi)

içinde farklı aşamadaki bir kaynağı içeren bir dağıtım işinde çıkış değişkenine stagesbaşvurma.

  • Söz dizimi: eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<Deploy_resource-name>.<step-name>.<variable-name>'], 'true')
  • Örnek: eq(dependencies.build.outputs['build_job.Deploy_winVM.setRunTests.runTests'], 'true')

Dağıtım stratejisine bağlı olarak dağıtım işlerinde çıkış değişkenleri için farklı söz dizimleri de vardır. Daha fazla bilgi için bkz . Dağıtım işleri.

Bağımlılıkları aşamaya hazırlama

Yapısal olarak, dependencies nesnesi ve için iş ve aşama adlarının resultsoutputsbir haritasıdır. JSON olarak ifade edilirse şöyle görünür:

"dependencies": {
  "<STAGE_NAME>" : {
    "result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
    "outputs": {
        "jobName.stepName.variableName": "value"
    }
  },
  "...": {
    // another stage
  }
}

Dekont

Aşağıdaki örneklerde standart işlem hattı söz dizimi kullanılır. Dağıtım işlem hatlarını kullanıyorsanız hem değişken hem de koşullu değişken söz dizimi farklılık gösterir. Kullanılacak söz dizimi hakkında bilgi için bkz . Dağıtım işleri.

Değişkenleri eşlemek veya aşama düzeyinde koşulları denetlemek için bu biçimini dependencies kullanın.

Bu örnekte, A ve B olmak üzere iki aşama vardır. A aşaması koşula false sahiptir ve sonuç olarak hiçbir zaman çalışmaz. Aşama A'nın sonucu , SucceededWithIssuesveya Skippedise SucceededB aşaması çalışır. Aşama A atlandığı için B aşaması çalıştırılır.

stages:
- stage: A
  condition: false
  jobs:
  - job: A1
    steps:
    - script: echo Job A1
- stage: B
  condition: in(dependencies.A.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
  jobs:
  - job: B1
    steps:
    - script: echo Job B1

Aşamalar başka bir aşamadaki çıkış değişkenlerini de kullanabilir. Bu örnekte iki aşama da vardır. Aşama A, çıkış değişkenlerini shouldrun olarak trueayarlayan A1 adlı bir iş içerir. Aşama B, olduğunda shouldruntrueçalışır. Çünkü shouldrun , trueAşama B çalışır.

stages:
- stage: A
  jobs:
  - job: A1
    steps:
     - bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
     # or on Windows:
     # - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
       name: printvar

- stage: B
  condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
  dependsOn: A
  jobs:
  - job: B1
    steps:
    - script: echo hello from Stage B

Dekont

Varsayılan olarak, bir işlem hattındaki her aşama YAML dosyasından hemen önceki aşamaya bağlıdır. Geçerli aşamadan hemen önce olmayan bir aşamaya başvurmanız gerekiyorsa, aşamaya bir dependsOn bölüm ekleyerek bu otomatik varsayılanı geçersiz kılabilirsiniz.

Bir aşamada iş bağımlılıklarına iş

Tek bir aşamadaki iş düzeyinde veriler aşama dependencies düzeyinde bilgi içermez.

"dependencies": {
  "<JOB_NAME>": {
    "result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
    "outputs": {
      "stepName.variableName": "value1"
    }
  },
  "...": {
    // another job
  }
}

Bu örnekte üç iş (a, b ve c) vardır. a işi, nedeniyle condition: falseher zaman atlanır. B işi, ilişkili koşul olmadığından çalışır. C işi çalışır çünkü tüm bağımlılıkları başarılı olur (b işi) veya atlanır (iş a).

jobs:
- job: a
  condition: false
  steps:
  - script: echo Job a
- job: b
  steps:
  - script: echo Job b
- job: c
  dependsOn:
  - a
  - b
  condition: |
    and
    (
      in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
      in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
    )
  steps:
  - script: echo Job c

Bu örnekte İş B, İş A'dan bir çıkış değişkenine bağlıdır.

jobs:
- job: A
  steps:
  - bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
  # or on Windows:
  # - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
    name: printvar

- job: B
  condition: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
  dependsOn: A
  steps:
  - script: echo hello from B

Aşamalar arasında işten işe bağımlılıklar

İş düzeyinde, önceki aşamadaki bir işin çıkışlarına da başvurabilirsiniz. Bunun için bağlamın stageDependencies kullanılması gerekir.

"stageDependencies": {
  "<STAGE_NAME>" : {
    "<JOB_NAME>": {
      "result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
      "outputs": {
          "stepName.variableName": "value"
      }
    },
    "...": {
      // another job
    }
  },
  "...": {
    // another stage
  }
}

Bu örnekte, A1 işi atlanırsa B1 işi çalışır. B2 işi, çalıştırılıp çalıştırılmayacağını belirlemek için A1 işinden çıkış değişkeninin değerini denetler.

stages:
- stage: A
  jobs:
  - job: A1
    steps:
     - bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
     # or on Windows:
     # - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
       name: printvar

- stage: B
  dependsOn: A
  jobs:
  - job: B1
    condition: in(stageDependencies.A.A1.result, 'Skipped') # change condition to `Succeeded and stage will be skipped`
    steps:
    - script: echo hello from Job B1
  - job: B2
    condition: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
    steps:
     - script: echo hello from Job B2

bir iş, farklı bir aşamadaki bir dağıtım işi tarafından tanımlanan bir değişkene bağımlıysa söz dizimi farklıdır. Aşağıdaki örnekte, dağıtım işi run_tests olarak ayarlandıysa build_jobrunTeststrueiş çalışır. Sözlük için kullanılan anahtarın outputs olduğuna build_job.setRunTests.runTestsdikkat edin.

stages:
- stage: build
  jobs:
  - deployment: build_job
    environment:
      name: Production
    strategy:
      runOnce:
        deploy:
          steps:
          - task: PowerShell@2
            name: setRunTests
            inputs:
              targetType: inline
              pwsh: true
              script: |
                $runTests = "true"
                echo "setting runTests: $runTests"
                echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"

- stage: test
  dependsOn:
  - 'build'
  jobs:  
    - job: run_tests
      condition: eq(stageDependencies.build.build_job.outputs['build_job.setRunTests.runTests'], 'true')
      steps:
        ...

Dağıtım işi çıkış değişkenleri

Aşama, farklı bir aşamadaki bir dağıtım işi tarafından tanımlanan bir değişkene bağımlıysa söz dizimi farklıdır. Aşağıdaki örnekte, aşama test için dağıtım build_job ayarına shouldTesttruebağlıdır. Aşamanın build_job içinde condition iki kez göründüğüne test dikkat edin.

stages:
- stage: build
  jobs:
  - deployment: build_job
    environment:
      name: Production
    strategy:
      runOnce:
        deploy:
          steps:
          - task: PowerShell@2
            name: setRunTests
            inputs:
              targetType: inline
              pwsh: true
              script: |
                $runTests = "true"
                echo "setting runTests: $runTests"
                echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"

- stage: test
  dependsOn:
  - 'build'
  condition: eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
  jobs:
    - job: A
      steps:
        - script: echo Hello from job A

Yukarıdaki örnekte koşul, ortam kaynağına değil bir ortama başvurur. Bir ortam kaynağına başvurmak için, ortam kaynağı adını bağımlılıklar koşuluna eklemeniz gerekir. Aşağıdaki örnekte koşul adlı bir ortam sanal makine kaynağına vmtestbaşvurur.

stages:
- stage: build
  jobs:
  - deployment: build_job
    environment:
      name: vmtest
      resourceName: winVM2
      resourceType: VirtualMachine
    strategy:
      runOnce:
        deploy:
          steps:
          - task: PowerShell@2
            name: setRunTests
            inputs:
              targetType: inline
              pwsh: true
              script: |
                $runTests = "true"
                echo "setting runTests: $runTests"
                echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"

- stage: test
  dependsOn:
  - 'build'
  condition: eq(dependencies.build.outputs['build_job.Deploy_winVM2.setRunTests.runTests'], 'true')
  jobs:
  - job: A
    steps:
     - script: echo Hello from job A

Filtrelenmiş diziler

Bir öğe koleksiyonu üzerinde çalışırken, filtrelenmiş bir dizi uygulamak için söz dizimini * kullanabilirsiniz. Filtrelenmiş bir dizi, adlarından bağımsız olarak tüm nesneleri/öğeleri döndürür.

Örneğin, adlı foobir nesne dizisi düşünün. Dizimizdeki her nesnedeki özelliğin değerlerinin bir dizisini id almak istiyoruz.

[
    { "id": 1, "a": "avalue1"},
    { "id": 2, "a": "avalue2"},
    { "id": 3, "a": "avalue3"}
]

Aşağıdakileri yapabiliriz:

foo.*.id

Bu, sisteme filtrelenmiş bir dizi olarak çalışmasını foo ve ardından özelliğini seçmesini id söyler.

Bu, şunu döndürür:

[ 1, 2, 3 ]

Tür atama

İfadedeki değerler, ifade değerlendirildikçe bir türden diğerine dönüştürülebilir. bir ifade değerlendirildiğinde, parametreler ilgili veri türüyle birleştirilir ve sonra dizelere geri döner.

Örneğin, bu YAML'de ve değerleri ve ifadesi değerlendirildiğinde olarak dönüştürülür 01.TrueFalse lt() İşlev, sol parametre sağ parametreden küçük olduğunda döndürürTrue.

variables:
  firstEval: $[lt(False, True)] # 0 vs. 1, True
  secondEval: $[lt(True, False)] # 1 vs. 0, False

steps:
- script: echo $(firstEval)
- script: echo $(secondEval)

Bu örnekte, hem değerler variables.emptyString hem de boş dize boş dizeler olarak değerlendirilir. İşlev coalesce() , parametreleri sırayla değerlendirir ve null veya boş dizeye eşit olmayan ilk değeri döndürür.

variables:
  coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]

steps:
- script: echo $(coalesceLiteral) # outputs literal value

Ayrıntılı dönüştürme kuralları aşağıda daha ayrıntılı olarak listelenmiştir.

Kimden / Son Boolean Boş Sayı String Sürüm
Boolean - - Evet Evet -
Null Evet - Evet Evet -
Numara Evet - - Evet Kısmi
Dize Evet Kısmi Kısmi - Kısmi
Sürüm Evet - - Evet -

Boolean

Numaraya:

  • False0
  • True1

Dizeye:

  • False'False'
  • True'True'

Boş

  • Boole'a: False
  • Numaraya: 0
  • Dizeye: '' (boş dize)

Sayı

  • Boole'ya: 0False, başka bir sayı → True
  • Sürüm: Sıfırdan büyük olmalı ve sıfır olmayan bir ondalık içermelidir. Int32.MaxValue değerinden küçük olmalıdır (ondalık bileşen de).
  • Dizeye: Sayıyı binlik ayırıcısı olmayan ve ondalık ayırıcısı olmayan bir dizeye dönüştürür.

String

  • To Boole: '' (boş dize) → False, diğer tüm dizeler → True
  • To null: '' (boş dize) → Null, dönüştürülemez başka bir dize
  • Numaralandırmak için: '' (boş dize) 0 →, aksi takdirde, C#'Int32.TryParseleri InvariantCulture ve şu kuralları kullanarak çalıştırır: AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | Allowtrailingwhite. Başarısız TryParse olursa dönüştürülemez.
  • Sürüme: C# öğesini Version.TryParseçalıştırır. En az Birincil ve İkincil bileşen içermelidir. Başarısız TryParse olursa dönüştürülemez.

Sürüm

  • Boole'a: True
  • Dizeye: Major.Minor veya Major.Minor.Build veya Major.Minor.Build.Revision.

SSS

İfadeler tarafından desteklenmeyen bir şey yapmak istiyorum. İşlem Hatları işlevselliğini genişletmek için hangi seçeneklerim var?

İşlem Hattınızı ifade içeren bir betikle özelleştirebilirsiniz. Örneğin, bu kod parçacığı değişkeni alır BUILD_BUILDNUMBER ve Bash ile böler. Bu betik, $MAJOR_RUN birincil ve $MINOR_RUNikincil çalıştırma numaraları için ve adlı iki yeni değişkenin çıkışını oluşturur. ardından iki değişken, $major$minor task.setvariable ile iki işlem hattı değişkeni oluşturmak için kullanılır. Bu değişkenler aşağı akış adımlarında kullanılabilir. İşlem hatları arasında değişkenleri paylaşmak için bkz . Değişken grupları.

steps:
- bash: |
    MAJOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f1)
    echo "This is the major run number: $MAJOR_RUN"
    echo "##vso[task.setvariable variable=major]$MAJOR_RUN"

    MINOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f2)
    echo "This is the minor run number: $MINOR_RUN"
    echo "##vso[task.setvariable variable=minor]$MINOR_RUN"

- bash: echo "My pipeline variable for major run is $(major)"
- bash: echo "My pipeline variable for minor run is $(minor)"