Java+Maven+TestNG+GoCD - 部署篇

? ?? ??GoCD 是一個(gè)開源的持續(xù)交付/持續(xù)部署的系統(tǒng),可以構(gòu)建,自動(dòng)化測(cè)試,自動(dòng)部署等等,和Jenkins類似。但是GoCD的設(shè)計(jì)理念是持續(xù)部署,注重 workflows 的組合,流水線化構(gòu)建-測(cè)試-發(fā)布。

? ?? ??在GoCD系統(tǒng)中,主要由兩部分組成,Go-Server和Go-Agent。 服務(wù)器(server)來(lái)控制一切,它給用戶提供系統(tǒng)的界面,為代理提供工作, 它不執(zhí)行任何用戶指定的“工作”。代理(Agent)執(zhí)行系統(tǒng)用戶或管理員配置的所有工作,例如:運(yùn)行命令、執(zhí)行部署等。所以首先需要需要安裝Server和至少安裝一個(gè)Agent。

? ?? ??劃重點(diǎn):本文主要的受眾人群是測(cè)試人員,上邊文章我們講了如何創(chuàng)建一個(gè)Maven+TestNG+Java的測(cè)試項(xiàng)目,本文講解如何將這樣一個(gè)測(cè)試代碼在GoCD上持續(xù)集成,且展示報(bào)告。

安裝服務(wù)器(Server)和代理(Agent)

注意: Java 需要安裝 version11

  1. 選擇你的系統(tǒng) (以 Mac OS X 為例)
  2. 下載最新的穩(wěn)定的服務(wù)(Server)和代理(Agent),放在自定義的一個(gè)路徑下。本文使用的GoCD版本為19.9.0,下載地址: https://www.gocd.org/download/#osx
  3. 解壓服務(wù)(Server)安裝包,打開終端,進(jìn)入go-server-${version}文件夾,執(zhí)行腳本 ./bin/go-server console,將在前臺(tái)啟動(dòng)GoCD的服務(wù)(Server)
    StartServer.png
  4. 解壓代理(Agent)安裝包,打開另一個(gè)終端,進(jìn)入go-agent-${version}文件夾,執(zhí)行腳本 ./bin/go-agent console,將在前臺(tái)啟動(dòng)GoCD的代理(Agent)。我們可以在一個(gè)機(jī)器上啟動(dòng)多個(gè)代理,也可以在不同的系統(tǒng)上啟動(dòng)代理,可以實(shí)現(xiàn)不同的環(huán)境需求。
    StartAgent.png
    ServerAndAgent.png
  5. 服務(wù)器(Server)安裝成功后,默認(rèn)的端口號(hào)是 8153/8154 (HTTPS)。 你就可以訪問 https://localhost:8154, 如下圖所示:
    NewPipeline.png
  6. 代理(Agent)安裝完成后,進(jìn)入導(dǎo)航欄Agents頁(yè)面,將會(huì)有一個(gè)代理顯示在此頁(yè)面,如下圖所示:
    NewAgent.png
  7. 安裝完成后,我們就可以開始創(chuàng)建pipeline了。

此外,除了在前臺(tái)啟動(dòng)服務(wù)和代理的腳本以外,GoCD還有其他的一些腳本,如下:

腳本 描述
./bin/go-server console GoCD 服務(wù)在前臺(tái)啟動(dòng)
./bin/go-server start GoCD服務(wù)在后臺(tái)啟動(dòng)
./bin/go-server stop 停止GoCD服務(wù)器
./bin/go-server restart 重啟GoCD服務(wù)器
./bin/go-agent console GoCD 代理在前臺(tái)啟動(dòng)
./bin/go-agent start GoCD代理在后臺(tái)啟動(dòng)
./bin/go-agent stop 停止GoCD代理
./bin/go-agent restart 重啟GoCD代理

創(chuàng)建Pipeline

GoCD名詞解釋:

??????在開始創(chuàng)建pipeline之前,我們先了解一些GoCD的名詞的概念:

1. Material

??????可以選擇git作為material, 填寫Git倉(cāng)庫(kù)或者GitHub地址, 例如: https://github.com/gocd-contrib/getting-started-repo.git,之后點(diǎn)擊Test Connection按鈕,如果鏈接OK, 說(shuō)明設(shè)置成功,如下圖所示。
?????? Material 是Pipeline開始執(zhí)行的條件,一旦git倉(cāng)庫(kù)有新的代碼提交,服務(wù)會(huì)持續(xù)check,獲取到有更新,就會(huì)觸發(fā)pipline運(yùn)行。而且每一個(gè)pipeline可以有多個(gè)Material去控制。

SettingMaterial.png

2. Pipeline
  • Pipeline : 是stages 的集合,一個(gè)pipeline可以有多個(gè)stage,這些 stage 按照順序運(yùn)行。如果其中一個(gè) stage 失敗了,那這個(gè) pipeline 也隨之失敗,剩下的 stages 也不再執(zhí)行。可以把pipeline理解為管道,他由多個(gè)小管道組合起來(lái),當(dāng)其中一個(gè)管道不同的時(shí)候,那水肯定就不能繼續(xù)流到下一個(gè)管道。

  • Stage :是 job 的集合,一個(gè)stage可以有多個(gè)job,但是這些 job 之間不存在順序依賴,所以一個(gè) stage 內(nèi)的 jobs 可以同時(shí)運(yùn)行。如果其中一個(gè) job 運(yùn)行失敗了,不會(huì)影響其他job的運(yùn)行,但是只要有一個(gè)job失敗,那么這個(gè) stage 也隨之失敗。一般在前后端分離的項(xiàng)目,我們可以配置前端build的job可以后端build的job,在執(zhí)行的時(shí)候互相不依賴,但是只要任何一個(gè)有問題,我們就不能再繼續(xù)執(zhí)行下邊的操作。

  • Job: 是tasks 的集合,一個(gè)job可以有多個(gè)task,task也是按照順序運(yùn)行。如果其中一個(gè) task 運(yùn)行失敗了,那這個(gè) job 也隨之失敗,剩下的 task 也不再執(zhí)行。所以在配置的時(shí)候需要制定好順序。

  • Task :task是Pipeline中的最小單元,用于執(zhí)行命。所以一個(gè)task就是執(zhí)行一條或者多條命令。

??????下圖就是GoCD官網(wǎng)的解釋圖,形象的展現(xiàn)了pipeline,stage,job,task之間的關(guān)系。
pipeline.png
創(chuàng)建pipeline:

??????接下來(lái)我們開始創(chuàng)建一個(gè)pipeline。創(chuàng)建pipeline的名字,一個(gè)pipeline至少要有一個(gè)stage,stage至少需要一個(gè)job,一個(gè)job至少需要一個(gè)task。所以初始化pipeline的時(shí)候我們需要設(shè)置pipeline的觸發(fā)條件,配置項(xiàng)目的的倉(cāng)庫(kù)地址,然后給pipeline,stage,job啟名字,在寫一個(gè)task的命令,保存以后一個(gè)簡(jiǎn)單的pipeline的架子就搭建起來(lái)了,如下圖所示:


1. Pipeline的配置:

??????點(diǎn)擊上圖pipeline的設(shè)置按鈕,就可以進(jìn)入pipeline的配置頁(yè)面,點(diǎn)擊pipeline,這個(gè)頁(yè)面有多個(gè)Tab,都是對(duì)pipeline的配置。在Stages tab頁(yè)面可以添加新的stage。
??????打開material,這里需要配置Destination Directory 為倉(cāng)庫(kù)的名字。之后Agent會(huì)clone對(duì)應(yīng)的代碼在這個(gè)路徑下。這個(gè)路徑是一個(gè)相對(duì)路徑 {存放下載的Agent包的地址}/pipelines/{pipeline名字}/{倉(cāng)庫(kù)的名字}。 當(dāng)一個(gè)pipeline有多個(gè)material時(shí),每個(gè)material都有自己對(duì)應(yīng)的倉(cāng)庫(kù)名字,填寫在Destination Directory。

2. Stage的配置:

??????點(diǎn)擊對(duì)應(yīng)的stage,也有多個(gè)tab對(duì)stage進(jìn)行配置??梢栽贘obs頁(yè)面添加新的Jobs。如果你的這個(gè)Stage需要對(duì)代碼進(jìn)行操作,就需要勾選Fetch Material,這樣就會(huì)在執(zhí)行Stage的時(shí)候先Clone代碼到Agent上。


3. Job的配置:

??????點(diǎn)擊對(duì)應(yīng)的Job,也有很多tab對(duì)job進(jìn)行配置。

  • Job Settings:有一個(gè)Resource的概念,Resource是給Agent做的一個(gè)標(biāo)簽,當(dāng)有多個(gè)Agent時(shí),可能每個(gè)Agent有不同的配置,不同的空間大小,根據(jù)Agent的不同,可以指定Job在某一類的Agent上執(zhí)行。在Agent頁(yè)面可以給不同的Agent添加不同的Source,如:test這個(gè)標(biāo)簽代表可以用來(lái)跑測(cè)試用例,那么在這個(gè)Job的resource處可以選擇test這個(gè)Resource,意味著,這個(gè)Job只能使用有test標(biāo)簽的Agent來(lái)運(yùn)行。在GoCD的官網(wǎng),這個(gè)圖,解釋了Resource的概念,當(dāng)有一個(gè)Job需要在有FireFox的機(jī)器上運(yùn)行,那這個(gè)Job就可以指定有FireFox的Resource。

  • Tasks: 可以添加更多的task;

  • Artifacts:Artifacts指的是這個(gè)Job的產(chǎn)出物,對(duì)于測(cè)試來(lái)說(shuō),產(chǎn)出物就是測(cè)試報(bào)告,所以我們需要把測(cè)試的報(bào)告展示在GoCD上。因?yàn)槲覀兊臏y(cè)試用例是在Agent上運(yùn)行的,所以測(cè)試的結(jié)果也會(huì)在Agent上,在Job運(yùn)行完成后,會(huì)將產(chǎn)出物從Agent上傳給Server端,這樣才能在Server上展示報(bào)告結(jié)果。創(chuàng)建一個(gè)Test artifact:
    ?????? Source ->就Agent上報(bào)告的地址,也是相對(duì)路徑:{倉(cāng)庫(kù)名稱}/{報(bào)告的文件路徑},如果產(chǎn)出物是一個(gè)html,就可以寫到html文件,如果產(chǎn)出物是一個(gè)文件夾,可以填寫到文件夾,后邊用*號(hào),代表文件夾中的所有文件。
    ?????? Destination -> 要將報(bào)告存放在Server的地址,也是一個(gè)相對(duì)路徑: ``{存放下載的server包的地址}/artifacts/pipelines/{pipeline名字}/{第幾次執(zhí)行的stage}/{stage名字}/{第幾次執(zhí)行的job}/{job名字}`,會(huì)在這個(gè)路徑下存放產(chǎn)出物。

  • Custom: 定義一個(gè)新的Tab,來(lái)展示測(cè)試的結(jié)果,這個(gè)Tab會(huì)在job的結(jié)果頁(yè)面顯示。

4. Task的配置:

?????? task就是Command,GoCD支持很多種command,可以先LookUp然后選擇對(duì)應(yīng)的命令,就可以展示在左邊。這里我們是使用maven打包,所以直接可以用 mvn clean test。很多命令都是基于項(xiàng)目的路徑執(zhí)行,所以這里需要配置Working Directory 為倉(cāng)庫(kù)的名稱。


?????? 到這里我們測(cè)試的配置已經(jīng)結(jié)束,可以Trigger pipeline,運(yùn)行結(jié)束后,你就可以在TestResults Tab看到測(cè)試報(bào)告。TestNG的報(bào)告有點(diǎn)丑,接下來(lái)會(huì)使用其他的插件來(lái)美化報(bào)告。

想要學(xué)習(xí)Jenkins的可以看這里:
Java+Maven+TestNG+Jenkins - 部署篇

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容