[Azure DevOps] 使用 PowerShell 於 Build Pipeline 中自訂 GitShortHash 變數

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 

在開始動手前我們先來條列一下任務綱要:

  1. 新增 PowerShell 至 Repository 根目錄
  2. 使用 PowerShell CLI 方式自訂 Pipeline GitShortHash 變數
  3. 於 Build Pipeline 呼叫 PowerShell Task
  4. 加入 Publish Artifacts Task 並修改命名

 

新增 PowerShell 至 Repository 根目錄

首先我們先將檔案建立至根目錄,

在這裡我們直接於 Azure DevOps Repos 中新增檔案。

請點選 ReposFiles 巡覽至 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格式進行編排,

你可以點選 PipelinesNew Pipelines 新增一個建置流程,

並依專案需求選擇對應的 Template。

新增完成後可以點選右方側欄的 Show Assistant

並搜尋 PowerShell 開啟輔助工具。

 

PowerShell Task 本身有提供 File PathInline 兩種類型,

在本文中我選用 File Path 的方式新增。

當 Build Pipeline 開始執行時,

會自動將整個 Repository 下載(Checkout )至 Build Agent ,

並暫存至特殊路徑以供建置程序取用。

而預定義變數中所提供的 Build.SourcesDirectory(請注意Source後面還有一個s),

可以傳回 Build Agent 建置用特殊路徑。

 

在 Azure Pipelines Runtime 的遊戲規則中,

無論是預定義或是自定義的變數,

都須以 $(variable_name) 的格式來取得變數值。

所以在 Script PathArguments 的部分,

分別使用了 $(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 吧!

 

參考

產出物管理(Artifacts Management)

【冷知識】那個長得很像亂碼 SHA-1 是怎麼算出來的?

Azure-Pipelines-Tasks/Commands

Predefined Variable - MSDN 

PowerShell Task - MSDN