jenkins對接、jenkins-rest

https://www.bilibili.com/video/BV1RqNRz5Eo6


Jenkins是一款常見的構建管理工具,配置好后操作也很簡單,只需去控制臺找到對應的項目,再輸入分支名即可

如果每次只發個位數的項目到也還好,一個個進去點嘛。但如果一次要發幾十個項目呢?這就很費時費力了。好在Jenkins提供了rest接口,可以通過接口來進行批量構建


一、功能描述


目的:使用 Jenkins-rest,多線程批量構建項目


構建項目,需要2個參數

  • jobName, 對應jenkins上的名稱
  • 構建參數格式Map<String, List<String>>,主要是分支名,如果還有其它的也可以加進去

在這里插入圖片描述


構建的代碼

IntegerResponse response = jobsApi.buildWithParameters(null, jobName, buildProperties);

構建完之后肯定是要獲取到構建結果的

  1. 構建后返回一個 queueId
  2. 通過 queueId,獲取 buildNumber
  3. 通過 buildNumber 獲取BuildInfo,BuildInfo里有我們想要的結果參數

二、代碼實現


因為涉及到公司的代碼,這里只給出核心的流程,業務參數就不給出了

private void build(JenkinsBuildRequest request) {logger.info("jenkins構建開始:JenkinsBuildRequest:{}", request);JenkinsBuildInfo jenkinsBuildInfo = initJenkinsBuildInfo(request);try (JenkinsClient client = JenkinsClient.builder().endPoint(jenkinsUrl).credentials(jenkinsCredentials).build()) {JobsApi jobsApi = client.api().jobsApi();QueueApi queueApi = client.api().queueApi();Map<String, List<String>> buildProperties = buildProperties(request);String jobName = request.generateJobName();IntegerResponse response = jobsApi.buildWithParameters(null, jobName, buildProperties);if (!response.errors().isEmpty()) {logger.error("jenkins構建失敗: planId:{}, jobName:{}, responseError:{}", request.getPlanId(), jobName, response.errors());jenkinsBuildInfo.setStatus(JenkinsStatusEnum.FAILURE.getValue());updateBuildInfo(request, jenkinsBuildInfo);return;}int queueId = response.value();jenkinsBuildInfo.setQueueId(queueId);// 有queueId 沒有number的時候就是構建中jenkinsBuildInfo.setStatus(JenkinsStatusEnum.BUILDING.getValue());updateBuildInfo(request, jenkinsBuildInfo);JenkinsStatusEnum status = pollBuildStatusAndSetBuildInfo(queueId, jobName, jobsApi, queueApi, jenkinsBuildInfo);jenkinsBuildInfo.setStatus(status.getValue());updateBuildInfo(request, jenkinsBuildInfo);logger.info("jenkins構建成功: planId:{}, jobName:{}", request.getPlanId(), jobName);} catch (Exception e) {logger.error("jenkins構建失敗: JenkinsBuildRequest:{}", request, e);jenkinsBuildInfo.setStatus(JenkinsStatusEnum.FAILURE.getValue());updateBuildInfo(request, jenkinsBuildInfo);}
}/*** 輪詢獲取Jenkins的構建狀態*/
private JenkinsStatusEnum pollBuildStatusAndSetBuildInfo(int queueId, String jobName, JobsApi jobsApi, QueueApi queueApi, JenkinsBuildInfo jenkinsBuildInfo) throws InterruptedException {Integer buildNumber = null;// 每次輪詢間隔3秒,最多輪詢200次,共10分鐘for (int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {// 獲取構建編號:如果已經構建結束了調用 queueId 會報錯找不到資源,所以獲取到buildNumber之后,就不用再去獲取 QueueItemif (buildNumber == null) {QueueItem queueItem = queueApi.queueItem(queueId);if (queueItem.executable() != null) {buildNumber = queueItem.executable().number();}}// 如果構建編號已確定,獲取構建信息并檢查構建狀態if (buildNumber != null) {BuildInfo buildInfo = jobsApi.buildInfo("", jobName, buildNumber);// 如果構建已完成,設置構建信息并返回狀態if (!buildInfo.building()) {jenkinsBuildInfo.setUrl(buildInfo.url());jenkinsBuildInfo.setNumber(buildNumber);return "SUCCESS".equals(buildInfo.result()) ? JenkinsStatusEnum.SUCCESS : JenkinsStatusEnum.FAILURE;}}// 每次輪詢間隔3秒Thread.sleep(POLL_INTERVAL_MS);}logger.error("jenkins構建失敗:輪詢超時: jobName:{}, jenkinsBuildInfo:{}", jobName, jenkinsBuildInfo);return JenkinsStatusEnum.FAILURE;
}

可根據jenkins上打包的節點,多線程去調用 build 方法。 我們是5個節點,最多60個項目,我的線程配置如下

@Bean(name = "jenkinsBuildExecutor")
public ThreadPoolExecutor jenkinsBuildExecutor() {return new ThreadPoolExecutor(4,4,60L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(120));
}

jenkinsUrljenkinsCredentials 就對應訪問前綴和帳號密碼,格式如下

  • https://jenkins.xxxxx.com/
  • admin:123456

buildProperties 構建參數,看實際需要什么參數,我這里有一個必填的branch和一個選填的 version

private Map<String, List<String>> buildProperties(JenkinsBuildRequest request) {Map<String, List<String>> params = Maps.newHashMapWithExpectedSize(4);params.put("branch", Lists.newArrayList(request.getBranch()));if (StringUtils.isNotBlank(request.getVersion())) {params.put("version", Lists.newArrayList(request.getVersion()));}return params;
}

在這里插入圖片描述


JenkinsBuildInfo 是需要存儲這次構建的參數,比如 分支、項目名、操作人、操作時間、構建狀態、結果鏈接什么的


pollBuildStatusAndSetBuildInfo 方法是輪訓獲取結果的,queueApi.queueItem(queueId) 可能會null異常,所以當拿到 buildNumber 之后就不要再去調用它了


updateBuildInfo 方法是去更新本地的數據庫,具體實現看實際業務


三、相關文檔


https://cdancy.github.io/jenkins-rest/docs/javadoc/


核心 API 模塊


API 類別API 名稱主要方法功能描述
JobsApi任務管理 APIbuild()觸發無參數構建任務
buildWithParameters()觸發帶參數的構建任務
buildInfo()獲取構建詳細信息
jobInfo()獲取任務詳細信息
create()創建新的 Jenkins 任務
delete()刪除 Jenkins 任務
config()獲取/設置任務配置
disable()禁用任務
enable()啟用任務
lastBuildNumber()獲取最后構建編號
lastBuildTimestamp()獲取最后構建時間戳
progressiveText()獲取構建進度日志
QueueApi構建隊列 APIqueueItem()獲取隊列項目信息
cancel()取消隊列中的構建
list()列出隊列中的所有項目
SystemApi系統信息 APIsystemInfo()獲取 Jenkins 系統信息
PluginManagerApi插件管理 APIinstallNecessaryPlugins()安裝必要的插件
list()列出當前安裝的插件
StatisticsApi統計信息 APIoverallLoad()獲取整體負載統計

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85891.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85891.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

北斗導航深度接入小程序打車:高精度定位如何解決定位漂移難題?

你有沒有遇到過這樣的尷尬&#xff1a; 在寫字樓、地下車庫或密集樓群中叫車&#xff0c;系統顯示的位置和你實際所在位置差了幾十米甚至上百米&#xff1b;司機因為找不到你而繞圈&#xff0c;耽誤時間還多花平臺費用&#xff1b;有時明明站在A出口&#xff0c;司機卻跑到B口…

MySQL 主要集群解決方案

MySQL 主要有以下幾種集群解決方案&#xff0c;每種方案針對不同的應用場景和需求設計&#xff1a; 1. MySQL Replication&#xff08;主從復制&#xff09; 類型&#xff1a;異步/半同步復制架構&#xff1a;單主多從特點&#xff1a; 讀寫分離&#xff0c;主庫寫&#xff0c…

基于vue3+express的非遺宣傳網站

? 一個課程大作業&#xff0c;需要源碼可聯系&#xff0c;可以在http://8.138.189.55:3001/瀏覽效果 前端技術 Vue.js 3&#xff1a;我選擇了Vue 3作為核心前端框架&#xff0c;并采用了其最新的Composition API開發模式&#xff0c;這使得代碼組織更加靈活&#xff0c;邏輯…

【7】圖像變換(上)

本節偏難,不用過于深究 考綱 文章目錄 可考題【簡答題】補充第三版內容:圖像金字塔2023甄題【壓軸題】習題7.1【第三版】1 基圖像2 與傅里葉相關的變換2.1 離散哈特利變換(DHT)可考題【簡答題】2.2 離散余弦變換(DCT)2021甄題【簡答題】2.3 離散正弦變換(DST)可考題【簡…

WinUI3入門9:自制SplitPanel

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

【面板數據】上市公司投資者保護指數(2010-2023年)

上市公司投資者保護指數是基于上市公司年報中公開披露的多項內容&#xff0c;從信息透明度、公司治理結構、關聯交易披露、控股股東行為規范等多個維度&#xff0c;評估企業是否在制度上和實際操作中有效保障投資者&#xff0c;特別是中小投資者的合法權益。本分享數據基于我國…

如何解決USB遠距離傳輸難題?一文了解POE USB延長器及其行業應用

在日常辦公、教學、醫療和工業系統中&#xff0c;USB接口設備扮演著越來越關鍵的角色。無論是視頻采集設備、鍵盤鼠標&#xff0c;還是打印機、條碼槍&#xff0c;USB早已成為主流連接標準。然而&#xff0c;USB原生傳輸距離的限制&#xff08;通常在5米以內&#xff09;常常成…

PostgreSQL(TODO)

(TODO) 功能MySQLPostgreSQLJSON 支持支持&#xff0c;但功能相對弱非常強大&#xff0c;支持 JSONB、索引、函數等并發控制行級鎖&#xff08;InnoDB&#xff09;&#xff0c;不支持 MVCC多版本并發控制&#xff08;MVCC&#xff09;&#xff0c;性能更好存儲過程/觸發器支持&…

LINUX 623 FTP回顧

FTP 權限 /etc/vsftpd/vsftpd.conf anonymous_enableNO local_enableNO 服務器 .20 [rootweb vsftpd]# grep -v ^# vsftpd.conf anonymous_enableNO local_enableYES local_root/data/kefu2 chroot_local_userYES allow_writeable_chrootYES write_enableYES local_umask02…

leetcode:77. 組合

學習要點 學習回溯思想&#xff0c;學習回溯技巧&#xff1b;大家應當先看一下下面這幾道題 leetcode&#xff1a;46. 全排列-CSDN博客leetcode&#xff1a;78. 子集-CSDN博客leetcode&#xff1a;90. 子集 II-CSDN博客 題目鏈接 77. 組合 - 力扣&#xff08;LeetCode&#x…

自定義主題,echarts系列嵌套

自定義主題&#xff0c;echarts系列嵌套&#xff0c;完善map地圖系列與lines系列拋物線 自定義主題開發設計&#xff08;如傳感器數據可視化&#xff09; 1.使用typetreemap自定義 TreeMap 主題&#xff08;矩形樹圖系列&#xff09; 2.在矩形樹圖中畫typelines動態連線和typee…

速度與精度的結合:Faster R-CNN模型的性能剖析

目標檢測作為計算機視覺領域的核心問題之一&#xff0c;其重要性隨著深度學習技術的發展而日益凸顯。本文深入探討了基于深度學習的Faster R-CNN模型&#xff0c;這是一種革命性的目標檢測框架&#xff0c;它通過引入區域提議網絡&#xff08;Region Proposal Network, RPN&…

計算機網絡--期末速通版

以下總結提綱來自于hcgg&#xff0c;偉大無需多言。socket編程沒有寫進去&#xff0c;Rdt的話我后來感覺可能只考概念&#xff0c;其余我感覺會考的部分都在里面了&#xff0c;如果有錯誤或者解釋不清楚造成的疑問&#xff0c;希望大家及時指正&#xff0c;感謝。 應用層 DNS…

AI浪潮拐點:MCP與A2A協議如何重塑AI智能體協作生態

一、AI技術演進的必然拐點:從單機智能到群體協作 當AI技術從單模型推理邁向復雜系統協作,MCP(模型協作協議)與A2A(智能體間協作協議)的誕生標志著產業變革的關鍵轉折點。這一演進并非偶然,而是技術發展與社會需求雙重驅動的必然結果。 從技術脈絡看,AI正經歷從"…

Python pyecharts基礎(一)

pyecharts 安裝 pip安裝 pip(3) install pyecharts源碼安裝 $ git clone https://github.com/pyecharts/pyecharts.git $ cd pyecharts $ pip install -r requirements.txt $ python setup.py install # 或者執行 python install.py查看版本 import pyecharts print(pyecha…

【論文閱讀】人工智能在直升機航空電子系統中的應用

人工智能在直升機航空電子系統中的應用 論文摘要文章結構參考文獻 論文摘要 論文摘要:在現代戰爭形勢日趨信息化、智能化的背景下&#xff0c;將人工智能應用于武器裝備已經是大勢所趨。針對直升機飛行任務的特征&#xff0c;對其發展狀況進行了描述&#xff0c;并對其作業能力…

矩陣階數(線性代數) vs. 張量維度(深度學習):線性代數與深度學習的基石辨析,再也不會被矩陣階數給混淆了

文章目錄 前言第一部分&#xff1a;重溫矩陣階數 - 方陣的專屬標簽第二部分&#xff1a;深入張量維度 - 深度學習的多維容器第三部分&#xff1a;核心區別總結第四部分&#xff1a;在深度學習中為何混淆&#xff1f;如何區分&#xff1f;結論 前言 在線性代數的殿堂里&#xf…

滲透測試指南(CSMSF):Windows 與 Linux 系統中的日志與文件痕跡清理

目錄 &#x1f575;??♂? 一、清理日志的重要性 核心目標 案例&#xff1a;域控滲透后日志暴露 &#x1f5a5;? 二、Windows系統日志清理 1. 事件日志&#xff08;Event Logs&#xff09; 2. Web日志&#xff08;IIS Logs&#xff09; 3. PowerShell日志 4. 其他日…

MYSQL數據庫和MSSQL數據庫有什么區別?如何進行備份和還原?

MySQL 和 MSSQL 是兩種廣泛使用的關系型數據庫&#xff0c;但它們在架構、功能、性能、平臺支持以及使用場景等方面存在許多差異。以下是詳細的區別&#xff0c;以及兩者的備份和還原方法。 1. MySQL 與 MSSQL 的區別 1.1 基本概念 數據庫MySQLMSSQL開發者Oracle&#xff08;…

vscode搭建spring boot項目

一.創建項目 第一步&#xff1a;打開vscode按下shiftctrlp,選擇下面的 第二步&#xff1a;選擇版本 第三步&#xff1a;選擇語言 第四步&#xff1a;填寫項目的Groupid 第五步&#xff1a;填寫Artifact id 第六步&#xff1a;選擇打包方式 第七步&#xff1a;選擇java版本 第…