變量概述
在Azure DevOps Server的流水線中,變量是銜接不同任務和不通代理之間的橋梁,它可以使相對松散、各自獨立的任務之間相關影響並共享數據。在流水線中使用變量,可以在各任務之間相互調用關鍵性的數據。顧名思義,變量是一個可以在流水線中變化值。在CI/CD的執行流水線中,我們都需要使用到各種用途的字符、數字,對象這些字符、數據的定義,我們可以采用變量的方式實現,而不需要在代碼中硬編碼。系統在運行流水線的過程中,將這些定義的變量自動替換為我需要的值。例如在線部署過程中,我們將用戶名和密碼等信息存儲在變量中,這樣不僅讓配置過程更加直觀,還提高的流水線的重用性。
在DevOps Server 的變量中,有一部分變量是系統自動設置的,我們不能自由修改,例如生成名稱、生成編號等。這些系統預先定義的變量,一般在命名格式上有固定的前綴, 例如system、build、Agent等。例如Build.DifinitionName,標識生成流水線的名稱。
在這篇文章中,我們主要介紹如何管理和使用用戶自定義的變量,以及在不同的代理、不同的流水線中,我們如何使用這些變量。
新增變量
可以在生成流水線和發布流水線中分別定義變量。如下圖,我們在生產流水線定義變量:
1)在生成流水線清單中選擇需要編輯流水線
2)選擇編輯按鈕
3)選擇變量按鈕
4)點擊添加按鈕,新增變量。
我們一般使用點(.)或者下划線(_)隔開變量中的單詞,以便提高變量的可讀性,例如user.name,login.name。
5)在變量的值中填寫默認值。也可以參考后面的內容,在流水線執行過程中為變量賦值。
在流水線中讀取變量、為變量賦值
我們可以在各種流水線任務中讀取變量值,也可以流水線中為變量賦值。Azure DevOps Server提供了多種機制,可以讓用戶在流水線中讀取變量值:
1)在流水線讀取參數。
可以將變量值作為參數的方式傳輸到任務腳本中,例如在命令行、python、PowerShell等中使用變量
下圖是在Python腳本中讀取自定義的變量
當任務執行的時候,可以在日志中看到輸出的變量值
2)在流水線中設置變量值
如果在流水線中,需要按照需求更改變量值,可以使用Azure DevOps Server 提供的接口來修改變量值。例如PowerShell的腳本如下
Write-Host "##vso[task.setvariable variable=login.name]zhanghongjun" Write-Host "##vso[task.setvariable variable=login.password;issecret=true]mypassword"
使用shell腳本如下:
#!/bin/bash echo "##vso[task.setvariable variable=login.name]zhanghongjun" echo "##vso[task.setvariable variable=login.password;issecret=true]mypassword"
變量組:在流水線之間共享變量值
如果需要在流水線中共享變量,可以使用變量組。使用變量組存儲要在多個管道中控制和可用的值。變量組在Pipelines Hub的“庫”選項卡中定義和管理。創建變量組的操作如下:
在流水線之間傳遞變量值
有不少用戶提出了這個問題,是否可以在不同的流水線之間傳遞變量值,答案是不能,至少目前版本DevOps Server 2019不能。
在下面的這樣一個場景中,有這樣的需求:我們使用Maven編譯和打包項目代碼,在部署過程使用容器Docker作為部署環境;需要創建Docker鏡像時,使用Maven的POM文件中的版本號作為容器的名稱,這樣用戶就非常方便的能夠查詢到鏡像中部署的軟件版本。為了解決這樣的問題,目前我們使用的解決方案是在編譯過程中使用腳本獲取POM文件中的版本號,然后將其用來命名Maven的數據文件名稱,例如company-cms-1.0.1.jar;然后在制作鏡像的過程中,分析這個名稱,使用其中的版本號作為鏡像名稱。
微軟DevOps MVP 張洪君 http://www.cnblogs.com/danzhang
--End--