Azure DevOps Pipeline 中提供了許多預定義變數,
以供在 CI(持續整合)、CD(持續交付)流程中靈活運用。
但總是會碰到變數不夠用的時候,
這時候就只能動手自己做了!
本篇介紹如何使用 PowerShell 於 Build Pipeline 中自訂 GitShortHash 變數。
前言
CI 建置流程中往往會伴隨著 Artifacts 的產出,
而在 Artifacts 命名中夾帶 Metadata 資訊是蠻慣用的手法,
這有助於讓其他人辨別及後續程式介接。
而在設計 Metadata 時 BuildId 幾乎是不可或缺的一部份,
它可以協助我們快速辨認這份 Artifacts 是基於哪個 Commit 建置而來的。
當使用 Git 作為版控時,
通常會以 Commit ID 前 7 碼作為該次建置 BuildId。
而在官方所提供的預定義變數(Predefined Variable)中,
僅提供完整長度的變數(Build.SourceVersion),
這時只好透過 PowerShell 動手來做一個啦!
Time to Hands On
在開始動手前我們先來條列一下任務綱要:
- 新增 PowerShell 至 Repository 根目錄
- 使用 PowerShell CLI 方式自訂 Pipeline GitShortHash 變數
- 於 Build Pipeline 呼叫 PowerShell Task
- 加入 Publish Artifacts Task 並修改命名
新增 PowerShell 至 Repository 根目錄
首先我們先將檔案建立至根目錄,
在這裡我們直接於 Azure DevOps Repos 中新增檔案。
請點選 Repos → Files 巡覽至 Repository 檔案總管,
並於根目錄新增 set-git-short-hash.ps1。
使用 PowerShell CLI 方式自訂 Pipeline GitShortHash 變數
接著使用 [ComdletBinding()] 將CLI傳入的參數綁定至 $buildSourceVersion,
並在擷取字串後透過 vso 指令將變數寫入 Pipeline。
set-git-short-hash.ps1
[CmdletBinding()]
param (
$buildSourceVersion
)
# Use Substring to take 7 charactors ahead.
$gitShortHash = $buildSourceVersion.Substring(0, 7)
# Output result for comparing.
Write-Host "Build.SourceVersion: $buildSourceVersion"
Write-Host "Git Short Hash: $gitShortHash"
# Use vso command to set variable of task.
# Write-Host "##vso[task.setvariable variable=variable_name]value"
Write-Host "##vso[task.setvariable variable=GitShortHash]$gitShortHash"
於 Build Pipeline 中呼叫 PowerShell
Azure DevOps 的 Build Pipeline 預設使用YAML格式進行編排,
你可以點選 Pipelines → New Pipelines 新增一個建置流程,
並依專案需求選擇對應的 Template。
新增完成後可以點選右方側欄的 Show Assistant,
並搜尋 PowerShell 開啟輔助工具。
PowerShell Task 本身有提供 File Path 及 Inline 兩種類型,
在本文中我選用 File Path 的方式新增。
當 Build Pipeline 開始執行時,
會自動將整個 Repository 下載(Checkout )至 Build Agent ,
並暫存至特殊路徑以供建置程序取用。
而預定義變數中所提供的 Build.SourcesDirectory(請注意Source後面還有一個s),
可以傳回 Build Agent 建置用特殊路徑。
在 Azure Pipelines Runtime 的遊戲規則中,
無論是預定義或是自定義的變數,
都須以 $(variable_name) 的格式來取得變數值。
所以在 Script Path 及 Arguments 的部分,
分別使用了 $(SourcesDirectory) 及 $(Build.SourceVersion) 來取得建置用特殊路徑及 Git Commit ID。
點選 Add 後就會產生對應的程式碼。
- task: PowerShell@2
inputs:
filePath: '$(Build.SourcesDirectory)/set-git-short-hash.ps1'
arguments: '-buildSourceVersion $(Build.SourceVersion)'
加入 Publish Artifacts Task 並修改命名
最後使用 Publish Artifacts Task 將建置完的 Binaries 打包起來,
並修改 Artifact 名稱為 Build Number 加上自訂的 GitShortHash。
程式碼片段
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: '$(Build.BuildNumber)__$(GitShortHash)'
接著點選 Run 開始進行建置,
觀察 PowerShell Task 是否有輸出變數。
最後驗證一下 Artifacts 打包後的結果,就大功告成囉!
結語
小弟在原先打造 CI/CD 的過程中,
雖然已經自動化建置及部署了,
但總覺得好像還做得不大完善。
後面有幸看到了 Rick大分享的 DevOps 系列文章,
個人認為實在是受益良多所以推薦給大家。
如果您也正處於這條探索的路途中,
不妨花點時間細細品嘗,
打造自己專屬的 DevOps 吧!
參考
Azure-Pipelines-Tasks/Commands