昨天的文章提到了運算式與函數,今天我們來看看另一個跟變數(variables)很像的東西:參數(parameters)。
參數可以應用在單一的YAML Pipeline設計,也可以使用在範本template的設計中。
如果是在單一個Pipeline的設計上使用,搭配運算式的使用,它可以讓手動觸發的介面多出幾個可以讓使用者設定的選項,最簡單的範例就是讓使用者選擇要用來執行的agent類型。例如我們設計一個讓使用者可以選擇使用ubuntu的agent或是使用windows的agent:
上面這張圖的左邊就是加上了參數(Parameter)之後在手動執行時呈現的樣貌,而右邊就是一般預設的執行畫面。要達成這樣的設計並不困難,我們只要在YAML內容中加上parameters的關鍵字,再把我們規劃的參數加進去就行。要取得參數值的時候,則是利用 ${{ parameters.參數名稱 }} 這樣的格式來取得設定值。
trigger:
- none
parameters:
- name: vmImageOS
type: string
default: ubuntu-latest
values:
- ubuntu-latest
- windows-latest
pool:
vmImage: ${{ parameters.vmImageOS }}
上面這一段的YAML內容就是對應上圖的設計結果,使用前面第10天文章內的YAML內容來修改,實際上就是加上parameters那一段的宣告,把pool底下的vmImage原本的ubuntu-latest換成${{ parameters.vmImageOS }}。
每一個參數的定義格式除了name跟type之外,其它的定義並不是必須的。type的部份則有下列這些類型:
一般常用的就是string、boolean,其它的大多是在範本設計的時候才會用到。
上面的例子只是讓使用者在執行的時候可以選擇使用哪一種OS的vmImage,但是實際上更常會碰到的是在執行的時候選擇是使用cloud的agent或是我們自己建立的agent,但是cloud agent是透過vmImage這個關鍵字來設定,而自己建立的agent則是利用name來指定使用哪一個agent pool,並且可能搭配demands關鍵字來篩選符合條件的agent。
碰到這樣的需求,我們就必須利用編譯時期的運算式,也就是${{ 內容 }}搭配判斷式與變數來達成需求:
trigger:
- none
parameters:
- name: agentType
type: string
default: self-hosted
values:
- cloud-hosted
- self-hosted
- name: agentPoolName
type: string
default: 'Default'
- name: agentName
type: string
default: ''
variables:
${{ if eq(parameters.agentType, 'cloud-hosted') }}:
agentPoolKey: vmImage
agentPoolValue: ubuntu-latest
${{ else }}:
agentPoolKey: name
agentPoolValue: ${{ parameters.agentPoolName }}
stages:
- stage: Stage1
pool:
${{ variables.agentPoolKey }}: ${{ variables.agentPoolValue }}
${{ if ne(parameters.agentName, '') }}:
demands:
- agent.name -equals ${{ parameters.agentName }}
從上面的YAML內容就可以看得出來,正好將這兩天所提到的運算是、函數、參數、變數與判斷式全都用上了。執行的範例如下圖:
這邊要特別留意的地方就是在使用了${{ 判斷式 }}之後要接續的YAML內容要內排一個層級。
除了上面的範例,更多的例子也可以參考官方文件上的說明與範例。