jenkins使用+pipeline
参考:CI/CD:Jenkins Pipeline 实践_遇事不决 可问春风-CSDN博客
1|0一、安装jenkins
1|11.1 下载 rpm 包
清华大学镜像站下载:
1|21.2 安装并启动
1|31.3 下载 war包
1|41.4 扔进 tomcat启动
通过tomcat启动:http://192.168.8.129:8200/jenkins/
启动时需要输入秘钥,在cat /root/.jenkins/secrets/initialAdminPassword
里面
输入秘钥后,需要下载插件。根据需要选择下载(比较慢)
安装失败,两种解决方式,一种是手动安装,另一种是更换源
2|0二、安装 maven
地址
解压
设置环境变量(得先有jdk)
3|0三、配置私钥公钥,拉取代码
3|13.1 服务器端生成公钥私钥
公钥私钥生成 - dongye95 - 博客园 (cnblogs.com)
3|23.2 gitlab端
3|33.3 jenkins端
可以页面拉取
4|0四、Pipeline
教程:https://www.w3cschool.cn/jenkins/jenkins-epas28oi.html
4|14.1 CI/CD
4|24.2 pipeline 简介
4|34.3 Jenkinsfile
那么重点来了,流水线代码写在哪里呢?
答案就是 Jenkinsfile
4|44.4 流水线语法
4.4.1 脚本式流水线
4.4.2 声明式流水线
在本文的实践环节中,会使用声明式语法来演示一个多分支流水线的project。
4|54.5 Blue Ocean
Blue Ocean 是 jenkins2 中全新的可视化界面(需要安装Blue Ocean插件)。它为流水线的每一个阶段都添加了图形化展示,可以查看每一个阶段的状态和进展,对每个阶段、每个任务都有点选式日志查看的功能,十分清晰。
4|6优势
- 灵活性:通过脚本的方式要比只依赖于WEB界面配置的方式要灵活。
- 可追溯性:jenkinsfile管理在源码下,可对配置进行历史追溯和差异比对。
- 清晰性:结构清晰,便于排错。
- 可恢复性:可以基于某一个版本的配置进行重新运行。
5|0五、多分支流水线实践
5|15.1 配置简述
三个分支的配置基本相同,主要步骤如下:
拉取代码—>maven打包—>构建镜像—>测试—>推送harbor仓库—>部署发布
上述基本完成了一个项目的持续集成和持续部署
5|25.2 新建 project
5|35.3 脚本编写
5.3.1 代码拉取
- url: 源代码地址
- branch:git分支
- credentialsId:凭证(username and password)
5.3.2 Maven打包
项目是一个SpringBoot的Java项目,通过maven构建jar包。
sh 就是执行shell 命令
注意:在test分支中做了testNG测试,此时执行 ‘mvn clean install’ 会在打包时进行测试。如果test分支此阶段不想做测试,则打包时忽略测试
可以将打包文件保存为“制品”(即归档文件)
假设我们想保存script分支构建得到的jar包,那么可以通过
但是这样每次打包都有归档文件,不会自动删除,需要谨慎,防止磁盘空间不够
5.3.3 设置环境变量
在进行下一阶段前,先解决一个比较重要的问题,在流水线中如何配置环境变量。
声明式流水线的环境变量配置是声明在environment块中。这里我声明了两个环境变量,一个是镜像名称,一个是容器名称。这两个变量在后面的阶段中会反复使用。
environment 可以声明在pipeline块下作用于整个配置,也可以声明在一个stage下只作用于一个阶段。
环境变量的调用方式与shell一样,如:${CONTAINER_NAME}
5.3.4 构建镜像
pipeline 针对docker做了分装,其自己定义了一套语法规则来进行容器的操作。
例如:
使用当前目录的Dockerfile,运行docker build来创建一个镜像并打上标签。
使用docker run来运行一个镜像,同时返回一个容器。
运行 docker pull
除了以上列出的几个,还有其他的许多方法。但是我并不愿意使用这些方法。原因有两个,一个是docker 命令本身就不复杂,使用起来就比较方便。另一个原因是使用docker命令比二次分装的方法更加灵活。
下面正式开始进行镜像的构建
镜像由镜像名称和镜像TAG构成。
对于镜像名称,由于是多分支流水线,这里采用基础镜像名称+分支名称组合的形式。
tag的作用就是表明版本,此处采用构建时间,精确到秒。将构建时间保存在文件中,之后所有的阶段都读取该文件来获取版本。当然我们还可以选择构建号或自定义等变量作为tag(如下),但是这种方式在唯一性方面不如时间方式。此处可根据实际业务进行选择。
5.3.5 测试
在每次构建后,我们都应该对当前版本的代码做自动化测试,通过冒烟等测试来评估当前版本的质量。保证我们要发布版本的质量是过关的,如果任何一个测试步骤失败则后续阶段不会继续,应用也不会发布。这也是持续集成的重要思想。
5.3.5.1 启动服务以及环境容错处理
严格的说,服务的启动不应该和测试放在一个阶段,应该在一个单独的阶段中执行,此处为了方便进行了简写。
了解docker就会知道,同名的容器没有被删除,那么容器是无法启动的。如果由于上次构建失败或其他原因导致目标容器名称的容器存在,那么在容器启动前进行环境清理就很有必要。
脚本很简单,通过判断docker进程是否存在来停止或删除容器。
重点是通过script块在声明式代码中引用了脚本式的代码。为什么要这样做呢?
前面已经讲过了这是一个容错处理,如果环境不干净就清理,但如果环境中无目标容器名称的容器从在,在‘docker_ps=docker ps | grep {BRANCH_NAME}’执行完后会返回-1,与shell脚本不同,pipeline规定当返回结果不是表示成功时,流水线就会终止,此处为了流水线可以继续走下去,用try catch做异常处理。
如果不借助脚本式语法,声明式流水线可以在sh步骤开始加入 ‘set +e’,则在出现错误后不会停止。此处主要是为了演示如何在声明式代码中引用脚本式的代码。
启动容器
5.3.5.2 测试
流水线不仅可以串行也可以并行。在测试阶段我们就可以进行并行操作。
如图所示,在test分支的Test阶段,ui自动化、接口自动化、性能测试、单元测试等都可以并行执行。
在pipeline脚本中 parallel 块内的 stage 块会并行执行。
5.3.5.3 发布 HTML 报告
将html报告进行发布。
在testNG执行完后会在项目test-output目录下生成report.html,将报告发布。安装 HTML Publisher plugin 插件。
post块的作用是在所有步骤最后执行,可以作用于整个pipeline或一个阶段内。always表示不管是成功还是失败都执行。
同样在制品中查看
点击报告查看(出现样式问题点击这里)
5.3.6 推送镜像到仓库
代码测试完成后就可以将镜像推送到远程仓库了。
仓库是我自己搭建的harbor。
pipeline中的鉴权方式是withCredentials(),这需要事先在jenkins配置中保存凭据。(如果不用鉴权方式,就必须写上用户名和密码的明文,不安全)
5.3.7 pipeline 调用不同凭证的方法
5.3.7.1 使用SSH私钥文件
5.3.7.2 使用以冒号分隔的帐号密码
5.3.7.3 使用字符串类型密钥
5.3.7.4 获取用户名密码
5.3.8 部署到远程机器上
安装 SSH Pipeline Steps 插件。配置username and password 凭据。
ssh pipeline 更多的操作请查阅官方文档
5.3.9 构建后操作
5.3.9.1 环境清理
在作用于pipeline全局的post中进行环境清理
5.3.9.2 发送邮件
安装 Email Extension Plugin 插件并完成邮件配置
在作用于pipeline全局的post中编写邮件配置
5.3.10 配置
webhook触发器
6|0六、完整的Jenkinsfile
__EOF__

本文链接:https://www.cnblogs.com/dongye95/p/14759618.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!