最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

軟件測試 | 持續(xù)集成的開源方案攻略(二)jenkins pipeline

2023-06-18 15:22 作者:測吧測試開發(fā)  | 我要投稿

從 Demo 中學習

為了方便講述,我臨時糊了個較為簡單的 pipeline,效果如上圖 (需安裝 blue ocean 這個插件)。 準備工作也很簡單,安裝個 jenkins 2.x,在插件管理中下載 pipeline 相關(guān)插件即可。 創(chuàng)建一個 pipeline job 然后貼入如下代碼:

pipeline 語法分別指令式和腳本式。 上面是指令式的 demo, 是入門 jenkins pipeline 的首選。 指令式有點想咱們測試領(lǐng)域的關(guān)鍵字驅(qū)動一樣, 它事先實現(xiàn)了很多有用的指令。所以對新手十分友好,學習成本很低。缺點是跟沒有辦法在腳本中靈活的應(yīng)用 groovy 語言,換言之就是在腳本中使用 groovy 是有限制的。 而腳本式相反, 優(yōu)點是可以在腳本中肆意插入 groovy 代碼,怎么都行。 但畢竟學習 groovy 語言有成本,而且不能只用聲明式的那些好用的指令。 所以聲明式是大部分人的首選。

流程解釋

我沒打算像官方一樣一個指令一個指令的講起,那樣需要太多的篇幅我實在沒精力。 所以我打算用另外一種方式來講解。 指令式 pipeline 很好入門,因為在它的每一個指令幾乎都可以 UI 上找到對應(yīng)的地方,可以說它在流程框架上大致上是保持跟 UI 是一樣的。 比如在上面的 demo 中, 在 pipeline{}的基本估計下。我們來屢一下。

最開始的 agent ‘devops’ 設(shè)置任務(wù)運行在哪個節(jié)點上。對應(yīng)在 UI 上如下:

而最后的 post{} 其實就對應(yīng)著 UI 上的構(gòu)建后操作, 負責在任務(wù)結(jié)束后處理善后工作,比如發(fā)郵件,生成報告等等。 post{}下面 也對應(yīng)著 UI 上的操作有 always, success, failed 等等其他指令, 意思分別是是一直觸發(fā)這些善后工作。還是只有在成功或者失敗的時候觸發(fā)。 中間的 stages 指令負責執(zhí)行真正的任務(wù)。 stages 下面又有很多個小 stage,負責一個一個階段的運行。 所以一個指令式的 pipeline 的簡述流程是:

這樣在 stages 中我們就可以通過一個一個的指令開始執(zhí)行我們的任務(wù), 比如在上面的 demo 中。 通過在 stage 下的 steps 里執(zhí)行 checkout 指令。如下:

這就是在用 checkout 指令來從 gitlab 上拉取代碼。 又比如下面在執(zhí)行的 allure 指令, 是為了生成 allure 的測試報告。如下:

所以這樣一看,我們實現(xiàn)一個 jenkins pipeline 其實就比較簡單了, 在這樣的流程框架下去使用一個又一個指令就可以完成我們的 pipeline 了, 當然這其中還有一些控制流程分歧和其他參數(shù)的指令,他們也很重要, 但我再這里就不在一一描述了。 可以移步官方文檔:jenkins.io/doc/book/pip

當然 jenkins 上有那么多功能,那么多插件, 每一個插件對應(yīng)一個指令,這么多指令學習起來太麻煩了。 所以 jenkins 也給我們開發(fā)了一個自動生成指令的工具。 如下:

如上, jenkins 會幫我們生成對應(yīng)的指令代碼。

shared library

基本部分我就不多講了, 精力實在不夠。 接下來就講如何編寫一個共享庫。隨著 pipeline 流水線技術(shù)的成熟,使用 pipeline 腳本的 job 也迅速增加。雖然我們可以做一個盡可能通用的 pipeline 腳本樣例,讓搭建者只需要修改幾個賦值參數(shù)就可以在自己的項目中應(yīng)用,初衷是希望所有人能理解 pipeline 中的過程,但也發(fā)現(xiàn)一些比較麻煩的問題,比如有些人不熟悉具體的腳本拿來隨意刪改導致各種錯誤,還有就是我們在 pipeline 腳本中增加一些新功能時又需要通知所有的 pipeline 維護人員去修改,過程非常糾結(jié)。這時候就意味著我們需要用到 pipline 的共享庫功能(Shared Libraries)了,在各種項目之間共享 pipeline 核心實現(xiàn),以減少冗余并保證所有 job 在構(gòu)建的時候會調(diào)用最新的共享庫代碼 。

目錄結(jié)構(gòu)

Shared Library 通過庫名稱、代碼檢索方法(如 SCM)、代碼版本三個要素進行定義,庫名稱盡量簡潔,因為它會在腳本中被調(diào)用,在編寫 Shared Library 的時候,我們需要遵循固定的代碼目錄結(jié)構(gòu)。
Shared Library 代碼目錄結(jié)構(gòu)如下:

src 目錄就是標準的 Java 源目錄結(jié)構(gòu)。執(zhí)行 Pipeline 時,該目錄將添加到 classpath 中。
vars 目錄托管定義可從 Pipeline 訪問的全局腳本 (一般我們可以在這里編寫標準化腳本)。 我們在 pipeline 中調(diào)用的指令就是在這里定義的, 這是我們最重要的目錄。
resources 目錄允許 libraryResource 從外部庫中使用步驟來加載相關(guān)聯(lián)的非 Groovy 文件。也就是我們的 pipeline 腳本是可以通過一個代碼來加載 resource 目錄下的文件

定義全局庫

這里只介紹全局 Shared Library 的方式,通過 Manage Jenkins ? Configure System ? Global Pipeline Libraries 的方式可以添加一個或多個共享庫。
這些庫將全局可用,系統(tǒng)中的任何 Pipeline 都可以利用這些庫中實現(xiàn)的功能。并且通過配置 SCM 的方式,可以保證在每次構(gòu)建時獲取到指定 Shared Library 的最新代碼。

動態(tài)加載庫

從 2.7 版本起,Pipeline: Shared Groovy Libraries plugin 插件提供了一個新的參數(shù) “l(fā)ibrary”,用于在腳本中加載(non-implicit)庫
如果只需要加載全局變量/函數(shù)(從 vars/目錄中),語法非常簡單:
此后腳本中可以訪問該庫中的任何全局變量。

library ‘qa-pipeline-library’

Shared Libraries Demo

我們還是通過一個 demo 開始吧。 注意這里方法名字必須是 call。 這里涉及到了 groovy 語言的委托機制, 所以名字必須是 call。

然后在我們的 pipeline 中我們可以向下面這樣調(diào)用。

我們只要在 pipeline 上面使用 library ‘qa-pipeline-library’ 就可以在下面的 steps 里直接調(diào)用 demo 方法了。

如果想要 load 一個文件, 則可以使用

libraryResource ‘k8s/template/java.yaml’

上面的例子是從共享庫中的 resource 目錄下加載一個 k8s 的 yaml 文件然后給下面的 agent 使用,用來動態(tài)創(chuàng)建 slave pod 來執(zhí)行 pipeline 任務(wù)。 具體 jenkins 與 k8s 集成的內(nèi)容我會放到下一篇教程講。這里只是演示一下怎么去加載共享庫中的文件.

Shared Libraries 實戰(zhàn)

下面讓我們看一下我之前開發(fā)的發(fā)送郵件用的共享庫。 它會自己判斷 job 的執(zhí)行狀態(tài)來發(fā)送不同的郵件內(nèi)容。 并且會自動的獲取 allure report 中的測試結(jié)果信息。 如下:

上面是使用 groovy 語言編寫的一個發(fā)送郵件的共享庫。 我簡單測試一下, 效果如下:

使用方式如下:

只需要在 always 里調(diào)用這個 sendmail 就好。這樣就不用根據(jù)不同的狀態(tài)去寫發(fā)送郵件的邏輯了。 因為共享庫里會自己判斷當前的任務(wù)狀態(tài), 我當初傻傻的是直接調(diào)用 jenkins 的接口來獲取當前運行狀態(tài)的。 后來才知道好像有個環(huán)境變量有這個狀態(tài)。。。。。。 然后在邏輯中會獲取 allure 暴露出來的接口, 拿到運行信息,這樣就可以把測試報告中的 summary 寫在郵件中了(這里領(lǐng)導提的需求, 他不想每次都點 jenkins 鏈接看結(jié)果, 有些時候它直接看郵件中的 summary,發(fā)現(xiàn)沒啥異常就不管了。)

只需要在 always 里調(diào)用這個 sendmail 就好。這樣就不用根據(jù)不同的狀態(tài)去寫發(fā)送郵件的邏輯了。 因為共享庫里會自己判斷當前的任務(wù)狀態(tài), 我當初傻傻的是直接調(diào)用 jenkins 的接口來獲取當前運行狀態(tài)的。 后來才知道好像有個環(huán)境變量有這個狀態(tài)。。。。。。 然后在邏輯中會獲取 allure 暴露出來的接口, 拿到運行信息,這樣就可以把測試報告中的 summary 寫在郵件中了(這里領(lǐng)導提的需求, 他不想每次都點 jenkins 鏈接看結(jié)果, 有些時候它直接看郵件中的 summary,發(fā)現(xiàn)沒啥異常就不管了。)

groovy 語言介紹

當然要編寫共享庫就要對 groovy 這門語言有一定了解。 groovy 語言跟 java 非常像,語法什么都差不多。 java 系的同學寫起來會很舒服。 我再這里介紹一些比較重要的東西。

NonCPS

在上面發(fā)郵件的實戰(zhàn)中我使用了*@*NonCPS?這個注解, 注意開發(fā) jenkins 相關(guān)功能的時候很多時候會遇到序列化問題, 這是 jenkins 內(nèi)部的機制, 所以有些時候如果你碰到了序列化的異常,那你需要在方法上加入這個注解。

全局變量

在 java 中沒有全局變量一說, 要說有的話,static 關(guān)鍵字算不算? 在 python 中我們都知道要在函數(shù)中使用函數(shù)外面的變量需要在函數(shù)中使用 global 關(guān)鍵字。 而 groovy 不同, 在需要在聲明變量時使用*@*Field?注解聲明

加載第三方依賴

在 java 中我們使用 maven 來安裝依賴包, python 中我們用 pip。 而在 jenkins 的共享庫開發(fā)中, 你要引入第三方依賴需要用*@*Grab注解。 我再 sendmail 里需要使用 http request 來像 jenkins 和 allure 發(fā)送 http 請求。 這需要 httpbuilder 這個包。 所以在上面使用*@*Grab來引入, 這樣 groovy 語言就可以下載依賴了。 這是 groovy 語言提供的默認的加載第三方包的方式。

函數(shù)和變量的聲明方式

groovy 的語法大多數(shù)源自 java ,但是做了相應(yīng)的改變。 所以在 groovy 語言中你可以像在 java 中一樣用 String a = “dfs” 這樣的方式聲明變量。 但是也可以使用 def a 這種方式在聲明變量, 讓 groovy 語言自己來推斷類型, 這個跟 python 有點像。

閉包

在 groovy 語言中的閉包你可以理解為 java8 的 lamda 表達式,都是匿名函數(shù)的實現(xiàn)的一種 (當然實際上不是一樣的,概念也不太一樣,但是你可以先這么理解,方便入門)。比如在 sendmail 中:


軟件測試 | 持續(xù)集成的開源方案攻略(二)jenkins pipeline的評論 (共 條)

分享到微博請遵守國家法律
江永县| 丰镇市| 南宫市| 左云县| 沛县| 乾安县| 长阳| 承德市| 乳山市| 晋江市| 泗水县| 鹤岗市| 邯郸市| 杨浦区| 城市| 大宁县| 龙海市| 临潭县| 新龙县| 镇原县| 潮安县| 逊克县| 元朗区| 黔江区| 永修县| 唐海县| 巴彦县| 华亭县| 乐陵市| 五家渠市| 双流县| 海门市| 通海县| 白山市| 和平区| 庄浪县| 岐山县| 芮城县| 泽库县| 札达县| 库伦旗|