Aracılığıyla paylaş


İfadeler

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

Önemli

Azure DevOps İçerik Sürümü seçicisinden bir sürüm seçin.

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ı belirlemek için koşullarda yer almaları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> }}), hem parameters'e erişiminiz vardır hem de statik olarak tanımlanmış olan variables kullanılabilir. Bir çalışma zamanı ifadesinde $[ <expression> ], daha fazlasına variables erişiminiz var, ancak parametrelere erişim 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, sabit bir değer, bir değişkene başvuru, bir bağımlılığa başvuru, bir fonksiyon 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 sabitlerini 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 boolean değişmez değer ifadeleridir.

Boş

Null, sözlükte bulunamama durumunda döndürülen özel bir sabit değer ifadesidir, örneğin (variables['noSuch']). Null, bir ifadenin çıkışı olabilir ancak doğrudan bir ifade içinde çağrılamıyor.

Sayı

'-', '.' veya '0' ile '9' arasındaki herhangi bir rakamla 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

En fazla dört segmentten oluşan bir sürüm numarası. Bir sayı ile başlamalı ve iki veya üç nokta karakteri (.) 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 dereference sentaksı: variables.MyVar

Özellik çözme söz dizimini kullanmak için, özellik adı aşağıdaki koşulları sağlamalıdır:

  • a-Z veya _ ile başlayın
  • Aşağıdakilerden biri tarafından a-Z0-9 veya _ 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.

Not

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 $[ <expression> ] olarak kullanılan değişken a ve bu değerin bir parçası olduğu değişken b. Değişkenleri işleme sırası garantili olmadığından, değerlendirmeden sonra b değişkeni a değişkeninin yanlış bir değerine sahip olabilir.

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

  • Bütün parametreler True ise, True değerine ulaşır.
  • En düşük parametreler: 2. Maksimum parametre sayısı: N
  • Parametreleri değerlendirilmek üzere Boole olarak dönüştürür
  • İlk devreden sonra kısa devreler False
  • Örnek: and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))

birleşmek

  • 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. Maksimum parametre sayısı: N
  • Örnek: coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')

içerir

  • Sol parametre Dizesinin sağ parametreyi içerip içermediğini değerlendirir True
  • En düşük parametreler: 2. En fazla parametre: 2
  • Parametreleri değerlendirme için Dizeye gönderir
  • Büyük/küçük harf farkı gözetmeksizin sıralı karşılaştırma yapar
  • Örnek: contains('ABCDE', 'BCD') (True döndürür)

değer içerir

  • 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 büyük/küçük harfe duyarlı olmayan sıralı karşılaştırma
  • İlk maçtan sonra kısa devreler

Not

YAML boru hattında dizi belirtmek için tam söz dizimi yoktur. Bu işlev genel işlem hatlarında sınırlı kullanımdadır. İşlem hattı dekoratörü bağlamında, sistem tarafından sağlanan adım listesi gibi dizilerle kullanılması amaçlanmıştır.

bir nesnede eşleşen bir değer bulmak için ifadeyi containsValue kullanabilirsiniz. İşte Build.SourceBranch için kaynak dallar listesinde eşleşme aramayı gösteren bir örnek.

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 nesneyi alır ve onu JSON olarak çıktı verir.
  • 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) }}

Komut dosyası çıktısı:

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

counter

  • Bu işlev yalnızca değişken tanımlayan bir ifadede kullanılabilir. Adım, iş veya aşama koşulunun 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'dür. İkinci çalıştırmada değeri major hala 1 olması koşuluyla 101'dir.

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ırmalarda sayaç 101, 102, 103, ... şeklinde artar.

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, işlem 102'de devam eder.

Aşağıda, 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şti.

Not

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)

İşte PR'ler ve CI çalıştırmaları için ayrı bir değer tutan bir sayaç örneği.

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ırılmasında değeri artırılır. Proje kapsamında sayaç yok.

ile biter

  • 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
  • Büyük/küçük harf fark etmeksizin sıralı karşılaştırma gerçekleştirir.
  • Örnek: endsWith('ABCDE', 'DE') (True değerini döndürür)

eq

  • 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ıraya göre büyük/küçük harf duyarsız karşılaştırma
  • Örnek: eq(variables.letters, 'ABC')

biçim

  • Sondaki parametreleri değerlendirir ve bunları baştaki parametre dizesine ekler
  • En düşük parametreler: 1. Azami parametreler: N
  • Örnek: format('Hello {0} {1}', 'John', 'Doe')
  • .NET özel tarih ve saat biçimi tanımlayıcılarını kullanır (tarih biçimlendirmesi için , yyyy, yy, MM, M, dd, d, HH, H, m, mm, ss, s, f, ff, ffff, K)
  • Ö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çış yapın. Ö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 olduğunda oluşan hatalar.
  • Dizeler için sıraya göre büyük/küçük harf duyarsız karşılaştırma
  • Örnek: ge(5, 5) (Doğru 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 olduğunda oluşacak hatalar.
  • Dizeler için sıralı yoksayma-büyük/küçük harf karşılaştırması
  • Örnek: gt(5, 2) (doğru değeri 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ı, büyük/küçük harf duyarsız karşılaştırma
  • İlk karşılaşmadan sonra kısa devreler
  • Örnek: in('B', 'A', 'B', 'C') (Doğru döndürür)

iif

  • İlk parametre True ile değerlendirilirse ikinci parametreyi, aksi takdirde üçüncü parametreyi döndürür.
  • En düşük parametreler: 1. En fazla parametre: 3
  • İlk parametre bir koşul olmalıdır
  • Örnek: iif(eq(variables['Build.Reason'], 'PullRequest'), 'ManagedDevOpsPool', 'Azure Pipelines'), işlem hattı bir PR'ye yanıt olarak çalıştırıldığında 'ManagedDevOpsPool' döndürür.

katıl

  • 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ç bir 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 bir hata oluşur.
  • Dizeler için büyük/küçük harf duyarsız sıralama karşılaştırması
  • Örnek: le(2, 2) (Doğru döndürür)

uzunluk

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

alçaltmak

  • 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 1 parametre.
  • Dizenin küçük harf eşdeğerini verir
  • Örnek: lower('FOO') döndürür foo

litre

  • 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 oluşan 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) (Doğru döndürür)

değil

  • True parametre False ise değerlendirir.
  • 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)) (Doğru döndürür)

notIn

  • Sol parametre herhangi bir sağ parametreye eşit değilse True değerlendirir
  • En düşük parametreler: 1. Maksimum parametre sayısı: 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') (doğru döndürür)

veya

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

değiştir

  • 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)

böl

  • 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 }}
    

ile başlar

  • 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
  • Büyük/küçük harf dikkate almadan sıralı karşılaştırma yapar
  • Örnek: startsWith('ABCDE', 'AB') ("True" döndürür)

düzeltmek

  • Başta ve sonda boşluklar olmadan parametreyi döndürür.
  • En düşük parametreler: 1. En fazla parametre: 1
  • Örnek: trim(' variable ') 'değişken' 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. Parametre sayısı en fazla 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 dönüştürür.
  • Örnek: xor(True, False) (Doğru 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

  • Sonuç her zaman True olur (iptal edildiğinde bile). Not: Kritik bir hata, bir görevin çalışmasını yine de engelleyebilir. Örneğin, kaynak alınması başarısız olduysa.

iptal edilmiş

  • 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')
  • Önceki bir işin başarılı olup olmadığını değerlendirmek istediğinizde ve işlerle çalışırken dependsOn ile kullanın. İşler paralel çalışacak şekilde tasarlanmıştır ve aşamalar sırayla çalışı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ı ya da kısmen başarılı olursa True olarak değerlendirilir.
    • iş adları bağımsız değişken olarak kullanıldığında, o işlerin tümü başarılı veya kısmen başarılı olduğunda True olarak değerlendirilir.
    • İşlem hattı iptal edilirse False sonucuna ulaşılır.

başarılı veya başarısız

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

  • 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 .
    • İş adı argümanlarıyla True, bu işlerden herhangi birinin başarılı mı yoksa başarısız mı olduğunu değerlendirir.
    • Bunun yerine, bağımlılık grafiğinde daha önce atlanan işler olduğunda not(canceled()) kullanmak isteyebilirsiniz.

    Bu, always() gibi bir işlemdir, ancak işlem hattı iptal edildiğinde False değerlendirilecektir.

Koşullu ekleme

Değişken değerleri koşullu olarak atamak veya görevler için girişler ayarlamak için , ifve elseif yan tümcelerini kullanabilirsinizelse. 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 şekilde de çalıştırabilirsiniz.

elseif ve else yan tümceleri Azure DevOps 2022'den itibaren kullanılabilir ve Azure DevOps Server 2020 ve Önceki Azure DevOps 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 aşamayı 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, foo değeri elseif koşulunda 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 durumunu referans alma
  • Aynı aşamadaki önceki işin çıkış değişkenlerine referans al.
  • Önceki aşamadaki çıkış değişkenlerine bir aşamada referans ver.
  • Bir önceki aşamadaki bir işteki çıkış değişkenlerine sonraki aşamada referans verin.

İşler ve aşamalar için dependencies olarak adlandırılan bağlam, değişkenler gibi çalışır. Başka bir aşamadaki bir işten çıkış değişkenine başvurursanız, bu bağlam stageDependencies olarak adlandırılır.

Çı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 çalıştığı zamanlar olabilir.

Tür

Açıklama

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

stages içindeki bir koşulda, farklı bir aşamadaki bir işte, önceki aşamadan bir çıkış değişkenine başvurun.

  • 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'))

Aynı aşamadaki farklı bir işte, stages içinde bir çıkış değişkenine başvurma.

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

Farklı bir aşamadaki bir çıkış değişkenine job içinde başvurun.

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

Başka bir aşamadaki bir dağıtım işinde bir çıkış değişkenine başvuruda bulunun 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')

Aşamalar arası bağımlılık (kaynaklı dağıtım işi)

Farklı bir aşamadaki kaynağı içeren bir dağıtım işinde bir çıkış değişkenine stages baş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.

Aşamalar arası bağımlılıklar

Yapısal olarak, dependencies nesnesi, iş ve aşama adlarının results ve outputs ile eşlenmesi için bir haritadı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
  }
}

Not

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 Succeeded, SucceededWithIssues veya Skipped ise B aşaması çalışır. Aşama A atlandığı için B aşaması çalışı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, shouldruntrue olduğunda çalışır. Çünkü shouldrun, true olduğu için Aş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

Not

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şler arası bağımlılıklar

Tek bir aşamanın içindeki iş düzeyinde, dependencies veriler aşama 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, condition: false nedeniyle her zaman atlanacaktır. B işi, ilişkili koşul olmadığından çalışır. İş c, tüm bağımlılıkları ya başarılı bir şekilde tamamlandığı için (iş b) ya da atlandığı için (iş a) çalışır.

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 referans yapabilirsiniz. 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 görevi atlanırsa B1 görevi çalışır. B2 görevi, çalıştırılıp çalıştırılmayacağını belirlemek için A1 görevinin çıktı 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, run_tests işini çalıştırır, eğer build_job dağıtım işleri runTeststrue olarak ayarlandıysa. 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 çıktı 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. condition aşamasının test kısmında, build_job iki kez göründüğüne 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, bir ortam kaynağına değil, doğrudan bir ortama atıfta bulunur. 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 işlem yaparken, 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 foo ile filtrelenmiş bir dizi olarak çalışmasını ve ardından id özelliğini seçmesini söyler.

Bu, şu sonucu döndürür:

[ 1, 2, 3 ]

Tür dönüştürme

İ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 True ve False değerleri, ifade değerlendirildiğinde 1 ve 0 olarak dönüştürülür. 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)

Eşdeğerliği değerlendirmek için ifadeyi eq() kullandığınızda, değerler örtük olarak sayılara (false ve 0true1öğesine) dönüştürülür.

variables:
  trueAsNumber: $[eq('true', true)] # 1 vs. 1, True
  falseAsNumber: $[eq('false', true)] # 0 vs. 1, False

steps:
- script: echo $(trueAsNumber)
- script: echo $(falseAsNumber)

Bu sonraki ö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ı Dize Sürüm
Boolean - - Yes Yes -
Sıfır Yes - Yes Yes -
Numara Yes - - Yes Kısmi
Dize Yes Kısmi Kısmi - Kısmi
Sürüm Yes - - Yes -

Boolean

Numaralandır:

  • False0
  • True1

String’e Çevir

  • False'False'
  • True'True'

Boş

  • To Boolean: False
  • Numaralandır: 0
  • Dizeye: '' (boş dizgi)

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 kısmı dahil).
  • 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ülemeyen herhangi bir başka dize
  • Numaralamak için: '' (boş dize) → 0, aksi takdirde, C#'ı InvariantCulture ve aşağıdaki kuralları kullanarak Int32.TryParse çalıştırır: AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. Eğer TryParse başarısız olursa dönüştürülemez.
  • Sürüme: C# öğesini Version.TryParseçalıştırır. En az Ana ve Yan bileşenleri içermelidir. Başarısız TryParse olursa dönüştürülemez.

Sürüm

  • Boolean'a Dönüştür: 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ı bir ifade içeren betikle özelleştirebilirsiniz. Örneğin, bu kod parçacığı değişkeni alır BUILD_BUILDNUMBER ve Bash ile böler. Bu betik, ana ve yardımcı çalıştırma numaraları için $MAJOR_RUN ve $MINOR_RUN olarak iki yeni değişken 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)"