元件化通常是發生在軟體或平台具一定規模時會發生的事情,為了容易維護、多團隊公用與支撐後續軟體發展。理所當然,YAML 範本 (Template) 也是如此,它是 Azure DevOps Pipelines 的任何 DRY(Don’t Repeat Yourself) 實現的最終目標。剛開始進入範本領域的使用者可能會不知所措,但更多的是熟悉後可以自訂或發展更多不同範本符合自身需求,甚至可以貢獻出公版提供多數團隊使用,有效提升生產力。
範本是可重複使用的 YAML 文件,為 Stage、Job、Task 和 Variable 所組成,下面是一個簡單的範例做範本化
以 **.NET Core v2 task 為例,我們要做一個發布專案的工作, 如果沒有範本,我們就必須為程式碼儲存庫中的每個專案內重複編寫此 Task 的程式碼。
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
projects: '**/*.csproj'
publishWebProjects: false
arguments: '--no-build -configuration $(buildConfiguration) --out $(Build.ArtifactStagingDirecrity)/$(buildConfiguration)'
zipAfterPublish: true
這是使用樣本的好機會。我們可以定義此 Task 一次,然後透過為我們想要發布的每個 Project 傳遞各種參數來重新啟動它。我們在新的 Template 儲存庫內加入一個 YAML 範本,並將上列 DotNetCoreCLI@2 範本化:
- template: ../tasks/dotnetcore_cli_publish_task.yml
parameter:
projectPath: ${{ parameter. }}/**/*.csproj
publishWebProjects: ${{ parameters.publishWebProjects }}
arguments: '--no-build -configuration $(buildConfiguration) --out $(Build.ArtifactStagingDirecrity)/$(buildConfiguration)'
zipAfterPublish: ${{ parameters.zipAfterPublish }}
接下來建立引用的 tasks/dotnetcore_cli_publish_task.yml
parameters:
projectPath: ''
arguments: ''
publushWebProject: true
zipAfterPublush: true
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
projects: ${{ parameters.projectPath }}
publishWebProjects: ${{ parameters.publishWebProjects }}
arguments: ${{ parameters.arguments }}
zipAfterPublish: ${{ parameters.zipAfterPublush }}
除了提高管道 YAML 檔案的可讀性之外,範本還有助於提高管道的長期可維護性。 請注意,此特定任務目前為版本 2,這透過任務末尾的 @2 可以明顯看出。 現在,每當發布 @3 時,我們只需要更新範本文件,而不是在使用該任務的每個儲存庫中手動更新該任務的每個實例。
在處理 YAML 範本時,可能會出現一個重要問題:在哪裡儲存它們以及如何維護它們。 如果我們問應該如何儲存多個儲存庫可以使用、具有版本控制且易於維護的內容,那麼這個問題並不難。 微軟建議解決這個問題的方法是使用它自己的 git 儲存庫。