在 Azure DevOps 上建立自動化測試管道

我最近在 DevOps 領域遇到了一個不太受歡迎的野獸,Azure DevOps 管道。 我立即感到缺乏任何關於該主題的明確說明或文章,我不知道這與什麼有關,但微軟在普及該工具方面顯然有一些工作要做。 今天我們將在 Azure 雲端內部建置一個自動化測試管道。

所以,任務:
有一個軟體也是用同樣的 Azure DevOps 建構的,它是基於 WIX 專案編譯而成。如果大家有興趣,我也會寫一篇關於這個工具的文章。本質上,它是一種更自動化的 Windows 安裝程式建置方式,可以取代標準的 InstallShield。因此,我們的軟體可以成功構建,並產生一個名為 setup.exe 的安裝程序,該程式會將應用程式安裝到系統中。 Windows你需要將此應用程式安裝在類似生產環境的虛擬機器上,將測試團隊準備的自動化測試複製到虛擬機器中運行,收集結果以判斷分支是否正確,然後再合併。這跟 GitLab 差不多,只不過更麻煩。

作為我們將執行測試的虛擬化環境,我們顯然使用Azure 開發測試實驗室,這是Azure 訂閱中的某個實體,它是為此目的而創建的,以便以合理的價格在其中運行各種無用的測試。

1. 雲端集成

首先,我們需要將我們的開發測試實驗室與 Azure DevOps 集成,為此我們需要某個服務主體,本質上是一個服務帳戶,允許管道轉到雲端並為自己建立/刪除那裡的資源。

前往訂閱並找到 Azure Active Directory 服務

在 Azure DevOps 上建立自動化測試管道

找到應用程式註冊並點擊新註冊,這將建立我們的服務主體。 我不會詳細介紹創建時選擇哪些設定;對於不同的訂閱,這可能會有所不同。

在 Azure DevOps 上建立自動化測試管道

現在我們需要向我們的服務總監授予權利。 為此,請轉到訂閱,帶有密鑰的圖示。 選擇我們的訂閱。

在 Azure DevOps 上建立自動化測試管道

接下來,在存取控制中,按一下角色指派並使用您剛剛建立的名稱搜尋該帳戶。 我們賦予貢獻者角色,這就夠了。

在 Azure DevOps 上建立自動化測試管道

接下來,我們回到 Azure AD 中的服務主體並開啟其屬性。 稍後,我們將需要那裡的所有 ID,我們將保存它們。

我們的入口網站設定到此結束,接下來我們將轉向 Azure DevOps。

2. Azure DevOps 端的集成

首先,我們將進入項目設定並選擇服務連線。 建立 Azure 資源管理器類型的新元素。

在 Azure DevOps 上建立自動化測試管道

現在我們需要記下的所有 ID。 按一下使用完整版本的服務連線對話方塊。 我們輸入從服務主體收到的所有資料。 點擊“驗證”,如果一切正常,請儲存連線。 現在我們的管道可以使用它來連接到雲端。

在 Azure DevOps 上建立自動化測試管道

3. 創建管道

現在讓我們進入有趣的部分,建立管道本身。 打開管道-構建菜單

在 Azure DevOps 上建立自動化測試管道

我們看到一個用於建立新建置的選單,預設情況下它將嘗試使用適當的配置為我們建立一個 YAML 檔案。 我們禮貌地拒絕並選擇經典選項。 微軟希望像人們一樣做一切事情,並提供盡可能透過YAML 客製化管道的機會,這是可以理解的,但貧乏的文檔和許多模組的實際不可操作性告訴我們,現在使用此功能還為時過早。

在 Azure DevOps 上建立自動化測試管道

從各種各樣的模板中,我們需要一個簡單的空管道。 創建後,我們會看到一個空的編輯窗口,我們將在其中花費相當多的時間。

在 Azure DevOps 上建立自動化測試管道

因此,點擊 + 並找到自己在某個模組儲存中,我們將需要清單中的以下元件。

在 Azure DevOps 上建立自動化測試管道

在開始配置管道任務之前,我們需要產生幾個檔案並將其放入專案中。 這將是我們的虛擬機器的ARM 模板,我們將在Azure 開發測試實驗室中產生該模板,這是用於在創建計算機後獲取該計算機的IP 的腳本,如果需要,還可以是用於我們的測試或我們想要運行的腳本主人。

4.ARM模板的生成

要建立虛擬機,我們首先需要為其產生一個模板,即一個 json 文件,我們將其放入專案程式碼中,以便管道可以從那裡讀取它。

我們進入實驗室並找到“公式”(可重複使用的鹼基)選單,點擊“建立新公式”。

在 Azure DevOps 上建立自動化測試管道

我們會看到一長串可供選擇的鏡像列表,以及機器大小的選擇,流程與建立虛擬機器時相同。我們不會在此步驟上過多贅述;我們將直接進入機器屬性的最後一項,即工件。您可以根據環境需求使用任何配置。例如,我正在添加一台機器到 我將一個服務帳戶新增為管理員,以便管道可以使用此帳戶登入這台機器。具體情況可能有所不同,但要成功測試程式碼,我們需要一個工件,稍後會詳細討論。為了確保我們測試的軟體最新版本已安裝在我們的機器上,我們將使用「下載 Azure Pipelines 工件並執行腳本」工件。還記得我一開始提到過,包含應用程式安裝程式的建置版本是在某個地方編譯的嗎?現在我們需要告訴虛擬機器(更準確地說,是模板)去取得這個工件。不僅要取得它,還要安裝它,為此我們需要填寫一些特殊字段,指定項目、建置名稱和金鑰。與所有類似系統一樣,金鑰是在帳戶中產生的(在本例中是 Azure DevOps 帳戶),並儲存在實驗室的 Secrets 中。這裡有一個小注意事項:我們會將其保存在 Secrets 中,但模板本身並不會關心這一點。它將由管道中的另一個用戶啟動,因此我們需要再次手動將密鑰輸入到模板中。

另一個必須包含的工件是「配置 WinRM」;我們將需要它來後續存取電腦。 只有一個參數,主機名稱。 由於我們事先不知道,因此我們將使用 %COMPUTERNAME% 變數。

在 Azure DevOps 上建立自動化測試管道

我們已經添加了所有必要的工件,讓我們繼續討論我們最初來到這裡的原因。 我們在同一公式建立視窗的「進階」標籤中取出產生的 ARM 範本。

在 Azure DevOps 上建立自動化測試管道

我們將頁面內容複製到 VMtemplate.json 檔案中,並將其放在專案的根目錄中。 我們不再需要雲,讓我們回到管道。

5. 管道配置

讓我們從最重要和最有趣的事情開始,創建一個虛擬機,為此我們完成了所有這些整合和模板。 在 Azure RM 訂閱項目中,我們選擇我們在步驟 2 中設定的服務連線。接下來,應該會彈出我們可用的實驗室環境。 然後我們選擇生成的 json 並定義一些所需的變數。 機器的登入名稱和密碼可以直接設定或使用變數設置,但我完全不確定它是否有效,無論我在那裡寫什麼,我都無法使用這些憑證登入機器,最主要的是設定機器的名稱,以便它始終存在(如果可能)唯一。 為此,我使用建立環境變數。

在 Azure DevOps 上建立自動化測試管道

接下來我們設定另一個重要點。 汽車起飛後,我們需要以某種方式知道它的參數,或者更好的是,不是為了我們,而是為了管道。 為此,我們建立一個腳本(例如 GetLabVMParams.ps1)並將其放在專案中。 我從微軟網站上獲取了腳本文本,但根據我的環境稍微調整了一下,因為... 他拿走了 PublicIP 和 FQDN 機器。 我一個都沒有,但我有一個PrivateIP,這個IP不太容易得到,所以我加了一塊。

Param( [string] $labVmId)

$labVmComputeId = (Get-AzureRmResource -Id $labVmId).Properties.ComputeId

# Get lab VM resource group name
$labVmRgName = (Get-AzureRmResource -Id $labVmComputeId).ResourceGroupName

# Get the lab VM Name
$labVmName = (Get-AzureRmResource -Id $labVmId).Name

# Get lab VM public IP address
# $labVMIpAddress = (Get-AzureRmPublicIpAddress -ResourceGroupName $labVmRgName -Name $labVmName).IpAddress

# Get lab VM FQDN
# $labVMFqdn = (Get-AzureRmPublicIpAddress -ResourceGroupName $labVmRgName -Name $labVmName).DnsSettings.Fqdn

# Get lab VM private IP address
$VmNetworkdetails= (((Get-AzureRmVM -ResourceGroupName $labVmRgName -Name $labVmName).NetworkProfile).NetworkInterfaces).Id
$nicname = $VmNetworkdetails.substring($VmNetworkdetails.LastIndexOf("/")+1)
$labVMnetwork = (Get-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $labVmRgName)|Select-Object -ExpandProperty IPConfigurations 
$labVMIpAddress = $labVMnetwork.PrivateIpAddress

# Set a variable labVmRgName to store the lab VM resource group name
Write-Host "##vso[task.setvariable variable=labVmRgName;]$labVmRgName"

# Set a variable labVMIpAddress to store the lab VM Ip address
Write-Host "##vso[task.setvariable variable=labVMIpAddress;]$labVMIpAddress"

# Set a variable labVMFqdn to store the lab VM FQDN name
Write-Host "##vso[task.setvariable variable=labVMFqdn;]$labVMFqdn"

Write-Output $labVMIpAddress

Set-Item wsman:localhostclienttrustedhosts * -Force

在腳本讀取的所有內容中,我們只需要 labVMIpAddress 變數。 好吧,這是給我的,也許你還需要別的東西,這就是為什麼我沒有刪除任何東西,只是註解掉了不必要的東西。

我還將解釋腳本的最後一行;它允許我們的建置機器透過 WinRM 存取任何主機。

下一步是啟動我們精彩的腳本。 他將需要與雲端的相同連接,一個帶有機器 ID 的輸入變量,到那時已經從上一步知道了。 如何? 這裡我們需要提到輸出變數這樣一個奇妙的東西。 每個步驟都可以有一個變數列表,這些變數被傳遞到​​管道的後續步驟。 因此,對於我們的超級腳本,該變數將是 labVMIpAddress,不要忘記指出這一點。

在 Azure DevOps 上建立自動化測試管道

接下來,我會做相當簡單的事情,而且,這些事情可能會因情況而異。 我正在執行遠端腳本並創建共享,然後將我的腳本上傳到其中。

New-Item “C:test" –type directory
New-SMBShare –Name “test” –Path “C:test”  –FullAccess everyone

從任務名稱可以清楚地看出,接下來我們將一些範例腳本複製到電腦並在另一個步驟中執行它。 我們的 $(labVMIpAddress) 變數作為遠端電腦的位址對我們很有用。 接下來,我們使用任務「從球中拾取工件」並將腳本執行的結果複製到我們的建置環境中,然後使用相同的標準任務將這些檔案儲存到建置工件中。 當我們不再需要這輛車後,最後一步就是殺死它。 從文章的長度可以看出,主要的困難是與雲端整合並與您創建的虛擬機器建立聯繫,然後您就可以盡情享受。

這是我的第一篇文章,所以不要太嚴厲地評判,歡迎評論。

來源: www.habr.com

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster