持續集成交付CICD:Jira 發布流水線

目錄

一、實驗

1.環境

2.GitLab 查看項目

3.Jira 遠程觸發 Jenkins 實現合并 GitLab 分支

4.K8S master節點操作

5.Jira 發布流水線


一、實驗

1.環境

(1)主機

表1 主機

主機架構版本IP備注
master1K8S master節點1.20.6192.168.204.180

jenkins slave

(從節點)

jira9.12.1192.168.204.180:8801
node1K8S node節點1.20.6192.168.204.181
node2K8S node節點1.20.6192.168.204.182
jenkins

?jenkins主節點? ? ??

2.414.2192.168.204.15:8080

?gitlab?runner

(從節點)

harbor私有倉庫1.2.2192.168.204.15
gitlabgitlab 主節點?????12.10.14192.168.204.8:82

jenkins slave

(從節點)

sonarqube9.6192.168.204.8:9000

(2)查看K8S集群狀態

# kubectl get node

2.GitLab 查看項目

(1)GitLab查看前端項目(項目編號為20)

3.Jira 遠程觸發 Jenkins 實現合并 GitLab 分支

(1)點擊系統

(2)管理員入口 (需要輸入密碼)

(3)修改網絡鉤子(選擇Issue操作事件、Release操作事件來觸發)

問題里添加“已更新”

(4)完成修改

(5)修復項目版本

指定1.1.6版本

(6)Jenkins觸發流水線,JSON格式轉換

(7)拿到關鍵數據

1)用于創建gitlab 項目名稱   
issue.fields.components 2) 用于gitlab 分支名稱   
issue.key3)用于gitlab 項目組名稱  
issue.fields.project.name4)用于gitlab 特性分支
issue.fields.fixVersions

(8)Jira官網查詢issues API接口? (一個Jira項目中的issues對應一個GitLab的特性分支)

Jira REST API examples (atlassian.com)

curl \-D- \-u charlie:charlie \-X GET \-H "Content-Type: application/json" \http://localhost:8080/rest/api/2/search?jql=assignee=charlie

(9)Postman( GET?方式)測試取到Jira 的修復版本信息(fixVersion)

http://192.168.204.180:8801/rest/api/2/search?jql=project= DEVOPS3 AND fixVersion = 1.1.6

(10)GitLab官網查詢合并請求 API

Merge requests API | GitLab

POST /projects/:id/merge_requests

(11) Postman (POST 方式)測試創建合并請求

http://192.168.204.8:82/api/v4/projects/20/merge_requests

(12)GitLab查看新增的合并請求

(13)合并請求詳細信息

(14)這里先關閉合并請求

(15)Jenkins修改Jira流水線代碼

webhookData = readJSON text:  "${webhookData}"//jira 事件
jiraEvent = webhookData.webhookEvent
jiraProjectName = webhookData.issue.fields.project.name// 獲取gitlab參數
gitlabProjects = []
gitlabBranchName = webhookData.issue.key
gitlabGroupName =  jiraProjectNamefor (i in webhookData.issue.fields.components){gitlabProjects.add(i["name"])
}//描述信息
currentBuild.description = "Trigger by ${jiraEvent} \n project: ${gitlabProjects} \n branch: ${gitlabBranchName}"pipeline {agent { label "build" }stages {stage("Process") {steps {script {println(gitlabProjects)println(gitlabBranchName)projectIds = GetProjectsId(gitlabGroupName,gitlabProjects)switch(jiraEvent) {case "jira:issue_created":println(projectIds)for (id in projectIds){CreateBranch(id,gitlabBranchName,"master")}breakcase "jira:issue_updated":if (webhookData.issue.fields.fixVersions.size() >= 1){jiraFixVersion = webhookData.issue.fields.fixVersions[0]["name"]//獲取fixversion關聯的所有issuesissues = GetIssuesByFixVersion(jiraProjectName, jiraFixVersion)// 在issue關聯的所有項目創建版本分支for (id in projectIds){CreateBranch(id, "RELEASE-${jiraFixVersion}", "master")    //RELEASE-1.1.6// 創建合并請求  特性分支 > 版本分支for(issue in issues) {CreateMergeRequest(id, issue, "RELEASE-${jiraFixVersion}" )}}break}default:println(error)break}}}}}
}// 創建合并請求def CreateMergeRequest(projectId,sourceBranch,targetBranch) {try {apiUrl = "projects/${projectId}/merge_requests"reqBody = """{"source_branch": "${sourceBranch}","target_branch":"${targetBranch}","title": "${sourceBranch}>>>${targetBranch}byJenkins"}"""response = HttpReq('POST', apiUrl, reqBody)}catch (Exception e) {println(e)}
}// 查詢JiraReleaseissuedef GetIssuesByFixVersion(projectName, fixVersion){jql = "project%20=%20${projectName}%20AND%20fixVersion%20=%20${fixVersion}"response = sh returnStdout: true,script: """curl \-u admin:admin \-H "Content-Type: application/json" \--request GET "http://192.168.204.180:8801/rest/api/2/search?jql=${jql}" -s"""response = readJSON text: """ ${response - "\n"} """issues = []for (i in response["issues"]){issues.add(i["key"])}return issues
}// 創建分支
def CreateBranch(projectId,newBranchName,sourceBranchName){try {apiUrl = "projects/${projectId}/repository/branches?branch=${newBranchName}&ref=${sourceBranchName}"response =  HttpReq('POST', apiUrl, "")}catch(Exception e){println(e)}
}// 獲取所有項目id
def GetProjectsId(gitlabGroupName,gitlabProjects){gitlabProjectIds = []for (project in gitlabProjects){id = GetProjectId(gitlabGroupName,project)if (id != 0){gitlabProjectIds.add(id)}}return gitlabProjectIds
}// 根據項目名稱獲取項目iddef GetProjectId(groupName,projectName){apiUrl = "projects?search=${projectName}"response =  HttpReq('GET', apiUrl, "")response =  readJSON text: response.content - "\n"if (response.size() > 1){for (i in response){if (i["path_with_namespace"] == "${groupName}/${projectName}"){return i["id"]}}}else {return  response[0]["id"]}}// 封裝HTTP
def HttpReq(reqType, reqUrl,reqBody ){def gitServer = "http://192.168.204.8:82/api/v4"withCredentials([string(credentialsId: '02dce3ff-4e46-4de2-b079-5dd6093d4f64', variable: 'GITLABTOKEN')]) {response = httpRequest acceptType: 'APPLICATION_JSON_UTF8',consoleLogResponseBody: true,contentType: 'APPLICATION_JSON_UTF8',customHeaders: [[maskValue: false, name: 'PRIVATE-TOKEN', value: "${GITLABTOKEN}"]],httpMode: "${reqType}",url: "${gitServer}/${reqUrl}",wrapAsMultipart: false,requestBody: "${reqBody}"}return response
}

保存

4.K8S master節點操作

(1)K8S master節點另開一個終端用watch命令觀察pod變化

# watch -n 1 "kubectl get pod -n devops03"

(2)外部測試訪問

# curl http://devops03-devops-ui.devops.com:31291

(3)刪除命名空間devops03

# kubectl delete ns devops03

(4)觀察pod變化

5.Jira 發布流水線

(1)Jira新建問題

(2)Jira創建事件觸發Jenkins流水線

(3) GitLab更新特性分支DEVOPS-11


(4)修改GitLab修改特性分支Dockerfile,并提交特性分支DEVOPS3-11


(5)Jira 新建版本

(6)查看版本

(7)修改版本為1.1.11

(8)Jenkins更新事件觸發Jenkins流水線

(9)GitLab提示特性分支合并到版本分支的請求

(10)合并請求

(11)完成合并

(12)查看合并

(13)Jenkins構建基于HELM的K8S CI流水線

(14)成功

(15)查看Blue Ocean

(16) 查看階段視圖

(17)Harbor查看鏡像

192.168.204.15/devops03/devops03-devops-ui:RELEASE-1.1.11

(18)K8S node節點連接Harbor拉取鏡像

# docker login -u admin -p Harbor12345 192.168.204.15# docker pull 192.168.204.15/devops03/devops03-devops-ui:RELEASE-1.1.11# docker logout 192.168.204.15

node1節點

node2節點

(19)K8S master節點創建命名空間devops03,目前無資源

#  kubectl create ns devops03#  kubectl get all -n devops03

(20)GitLab 查看HELM模板文件values.yaml 已更新鏡像標簽為RELEASE-1.1.11

(21)Jenkins構建基于HELM的K8S CD流水線

(22)觀察pod變化

(23)外部測試訪問(當前版本為1.1.11)

# curl http://devops03-devops-ui.devops.com:31291

(24)最后版本分支 RELEASE-1.1.11 合并到master分支

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

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

相關文章

計算幾何_多邊形

判定凸多邊形:頂點凹凸性法 連續三個頂點p1,p2,p3。計算p1p2,p2p3的叉乘,階乘大于0,則表示p3點在線段p1和p2的左側,然后依次計算下一個前后所組成向量的階乘,如果在計算時,出現負值,則此多邊形是…

wps完成率怎么設置_WPS表格中如何計算完成率?詳細操作方法看這里!

平時我們在使用像WPS這樣的辦公軟件時,我們經常會使用到其中的Excel表格軟件,來完成日常工作當中所需要完成的各種數據的統計以及錄入等工作。而在我們使用WPS表格來錄入、修改或者是統計某一些數據時,我們往往會因為表格內容的設定需求&…

[原創]WebScarab工具介紹

[原創]WebScarab工具介紹 一 WebScarab介紹 WebScarab是一個用來分析使用HTTP和HTTPS協議的應用程序框架。其原理很簡單,WebScarab可以記錄它檢測到的會話內容(請求和應答),并允許使用者可以通過多種形式來查看記錄。WebScarab的設…

段表的作用

表格來自《程序員的自我修養 ——鏈接、裝載與庫》 ELF段名作用.text代碼段,存放執行語句.data數據段,存放初始化的全局變量和局部靜態變量.bss未初始化的全局變量和局部靜態變量.rodata只讀數據段.comment注釋信息段.note.GNU-stack堆棧提示段.debug調…

layoutSubviews總結

ios layout機制相關方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit——————- - (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout——————– - (void)setNeedsDisplay- (void)drawRectlayoutSubviews在下面情況下會被調用: …

三個彩燈循環點亮程序_近百組彩燈點亮江畔,義渡燈會正式亮燈啦

10月23日晚上,大渡口區義渡古鎮華燈初上。夜幕之下,2020第一屆義渡燈會亮燈儀式在此舉行,來自四川的近百組彩燈將在這里點亮夜空,一直陪伴廣大市民游客至明年元宵節后。當晚6點半,義渡燈會亮燈儀式正式開啟。本次燈會以…

repeater序列號,換頁數字不重新排

<td><%# Container.ItemIndex 1(Convert.ToInt32(this.drpCurrentPageIndex.SelectedValue)-1)*Convert.ToInt32(this.drpCount.SelectedValue)%></td>轉載于:https://www.cnblogs.com/liziqiang/p/3457203.html

Altera的幾個常用的Synthesis attributes(轉載)

各廠商綜合工具&#xff0c;對HDL綜合時都定義了一些綜合屬性這些屬性可指定a declaration,a module item,a statement, or a port connection 不同的綜合方式。 語法為&#xff1a; /* synthesis, <any_company_specific_attribute value_or_optional_value */ 下面就是Al…

QPushButton hover配置

鼠標移動到QPushButton上面時顯示下劃線 //下面是當鼠標移動到按鈕上時&#xff0c;按鈕上的文字顯示下劃線 QPushButton#Button_2:hover{ text-decoration:underline; }//下面是普通顯示 QPushButton#Button_2{ color:rgba(52, 144, 255 ,255); border-radius:0px; backgrou…

eclipse沒有日志_強化公共DHT以抵抗eclipse攻擊,ipfs官方還說了什么?

近日&#xff0c;IPFS官方發布博客&#xff0c;就如何強化公共DHT以抵抗eclipse攻擊進行詳細介紹&#xff0c;星球君幫大家翻譯了一下&#xff0c;讓我們來看看官方都說了什么吧&#xff1a;IPFS 2020 年的一個主要焦點是隨著網絡規模的不斷擴大而改進內容路由。雖然我們已經對…

mongoDB簡明教程-python(轉)

MongoDB是一個介于關系數據庫和非關系數據庫之間的產品&#xff0c;是非關系數據庫當中功能最豐富&#xff0c;最像關系數據庫的。他支持的數據結構非常松散&#xff0c;是類似 json的bjson格式&#xff0c;因此可以存儲比較復雜的數據類型。官方網站&#xff1a;http://www.mo…

HTTP基礎10--web(2)

因輸出值轉義不完全引發的安全漏洞 實施 Web 應用的安全對策可大致分為以下兩部分。 客戶端的驗證Web 應用端&#xff08;服務器端&#xff09;的驗證: 輸入值驗證 / 輸出值轉義客戶端允許篡改數據或關閉 JavaScript&#xff0c;不適合將 JavaScript 驗證作為安全的防范對策。保…

單一課和綜合課的劃分依據_武夷巖茶產地如何劃分?

產地是指某種物品的生產、出產或加工制造的地點&#xff0c;日常含義是指某種物品的主要生產地。本文探討的武夷巖茶種植產地&#xff0c;也就是當地茶人俗稱的“山場”。武夷巖茶“山場”的俗稱可能緣起于宋代的茶政。宋代官府設置“榷&#xff08;qu&#xff09;茶場”&#…

windows文件路徑大于MAX_PATH

如果文件路徑大于MAX_PATH&#xff0c;是無法直接用CreatFile、fopen等方法來打開文件 但是可以通過在路徑前面加上“\\?\”來獲取文件 比如想要打開下面的文件123.txt&#xff0c;但是文件路徑是很長的&#xff08;假設…是200個字符&#xff09;&#xff1a; C:\123...\1…

C# 枚舉 字符串 轉換

普通方法 這種方法盡管很SB但確實可以解決問題 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){string SelPath "";switch (comboBox1.SelectedIndex){case 0: SelPath System.Environment.GetFolderPath(System.Environment.SpecialFo…

arduino 機器視覺編程_萬物皆可仿真的MATLAB/Simulink神奇在哪?解析如何將其應用于一整套機器人設計開發流程...

MATLAB/Simulink&#xff1a;萬物皆可仿真 MATLAB是由美國MathWorks公司出品的一款商業數學軟件。它是一個多功能的科學計算平臺&#xff0c;將算法開發、數據分析、矩陣計算等諸多強大功能集成在一個易于操作的視窗環境中。MATLAB下的Simulink更是被認為可以“仿真任何系統”。…

排序算法(1) 快速排序 C++實現

快速排序基本特性 時間復雜度&#xff1a;O&#xff08;n*lgn&#xff09;最壞&#xff1a;O&#xff08;n^2&#xff09;空間復雜度&#xff1a;最好情況下&#xff1a;O&#xff08;lgn&#xff09;&#xff0c;最壞情況&#xff1a;O(n)&#xff0c;平均情況&#xff1a;O(l…

boost 變量類型轉換

如果vs版本比較低&#xff0c;會不支持一些std類型轉換函數&#xff08;vs2008就不支持&#xff09;&#xff0c;比如&#xff1a; std::to_string \\數字轉字符串 std::stoll \\字符串轉數字而且項目碰巧用boost庫&#xff0c;可以考慮用下面的的方法來進行類型轉換…

PB增刪改

新建一個數據窗口----選擇需要更新的表&#xff0c;或者直接寫sql也可以如下圖已經建立好的數據窗口&#xff0c;根據要求將需要更新的列、unigue key 還有需要更新的表設置好&#xff0c;【將需要更新列的taborder設置大于0 這樣維護的時候可以編輯&#xff08;等于0是不能編輯…

(五十六)iOS多線程之NSOperation

NSOpertation是一套OC的API&#xff0c;是對GCD進行的Cocoa抽象。 NSOperation有兩種不同類型的隊列&#xff0c;主隊列和自定義隊列。 主隊列運行于主線程上&#xff0c;自定義隊列在后臺運行。 【NSBlockOperation】 通過Block創建任務&#xff0c;下面比較主隊列和自定義隊列…