jenkins修改pom文件_动手实践:美化 Jenkins 报告插件的用户界面
對于 Jenkins 而言,可使用插件來可視化各種構建步驟的結果。有一些插件可用于呈現測試結果、代碼覆蓋率、靜態分析等。這些插件通常都會獲取給定構建步驟的構建結果,并在用戶界面中顯示它們。為了呈現這些細節,大多數插件使用靜態 HTML 頁面,因為這種類型的用戶界面是 Jenkins 自 2007 年成立以來的標準可視化。
為了改善這些插件的外觀和用戶體驗,有必要向前發展并合并一些現代 Java Script 庫和組件。由于 Blue Ocean 的開發已經停止(請參閱?Jenkins mailing list post),因此插件作者需要自己決定,哪些 UI 技術可幫助完成該任務。但是,現代 UI 組件的種類繁多,以至于只挑選一小部分被證明是有用的并且與 Jenkins 基礎 Web 技術兼容的組件是有意義的。而且,合并這樣一個新組件的初始設置相當大,因此如果該工作僅需要執行一次,將會有很大的幫助。
本指南介紹了一些 UI 組件,以后所有插件作者都可以使用這些 UI 組件,從而為 Jenkins 中的報告提供豐富的用戶界面。為了簡化這些庫在 Jenkins 作為基于 Java 的 Web 應用程序的上下文中的使用,這些 Java Script 庫和組件已打包為普通的 Jenkins 插件。
在以下各小節中,將逐步介紹這些新組件。為了了解如何使用這些組件的插件,我將演示新功能,同時使用新的用戶界面增強現有的?Forensics Plugin。由于 Warnings Next Generation 插件也使用這些新組件,因此您可以在?warnings 插件的文檔中或在我們的公共?ci.jenkins.io 實例中看到其他示例,這些示例已經在 warnings 插件的詳細信息視圖中使用了這些組件。
新的用戶界面插件
新的 Jenkins 插件提供了以下 UI 組件:
jquery3-api-plugin:為 Jenkins 插件提供?jQuery 3。如其首頁所述,jQuery 是一個快速、小型且功能豐富的 JavaScript 庫。借助易于使用的 API(可在多種瀏覽器中使用),使 HTML 文檔的遍歷和操作、事件處理、動畫和 Ajax 等事情變得更加簡單。兼具多功能性和可擴展性,jQuery 改變了數百萬人編寫 JavaScript 的方式。
bootstrap4-api-plugin:為 Jenkins 插件提供?Bootstrap 4。Bootstrap 自稱是世界上最流行的前端組件庫,用于在 Web 上構建響應式,移動優先的項目。它是一個用于使用 HTML、CSS 和 JS 開發的開源工具包。開發人員可以使用他們的 Sass 變量和 mixins、響應式柵格系統、大量的預構建組件以及基于 jQuery 構建的強大插件,快速構建其思想原型或整個應用程序。
data-tables-api-plugin:提供 Jenkins 插件的數據表格。DataTables 是 jQuery Javascript 庫的插件。這是一個高度靈活的工具,建立在逐步增強的基礎上,可將所有這些高級功能添加到任何 HTML 表中:
上一頁,下一頁和頁面導航
通過文本搜索過濾結果
一次按多列對數據排序
DOM、Javascript、Ajax、服務器端處理
簡單主題化
手機端兼容友好
echarts-api-plugin:為 Jenkins 插件提供?ECharts。ECharts 是一種開放源代碼的 JavaScript 可視化工具,用于創建直觀、交互式和高度可定制的圖表。它可以在 PC 和移動設備上流暢運行,并且與大多數現代 Web 瀏覽器兼容。
font-awesome-api-plugin:為 Jenkins 插件提供?Font Awesome。Font Awesome 具有矢量圖標和社交徽標,號稱是網絡上最受歡迎的圖標集和工具包。目前,它包含 1,500 多個免費圖標。
popper-api-plugin:為 Jenkins 插件提供?Popper.js。Popper 只需一行代碼即可輕松定位工具提示,彈出窗口或其他任何內容。
plugin-util-api-plugin:這個小插件提供了一些幫助程序和基類,以簡化 Jenkins 中報告程序的創建。該插件還提供了一組體系結構規則,這些規則可以包含在插件的體系結構測試套件中。
POM 文件必要的改變
為了使用這些插件,您需要將它們作為依賴項添加到插件 pom 中。您可以添加以下代碼段:
pom.xml[...]1.0.25.12.0-74.4.1-104.6.0-81.10.20-13
[...]io.jenkins.pluginsplugin-util-api${plugin-util-api.version}io.jenkins.pluginsfont-awesome-api${font-awesome-api.version}io.jenkins.pluginsbootstrap4-api${bootstrap4-api.version}io.jenkins.pluginsecharts-api${echarts-api.version}io.jenkins.pluginsdata-tables-api${data-tables-api.version}
[...]
[...]
或者,您可以查看?Warnings Next Generation 插件或Forensics API 插件的 POM 文件,它們已經使用了這些插件。
報告的總體結構
在本節中,我將解釋 Jenkins 設計的一些基礎知識,即 Java 模型和相關的用戶界面元素。如果您已經熟悉如何實現報告插件的相應擴展點(請參閱 Jenkins 開發人員指南中的可擴展性部分),則可以跳過本節,直接進入第?3.1?節。
Jenkins 使用?圖 1?所示的靜態對象模型結構來組織項目。
Jenkins 用戶界面中的頂級項目是工作(至少是我們感興趣的頂級項目)。Jenkins 包含多個不同類型的任務(自由式任務、Maven任務、流水線等)。
這些任務中的每一個都包含任意數量的構建(或更確切地說,是運行)。每個版本均有其唯一的版本號標識。Jenkins 插件可以將結果附加到這些版本中,例如生成工件、測試結果、分析報告等。為了附加這樣的結果,插件在技術上需要實現并創建存儲這些結果的操作。
這些 Java 對象在幾種不同的視圖中可視化,以下各節將對其進行詳細描述。顯示所有可用任務的頂級視圖如圖 2?所示。
插件還可以在這些視圖中提供 UI 元素,但這超出了本指南的范圍。
每個任務都有一個詳細視圖,插件可以在其中擴展相應的擴展點并提供摘要框和趨勢圖。通常,在工作級別上不需要報告者摘要框,因此我僅更詳細地描述趨勢圖,請參見第?5.5.2?節。
每個版本也都有一個詳細視圖。在這里,插件可以提供類似于“工作詳細信息”視圖的框的摘要框。通常,插件在這里僅顯示簡短摘要,并提供指向詳細結果的鏈接,有關示例請參見圖 4。
視圖層次結構中的最后一個元素實際上是一個專用視圖,它顯示特定插件的結果。例如,有些視圖可顯示測試結果,分析結果等。完全由給定的插件決定應在此處顯示哪些元素。在接下來的幾節中,我將介紹一些新的 UI 組件,這些組件可用于以愉悅的方式顯示相應的結果。
擴展 Jenkins?對象模型
由于報告程序通常以類似的方式構成,因此我用一些其他元素擴展了 Jenkins 的原始對象模型(參見圖 1),因此創建或實現新的報告程序插件將更加簡單。這個新模型如圖 5?所示。中心元素是構建操作,它將存儲插件報告程序的結果。此操作將附加到每個內部版本,并將為報告者保存(并保留)結果。每個動作的詳細數據將自動存儲在其他文件中,因此,如果用戶從不要求提供詳細信息,則 Jenkins 的內存占用空間可以保持較小。另外,該動作還用于簡化項目動作和趨勢圖的創建,請參見第?5.5.2?節。
Git Forensics 插件
本教程中的元素將全部在新的?Forensics API 插件中使用(實際上,該插件不是新的,它是?Warnings Next Generation?插件的依賴項)。您可以下載插件內容,并詳細了解如何在實踐中使用這些新組件。或者,您可以更改此插件,只是為了了解如何對這些新組件進行參數設置。
如果您將 Git 用作源代碼管理系統,則此插件將以犯罪現場代碼的樣式(Adam Tornhill,2013 年 11 月)挖掘存儲庫,以確定所包含源代碼文件的統計信息:
提交總數
不同作者總數
創建時間
最后一次編輯時間
該插件提供了一個新的步驟(或發布后的發布者)該步驟開始了存儲庫挖掘并將收集的信息存儲在 Jenkins 操作中(請參見圖 5)。然后,您將獲得一個新的構建摘要,該摘要顯示掃描文件的總數(趨勢和構建結果)。從這里,您可以導航到詳細信息視圖,該視圖在可以簡單排序和過濾的表中顯示掃描的文件。您還將獲得一些餅圖,這些餅圖顯示提交歷史記錄的重要方面。
請注意,插件的此功能仍是概念證明:此步驟的性能在很大程度上取決于 Git 存儲庫的大小和提交次數。當前,它會掃描每個版本中的整個存儲庫。在不久的將來,我希望找到一個有志于用增量掃描儀替代這種愚蠢算法的志愿者。
引入新的?UI 組件
如第 3 節所述,詳細信息視圖特定于插件。顯示的內容以及這些元素的顯示方式取決于各個插件作者。因此,在接下來的部分中,我將提供一些示例和新概念,插件可以將這些示例和新概念用作其自身內容的構建塊。
現代化圖表
Jenkins 插件通常不經常使用圖標。大多數插件都提供了操作圖標,僅此而已。如果您打算在其他地方使用圖標,那么插件作者將自己留著:推薦的 Tango 圖標集已有 10 多年的歷史了,如今太有限了。有幾個選項可用,但最受歡迎的是?Font Awesome Icon Set。它提供超過 1500 個遵循相同設計準則的免費圖標:
為了在插件中使用 Font Awesome 圖標,您只需要依賴于相應的?font-awesome-api-plugin?即可。然后,您可以在果凍視圖中使用新標簽?svg-icon?來使用任何實心圖標:
index.jelly1
2
3 [...]
4
5 [...]
6
7
如果要使用 Java 代碼生成視圖,則也可以使用?SvgTag?類為此類圖標生成 HTML 標記。
柵格布局
目前,Jenkins 在所有視圖中都包含 Boostrap 柵格系統的舊版本和補丁版本(24 列)。該版本與 Boostrap4 或任何依賴 Bootstrap4 的 JS 庫不兼容。為了使用 Bootstrap4 功能,我們需要用補丁版本替換 Jenkins 提供的?layout.jelly?文件,該文件不會加載損壞的柵格系統。我打算創建一個PR,以修復 Jenkins 核心中的柵格,但這將需要一些時間。在此之前,您將需要使用 Boostrap4 插件提供的?layout.jelly,請參見下文。
首先要確定的是,哪些元素應顯示在插件頁面上以及每個元素應占用多少空間。通常,所有可見組件都使用簡單的柵格映射到可用空間上。在 Jenkins 視圖中,我們具有固定的頁眉和頁腳以及左側的導航欄(水平空間的20%)。屏幕的其余部分可由詳細信息視圖使用。為了簡化剩余空間中元素的分布,我們使用?Bootstrap 的柵格系統。
這意味著,一個視圖被分為 12 列和任意數量的行。此柵格系統易于使用(但足夠復雜,還可以支持精美的屏幕布局)-我在這里不做詳細介紹,請參考?Bootstrap 文檔。
對于取證詳細視圖,我們使用兩行兩列的簡單柵格。由于列數始終為 12,因此我們需要創建兩個寬列以填充 6 個標準列。為了在我們的插件中創建這樣的視圖,我們需要創建一個以果凍文件和相應的 Java 視圖模型對象形式給出的視圖。以下代碼段顯示了具有這種布局的視圖:
index.jelly1 <?jelly escape-by-default='true'?>
2
3
4
5
6
7
8
9
10
11
12 Content of column 1 in row 1
13
14
15 Content of column 2 in row 1
16
17
18
19
20
21 Content of row 2
22
23
24
25
26
27
28
使用基于 Bootstrap 的自定義布局:由于 Jenkins 核心包含舊版本的 Bootstrap,因此我們需要替換標準的 layout.jelly 文件。
導入 Bootstrap4:使用輔助概念完成 JS 和 CSS 組件的導入,這是在 Jenkins 的 Stapler Web 框架中引用靜態資源的首選方式。
整個視圖將被放入一個充滿整個屏幕(寬度為100%)的流體容器中。
視圖的新行由類?row?指定。附加類?py-3?定義了用于此行的填充,有關更多詳細信息,請參見 Bootstrap Spacing。
由于 Bootstrap 會自動將一行分成 12 個相等大小的列,因此我們在此定義第一列應占據這 12 列中的 6 列。您也可以省略詳細編號,然后 Bootstrap 將自動在可用空間中分發內容。請注意,在大多數情況下這不是您想要的。
第二列使用剩余空間,即 12 列中的 6 列。
第二行使用與第一行相同的布局。
第 1 行只有一列,它將填滿整個可用空間。
您還可以根據屏幕的實際可見大小為一行指定不同的列布局。這有助于改善大屏幕的布局。在警告插件中,您將找到一個示例:在小型設備上,有一張可見的卡片可以在輪播中顯示一張餅圖。如果要在較大的設備上打開同一頁面,則會并排顯示兩個餅圖,并且輪播會被隱藏。
? 卡片
當將插件信息顯示為一個塊時,通常會顯示純文本元素。通常,這將導致某些無關緊要的網頁。為了創建一個更具吸引力的界面,在具有邊框、標題、圖標等的卡片中顯示此類信息是有意義的。為了創建這樣的?Bootstrap 卡片,新的?Bootstrap 插件提供了一個小的果凍標簽,該標簽簡化了插件的此任務。可以通過以下方式在果凍視圖中輕松創建此類卡片:
12 Content of the card
3
在圖 8?中顯示了此類卡的示例。上排的卡片包含餅圖,這些餅圖顯示了整個存儲庫中作者和提交數量的分布。底部的卡在數據表中顯示詳細信息。可視化不僅限于圖表或表格,您可以在其中顯示任何類型的 HTML 內容。您可以在這些卡中顯示插件的任何圖標,但是建議使用現有的?Font Awesome?圖標之一,以在 Jenkins 的插件生態系統中獲得一致的外觀。
注意,卡片的大小由網格配置決定,請參見第 5.2 節。
?? 表格
用于顯示插件詳細信息的常見 UI 元素是表格控件。大多數插件(和 Jenkins 核心)通常使用純 HTML 表格。但是,如果表格應顯示大量行,則使用像?DataTables?這樣的更復雜的控件更有意義。使用此基于 JS 的表控件可免費提供其他功能:
通過文本搜索過濾結果
提供結果集的分頁
一次按多列排序數據
使用 Ajax 調用獲取表行
根據屏幕分辨率顯示和隱藏列
為了在視圖中使用?DataTables,有兩個選項,您可以裝飾現有的靜態 HTML 表(請參見第 5.4.1 節)或使用 Ajax 填充表內容(請參見第 5.4.2 節)。
靜態 HTML 內容的表格使用 DataTables 的最簡單方法是創建一個靜態 HTML 表格,只需調用 datatable 的構造函數即可對其進行修飾。這種方法在 Java 和 Jelly 方面不涉及任何特殊處理,因此我認為只需遵循 DataTables 文檔中的示例即可。只需確保在您的 Jelly 文件中構建了表之后,您需要使用以下代碼裝飾表:
[...]
[...]
[...]
用您的 HTML 表格元素的 ID 替換上面代碼中的 ID
到目前為止,在 Forensics 插件中還沒有使用過此類靜態表格,但是您可以查看警告插件中顯示固定警告的表,以了解如何裝飾此類表。
具有動態模型內容的表盡管靜態 HTML 表格易于實現,但它們有一些限制。因此,遵循更復雜的方法是有意義的。通常,用戶界面中的表是通過使用相應的表(和行)模型定義的。自 Java 成立以來,Java Swing 成功地提供了這樣的表模型概念。我也為 Jenkins 和 DataTables 修改了這些概念。為了在 Jenkins 視圖中創建表,插件需要提供一個表模型類,該類提供以下信息:
表的 ID(因為視圖中可能有多個表)
列的模型(即列的編號,類型和標題標簽)
表格的內容(即各個行對象)
您可以在 Forensics 插件中找到此類表格的示例:此處的表格列出了 Git 存儲庫中的文件以及相應的提交統計信息(作者數量、提交數量、最后修改、首次提交)。該表的屏幕截圖如圖 9?所示。
為了在 Jenkins 中創建這樣的表,您需要創建一個從?TableModel?派生的表模型類。在圖 10?中,顯示了取證插件中相應類的圖。
?表格行
模型
表格模型類定義的第一件事是通過創建相應的?TableColumn?實例來創建可用列的模型。對于每一列,您需要指定標題標簽和應在相應列中顯示的 bean 屬性的名稱(行元素實際上是 Java bean:每一列將顯示此類 bean 的一個獨特屬性,請參閱下一節)。您可以通過簡單地提供基于?String?或?Integer?的列來使用任何受支持的列類型。
?表格行
內容
此外,表模型類提供行的內容。此?getRows()?方法將使用 Ajax 調用異步調用。通常,此方法僅返回 Java Bean 實例的列表,該列表提供每一列的屬性(請參見上一節)。這些對象將自動轉換為 JSON 對象數組,這是 DataTables API 所需的基本數據結構。您可以在?ForensicsTableModel?類的取證插件的 Git 存儲庫中找到一個可以正常工作的示例表模型實現。
為了在插件視圖中使用這樣的表,您需要使用新的?table?標簽在關聯的 Jelly 文件中創建表:
index.jelly[...]
[...]
用自己的 ID 替換上面代碼的 ID
您需要為表提供的唯一參數是 model,它通常是對應的 Jenkins 視圖模型類的一部分(此對象在視圖中用${it}引用)。為了將對應的 Jenkins 視圖模型類與表連接,視圖模型類需要實現?AsyncTableContentProvider?接口。甚至更簡單,讓您的視圖模型類派生自?DefaultAsyncTableContentProvider。此關系是必需的,以便 Jenkins 可以自動創建和綁定 Ajax 調用的代理,該代理將在創建 HTML 頁面后自動填充表內容。
如果將所有這些部分放在一起,則需要定義一個類似于 Forensics 插件的模型的模型,如圖 11?所示。
如在圖 5?中已經描述的,插件需要將?BuildAction?附加到每個構建。Forensics 插件將?ForensicBuildAction?附加到構建。該操作存儲一個?RepositoryStatistics?實例,該實例包含給定構建的存儲庫結果。該操作將所有 Stapler 請求委派給新的?Stapler 代理實例,因此我們可以使該操作清除用戶界面代碼。然后,此?ForensicsViewModel?類充當視圖模型,為文件?index.jelly?給出的相應 Jelly 視圖提供服務器端模型。
雖然這種方法在第一眼看上去很復雜,但是您會看到實際的實現部分很小。基本類已經提供了大多數樣板代碼,您只需要實現一些方法即可。使用此概念還提供了一些其他功能,這些功能是 DataTables 插件的一部分:
列的順序會自動保存在瀏覽器本地存儲中。
分頁大小會自動保存在瀏覽器本地存儲中。
僅當表格可見時才實際調用 Ajax 調用。因此,如果選項卡中隱藏了幾個表,則僅按需加載內容,從而減少了要傳輸的數據量。
有一個選項可用于提供其他詳細信息行,該行可以用 + 符號擴展,有關詳細信息,請參閱?warnings plugin table。
圖表
插件報告程序通常還會報告從構建到構建的某種趨勢。到目前為止,Jenkins 核心僅提供了一個非常有限的概念來呈現諸如趨勢圖之類的趨勢。Jenkins 核心提供的?JFreeChart?框架是服務器端渲染引擎,可將圖表創建為靜態 PNG 圖像,并將其包含在任務和詳細信息頁面中。如今,有幾個功能強大的基于 JS 的圖表庫可供使用,它們在客戶端完成相同的工作(實際上甚至做得更好)。這樣做的好處是可以在每個客戶端上自定義這些圖表,而不會影響服務器性能。此外,您還可以免費獲得許多其他功能(例如縮放,動畫等)。此外,這些圖表庫不僅支持典型的構建趨勢圖,而且還支持許多其他圖表類型,可用于改善插件的用戶體驗。這些圖表庫之一是?ECharts:該庫具有強大的 API,并且實際上支持一個人可以想象的每種圖表類型。您可以在庫的示例頁面上獲得一些功能印象。
為了使用這些圖表,可以通過導入相應的 JS 文件并在相應的 Jelly 文件中定義圖表來嵌入使用該庫的圖表。盡管這已經很好地工作了,但是從詹金斯的構建結果中為這些圖表提供相應的模型仍然有些麻煩。因此,我添加了功能強大的 Java API,可幫助在 Java 端為這些圖表創建模型。該 API 提供以下功能:
根據構建結果的集合創建趨勢圖。
將圖表類型與聚合分開,以簡化圖表模型的單元測試。
在內部版本號或內部版本日期之間切換 X 軸的類型(自動匯總當天記錄的結果)。
將 Java 模型自動轉換為 JS 端所需的 JSON 模型。
支持餅圖和折線圖(更多內容即將推出)。
這些圖表可以在項目頁面中用作趨勢圖(請參見圖 3),也可以在插件的詳細信息視圖中用作信息圖(請參見第 5 節)。
餅狀圖一個簡單但仍然有用的圖表是一個餅圖,它說明了插件數據的數字比例。在 Forensics 插件中,我使用此圖表來顯示 Git 存儲庫中源代碼文件的作者或提交數量的數字比例(請參見圖 8)。在警告插件中,我使用此圖表顯示新警告,突出警告或固定警告的數字比例,請參見圖 12。
為了在您的詳細信息視圖中包括這樣的圖表,您可以使用提供的?pie-chart?標簽。在以下代碼片段中,您可以看到此標簽的使用情況(嵌入在 Bootstrap 卡片中,請參見第 5.3 節):
index.jelly1 <?jelly escape-by-default='true'?>
2
3
4 [...]
5
6
7
8 [...]
9
10
您需要為此圖表提供唯一的 ID 和相應的模型值。該模型必須是對應的?PieChartModel?實例的 JSON 表示形式。可以使用以下幾行來創建這樣的模型:
ViewModel.java1 [...]
2 PieChartModel model = new PieChartModel("Title");
3
4 model.add(new PieData("Segment 1 name", 10), Palette.RED);
5 model.add(new PieData("Segment 2 name", 15), Palette.GREEN);
6 model.add(new PieData("Segment 3 name", 20), Palette.YELLOW);
7
8 String json = new JacksonFacade().toJson(model);
9 [...]
任務級別視圖上的趨勢圖
為了顯示在任務頁面上呈現折線圖的趨勢(請參見圖 3),您需要提供一個所謂的浮動框(存儲在任務操作的?floatBox.jelly?文件中(請參見第 3 節))。該文件的內容非常簡單,僅包含一個?trend-chart?標簽:
floatingBox.jelly1 <?jelly escape-by-default='true'?>
2
3
4
5
6
在 Java 方面,需要在?JobAction?的相應子類(浮動框的所有者)中提供圖表的模型。由于趨勢圖的計算在服務器端也非常昂貴(需要從磁盤讀取多個構建,并且需要計算有趣的數據點),因此該過程已放入單獨的后臺任務中。一旦計算完成,將通過 Ajax 調用顯示結果。為了為插件作者隱藏這些詳細信息,您應該簡單地從相應的?AsyncTrendJobAction?類派生?JobAction?類,該類已經包含樣板代碼。因此,您的靜態插件對象模型實際上會變得有些復雜:
基本上,您需要實現?LinesChartModel 方法 createChartModel()?來創建折線圖。該方法的實現非常簡單,因為大多數艱苦的工作都是由庫提供的:從最新的構建開始,您將使用構建動作的迭代器進行調用。迭代器從一個版本開始構建,直到沒有更多可用結果為止(或已達到要考慮的最大構建數量)。在插件中實現的最重要的事情是如何為給定的?BuildAction?計算數據點。這是取證插件中此類?SeriesBuilder?實現的示例:
FilesCountSeriesBuilder.java1 package io.jenkins.plugins.forensics.miner;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import edu.hm.hafner.echarts.SeriesBuilder;
7
8 /**
9 * Builds one x-axis point for the series of a line chart showing the number of files in the repository.
10 *
11 * @author Ullrich Hafner
12 */
13 public class FilesCountSeriesBuilder extends SeriesBuilder {
14 static final String TOTALS_KEY = "total";
15
16 @Override
17 protected Map computeSeries(final ForensicsBuildAction current) {
18 Map series = new HashMap<>();
19 series.put(TOTALS_KEY, current.getNumberOfFiles());
20 return series;
21 }
22 }
您不僅限于單個折線圖。您可以在一個圖表中顯示多條線,可以顯示堆疊的值,甚至可以顯示某些值之間的差異。您也可以查看?charts of the warnings plugin,了解其中一些功能。
查看文中鏈接,請點擊【閱讀原文】
推薦閱讀
介紹新的 GitLab 分支源插件
第9期 Jenkins 社區在線交流
Jenkins CLI 命令行 v0.0.26
歡迎使用流水線指令-矩陣
原創 Jenkins 創始人 Kohsuke 的新篇章
譯者:wenjunzhangp
總結
以上是生活随笔為你收集整理的jenkins修改pom文件_动手实践:美化 Jenkins 报告插件的用户界面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭州治疗男人精子活力低最好的医院推荐
- 下一篇: mvp的全称_是让人提神醒脑的 MVP、