Jenkins 流水线实例(CICD 05)
1、Java项目CI
1.1 Java项目准备
首先在网上下载一个java项目,并上传至代码仓库中,这里我上传至gitee仓库中。
这里简单对Java文件目录介绍一下:https://www.cnblogs.com/siwuxie095/p/7572137.html
1.2 Jenkins pipeline基础编写
新建一个Jenkins项目,随便命名为:java-maven-demo
1.2.1 拉代码(checkout)
添加参数(利用参数,是为了Jenkins pipeline脚本可以复用):
SrcUrl:java项目src文件所在下载地址
BranchName:运行项目的分支
利用流水线脚本自动生成,编写拉代码的流水线脚本:
选择该流水线项目,选择【流水线语法】-【checkout:check out from version control】--填写相关URL与分支信息---点击【生成流水线脚本】,最终生成:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee-yifanfan1', url: 'https://gitee.com/yifanfan1/Jenkins01.git']]])
这里需要将分支名称与url替换成配置的参数:
checkout([$class: 'GitSCM', branches: [[name: "${BranchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'gitee-yifanfan1', url: "SrcUrl"]]])
1.2.2 编译构建(Build)
mvn clean //清除目标目录中的生成结果
mvn package //生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
mvn package -Dmaven.test.skip=true //maven打包跳过测试。应该也可以写成mvn package -DskipTests
可以在Jenkins界面添加两个参数。
buildType:构建类型选择
buildShell:构建命令
至此,Jenkins pipeline脚本如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!groovy @Library("JenkinsLib")_ def build = new org.devops.build() //获取Jenkins页面配置的参数 String SrcUrl = "${env.SrcUrl}" String BranchName = "${env.BranchName}" String buildType = "${env.buildType}" String buildShell = "${env.buildShell}" String workspace = "/opt/jenkins/worksapce" //这里是自己定义的,如果使用默认的,可以通过env.WORKSPACE获取 String Sub_dir = "${env.Sub_dir}" pipeline{ agent{node{ label "master" customWorkspace "${workspace}" //指定运行工作目录(可选) } } stages{ stage("checkout"){ steps{ script{ checkout([$class: 'GitSCM', branches: [[name: "${BranchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '60878c8f-98ec-4c23-b5e8-634ac021206f', url: "${SrcUrl}"]]]) } } } stage("Build"){ steps{ script{ sh """ cd ${workspace}/${Sub_dir}/ ${buildType} ${buildshell} """ } } } } }
mvn编译完后,会在项目文件下,自动生成一个target文件夹,里面会有jar文件
几点调试过程说明:
1)本次调试时,用HTTPS方式拉代码不知道为什么会报以下错误。改为ssh方式,则没问题。ssh只需要在jenkins机器上生成密钥对,将私钥配置在Jenkins页面中,公钥配置在代码仓库平台即可。
2)构建时调用之前写得ShareLibray构建脚本就报错,报错不是说调用有问题,而是显示找不到pom.xml文件,即使在调用进去该文件目录还是报错。但是上面脚本,直接命令就没问题。
3)可以用println或者echo打印输出调试。同时,为了方便查看日志,可以引用前面博客写的ShareLibrary tools函数,将日志标色,方便查看
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!groovy @Library("JenkinsLib")_ def tools = new org.devops.tools() //获取Jenkins页面配置的参数 String SrcUrl = "${env.SrcUrl}" String BranchName = "${env.BranchName}" String buildType = "${env.buildType}" String buildShell = "${env.buildShell}" String workspace = "/opt/jenkins/worksapce" //这里是自己定义的,如果使用默认的,可以通过env.WORKSPACE获取 String Sub_dir = "${env.Sub_dir}" pipeline{ agent{node{ label "master" customWorkspace "${workspace}" //指定运行工作目录(可选) } } stages{ stage("checkout"){ steps{ script{ tools.PrintMes(">>>>>>>>>>拉取代码>>>>>>>>>>>>>>>>","blue") checkout([$class: 'GitSCM', branches: [[name: "${BranchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: '60878c8f-98ec-4c23-b5e8-634ac021206f', url: "${SrcUrl}"]]]) } } } stage("Build"){ steps{ script{ tools.PrintMes(">>>>>>>>>>编译构建>>>>>>>>>>>>>>>>","blue") sh """ cd ${workspace}/${Sub_dir}/ ${buildType} ${buildshell} """ } } } } }
1.2.3 优化拉代码+编译打包
对于以上,可以进行优化,视频中主要优化点在于以下。前提安装gitlab专用的webhook插件,也可以安装Generic Webhook Trigger(视频中用的这个)。
1)代码触发流水线,并实现以下细节:
- 分支自动匹配;任何分支提交代码都可以触发流水线
- 变更commit状态;即通过调用gitlab API改变代码仓库的状态
- 过滤特殊push请求;因为gitlab新建分支这种,其实也是push,也会触发流水线,这种触发其实是对资源的浪费,需要屏蔽
2)构建失败进行邮件通知;需要插件email extension
因为本人学习过程中用的是gitee,故这里根据gitee帮助中心实现Jenkins+gitee的代码自动触发。大致步骤如下(邮件触发略):
Step1:安装插件gitee
Step2:配置插件(以上两步前面都有)
Step3:Jenkins中的流水线项目,勾选gitee webhook。注意这里的URL(后面配置gitee webhook会生成)
Step4:打开要设置的gitee仓库中项目,点击【管理】进行设置。此处URL与密码是上面一步生成。
注意:
1)代码触发,就不可以选参数了, 所以默认参数应该就是对的参数;否则构建会失败。
2)触发的事件可以根据情况选择。