【2022鐵人賽】認識Pipeline的參數(Parameters)與變數(Variables)

昨天的文章提到了運算式與函數,今天我們來看看另一個跟變數(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
  • number:數字
  • boolean
  • object:任何YAML結構
  • step:單一步驟
  • stepList:多個步驟
  • job:單一作業
  • jobList:多個作業
  • deployment:單一部署作業
  • deploymentList:多個部署作業
  • stage:單一階段
  • stageList:多個階段

一般常用的就是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內容要內排一個層級。

除了上面的範例,更多的例子也可以參考官方文件上的說明與範例

發佈留言

%d 位部落客按了讚: