持续集成交付CICD:Jira 发布流水线
目录
一、实验
1.环境
2.GitLab 查看项目
3.Jira 远程触发 Jenkins 实现合并 GitLab 分支
4.K8S master节点操作
5.Jira 发布流水线
一、实验
1.环境
(1)主机
表1 主机
| 主机 | 架构 | 版本 | IP | 备注 |
| master1 | K8S master节点 | 1.20.6 | 192.168.204.180 | jenkins slave (从节点) |
| jira | 9.12.1 | 192.168.204.180:8801 | ||
| node1 | K8S node节点 | 1.20.6 | 192.168.204.181 | |
| node2 | K8S node节点 | 1.20.6 | 192.168.204.182 | |
| jenkins | jenkins主节点 | 2.414.2 | 192.168.204.15:8080 | gitlab runner (从节点) |
| harbor私有仓库 | 1.2.2 | 192.168.204.15 | ||
| gitlab | gitlab 主节点 | 12.10.14 | 192.168.204.8:82 | jenkins slave (从节点) |
| sonarqube | 9.6 | 192.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分支


相关文章:
持续集成交付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…...
JuiceSSH结合内网穿透实现公网远程访问本地Linux虚拟机
文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …...
使用 pytest.ini 文件控制输出 log 日志
一、前置说明 pytest.ini 文件中可以配置参数来控制 pytest 的运行行为,其存放路径要求与 conftest.py 一样。 项目根目录project_root/ ├── pytest.ini ├── tests/ │ └── test_demo.py以test开头的测试子目录project_root/ ├── tests/ │ ├── pytest.in…...
【Spring】SpringBoot 配置文件
文章目录 什么是配置文件SpringBoot配置文件配置文件快速入手配置文件的格式properties 配置文件说明properties 基本语法读取配置文件信息properties 配置格式缺点 yml 配置文件说明yml 基本语法使用 yml 连接数据库 yml 使用进阶yml 配置不同数据类型配置对象配置集合配置Map…...
Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享
作者:索增增(小红书)、宋泽辉(小红书)、张佐玮(阿里云) 背景介绍 Koordinator 是一个开源项目,基于阿里巴巴在容器调度领域多年累积的经验孵化诞生,目前已经支持了 K8s…...
网游逆向分析与插件开发-游戏反调试功能的实现-项目需求与需求拆解
上一个专栏结束位置:网游逆向分析与插件开发-代码保护壳的优化-修改随机基址为固定基址-CSDN博客 上一个专栏是做了一个壳有了一定的保护,但是保护还是不够,最大的保护是根上把问题解决了,就是我不允许你对我进行调试,…...
阶段七-GitEE
Git:版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…...
Redis小记(1)
目录 1.Redis和Mysql的区别 2.Redis常用命令 1.Redis和Mysql的区别 a:mysql和redis的存储方式不同 mysql是关系型数据库,用表来进行存储数据。 redis是通过键值对来存储数据,key使用string来标识,value可以是各种不同的数据结构。 b:mys…...
Flutter windows 环境配置
Flutter windows 环境配置 从零开始,演示flutter环境配置到启动项目,同时支持 vscode 和 android studio 目录 Flutter windows 环境配置一、环境配置1. Flutter SDK2. Android Studio3. JDK4. 拓展安装5. Visual Studio 2022二、项目创建和启动1. vsco…...
odoo17核心概念view5——ir_ui_view.py
这是view系列的第5篇文章,介绍一下view对应的后端文件ir_ui_view.py,它是base模块下的一个文件 位置:odoo\addons\base\models\ir_ui_view.py 该文件一共定义了三个模型 1.1 ir.ui.view.custom 查询数据库这个表是空的,从名字看…...
截断整型提升算数转换
文章目录 🚀前言🚀截断🚀整型提升✈️整型提升是怎样的 🚀算术转换 🚀前言 大家好啊!这里阿辉补一下前面操作符遗漏的地方——截断、整型提升和算数转换 看这一篇要先会前面阿辉讲的数据的存储否则可能看不…...
阿里云 ECS Docker、Docker Compose安装
https://help.aliyun.com/document_detail/51853.html https://docs.docker.com/compose/install/ Centos https://blog.csdn.net/Alen_xiaoxin/article/details/104850553 systemctl enable dockerdocker-compose安装 https://blog.csdn.net/qq465084127/article/details/…...
LeetCode——1276. 不浪费原料的汉堡制作方案
通过万岁!!! 题目,给你两个数tomatoSlices和cheeseSlices,然后每制作一个巨无霸汉堡则消耗4个tomatoSlices和1和cheeseSlices,每制作一个小皇堡则需要消耗2个tomatoSlices和1和cheeseSlices。问给你这两个…...
隆道吴树贵:生成式人工智能在招标采购中的应用
12月22日,由中国招标投标协会主办的招标采购数字发展大会在北京召开,北京隆道网络科技有限公司总裁吴树贵受邀出席大会,并在“招标采购数字化交易创新成果”专题会议上发言,探讨生成式人工智能如何在招标采购业务中落地应用。 本次…...
docker搭建kali及安装oneforall
前期docker的安装这里就不用多说了,直接看后面的代码 安装oneforall 1.安装git和pip3 sudo apt update sudo apt install git python3-pip -y2.克隆项目 git clone https://gitee.com/shmilylty/OneForAll.git3.安装相关依赖 cd OneForAll/ sudo apt install pyt…...
【MySQL】数据库之事务
目录 一、什么是事务 二、事务的ACID是什么? 三、有哪些典型的不一致性问题? 第一种:脏读 第二种:不可重复读 第三种:幻读 第四种:丢失更新 四、隔离级别有哪些? (1…...
AGV|RGV小车RFID传感器CNS-RFID-01/1S的RS232通讯联机方法
CNS-RFID-01/1S广泛应用于AGV小车,搬运机器人,无人叉车等领域,用于定位,驻车等应用,可通过多种通讯方式进行读写操作,支持上位机控制,支持伺服电机,PLC等控制设备联机,本…...
【Python可视化系列】一文教会你绘制美观的热力图(理论+源码)
一、问题 前文相关回顾: 【Python可视化系列】一文彻底教会你绘制美观的折线图(理论源码) 【Python可视化系列】一文教会你绘制美观的柱状图(理论源码) 【Python可视化系列】一文教会你绘制美观的直方图(理…...
百度Apollo五步入门自动驾驶:Dreamview与离线数据包分析(文末赠送apollo周边)
🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式:通过连接报名观看课程,即可免费获取精美周边 ⛳️活动链接…...
为什么IPv6 可以作为低功耗蓝牙的物联网体系结构?
蓝牙40规范引人了低功耗蓝牙(Bluetooth Low Energy,BLE)技术。低牙是一种低能低延成本的无线通信技术。 与传统蓝牙相比,低功耗蓝牙同样使用24GHz频段,但其将信道重新划分为 40个,包含37 个数据信道和3个广播信道(传统蓝牙共使用 79 个信道)低功蓝牙的协…...
突破性效率工具:3步实现Draw.io Mermaid智能绘图完整方案
突破性效率工具:3步实现Draw.io Mermaid智能绘图完整方案 【免费下载链接】drawio_mermaid_plugin Mermaid plugin for drawio desktop 项目地址: https://gitcode.com/gh_mirrors/dr/drawio_mermaid_plugin 还在为传统拖拽式绘图效率低下而烦恼吗࿱…...
【免费下载】 探索SFP模块的奥秘:SFP-I2C工具推荐
探索SFP模块的奥秘:SFP-I2C工具推荐 项目介绍 在现代网络通信中,SFP(Small Form-factor Pluggable)模块扮演着至关重要的角色。这些模块通过I2C接口提供了丰富的信息,包括制造商、功能支持以及诊断数据等。然而&#x…...
从直流平衡到时钟恢复:深入剖析8B10B编码在高速串行链路中的核心作用
1. 8B10B编码:高速串行通信的"交通警察" 第一次接触PCIe调试时,我拿着示波器看到波形图上那些密集的跳变信号完全摸不着头脑。直到前辈指着屏幕说:"看见这些有规律的0/1跳变了吗?这就是8B10B在指挥交通。"这个…...
Linux环境下KingbaseES(人大金仓)数据库的自动化部署与配置实践
1. 为什么需要自动化部署KingbaseES? 第一次手动部署KingbaseES数据库的经历让我记忆犹新。那天我在机房折腾了整整6个小时,光是反复输入各种命令就让人抓狂,更别提中间因为权限问题重装了三次。相信很多DBA同行都有过类似的痛苦体验——手动…...
Adafruit统一传感器驱动:嵌入式开发中的硬件抽象与数据标准化实践
1. 项目概述:为什么我们需要传感器数据标准化?在嵌入式开发领域,尤其是物联网和智能硬件项目中,传感器是连接物理世界与数字世界的桥梁。然而,但凡有过实际项目经验的开发者,都或多或少经历过这样的困扰&am…...
新手教程使用curl命令一分钟测试Taotoken的OpenAI兼容API
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手教程:使用curl命令一分钟测试Taotoken的OpenAI兼容API 本文面向刚获取Taotoken API Key的开发者,目标是…...
数字IC设计八股:面试题合集
锁存器的结构-DFF的结构-建立保持时间-亚稳态-STA-CDC。 亚稳态的成因,危害,解决方法。 建立保持时间的计算,违例的Fix,流片前和流片后。还有复位的Recovery Removal time。 CDC的解决方法。 低功耗常见设计方法,动态-静态功耗计算和分析。例如两种情况对比功耗大小。…...
5G网络优化关键参数解读:从入门到实战
5G网络优化中,参数调整是最核心的日常操作。本文系统梳理5G NR关键优化参数,帮助初学者快速建立参数优化知识体系。一、5G NR参数分类5G网络优化参数按功能可分为5大类:类别参数数量核心参数优化频率功率控制参数~30个P0、Alpha、MaxPower高切…...
简历投了全石沉大海?实测3个免费AI简历神器,HR秒通过、面试翻3倍!
3个实测免费的AI简历神器,不用花钱、不用登录,直接让简历过ATS、获面试,应届生/职场人闭眼冲!简历优化本身就讲究精准度,尤其是ATS筛选逻辑,很多工具要么收费高,要么改完还是不贴合JD࿰…...
ETAS ISOLAR-A配置AUTOSAR COM模块实战:从DBC导入到信号超时监控的完整避坑指南
ETAS ISOLAR-A配置AUTOSAR COM模块实战:从DBC导入到信号超时监控的完整避坑指南 在汽车电子领域,AUTOSAR COM模块作为通信堆栈的核心组件,承担着信号路由、协议转换和通信控制的关键职能。对于使用ETAS ISOLAR-A工具链的工程师而言࿰…...
