【2022鐵人賽】認識Pipeline的運算式與函數

前面建立PR Pipeline的文章中在Script的部份有印出不少系統預先定義的變數,或是在建立CI Pipeline的時候我們也在YAML檔案內把一些會重複使用到的設定值提出來在Variables裡面設定,在這些地方使用到變數的時候,使用的格式都是$(variable_name)這樣的格式,不過其實在Pipeline中可以取的變數值的方式並不是只有$()這樣的取得方式,還有不同的運算式(Expressions)表示法。

經常使用的方式稱為巨集(Marco)的運算式,需要輸入的文字符號比較少,另外還有兩種運算式分別是$[variables.variable_name]、${{variables.variable_name}},同樣都是用$符號開頭,但是一個後面接的是中括號[],另外一個是大括號{},這兩種格式分別是在YAML的執行時期(Runtime)與編譯時期(Compile Time)使用。

不同的運算式適用的時機點都不一樣,一般我們在字串中要併入變數的值的情況下,必須使用巨集的運算式,也就是$()的用法。中括號格式的執行時期用法$[]與大括號的編譯時期用法${{}}主要是為了其它的運算式,像是使用函數或判斷式,如果在這兩種格式內要存取變數必須透過variables關鍵字來存取,後面再加上變數的名稱。

基本版-建立CD Release Pipeline這篇文章中設定Variables時,就有一個變數是叫作formatDate,而它的設定值就使用到了執行時期的格式$[],裡面用到了format函數,將pipeline.startTime所帶的值進行格式化,以便在Tag source的時候記錄的是Pipeline被執行的時間,而不是被放到Queue的時間。

而在可用的函數當中,最常使用的可能是eq(相等於)、andnotne(不等於)、or,這幾個可以讓我們在可以設定condition的項目上(例如task)設定它的執行條件,例如下面的例子:

trigger:
- none

pool:
  vmImage: ubuntu-latest

variables:
  MyVar1: hello
  MyVar2: 123

steps:
- script: |
    echo "在Main分支才會被執行"
  displayName: '在Main分支才會被執行'
  condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
- script: |
    echo "MyVar1 = hello 才會被執行"
  displayName: 'MyVar1 = hello 才會被執行'
  condition: eq(variables.MyVar1, 'hello')
- script: |
    echo "MyVar2 = 123 才會被執行"
  displayName: 'MyVar2 = 123 才會被執行'
  condition: eq(variables['MyVar2'], '123')
- script: |
    echo "MyVar2 = hello 不會被執行"
  displayName: 'MyVar2 = hello 不會被執行'
  condition: eq(variables['MyVar2'], 'hello')

上面的YAML內容我把Script文字也設定在displayName上面,方便從左邊的列表查看。而從上圖中可以發現有一個task並沒有綠色勾勾,就是條件判斷並不符合,所以沒有執行。

如果要了解更多關於運算式和可用函數的內容,可以看一下官網的文件

發佈留言

%d 位部落客按了讚: