Jenkins-提交流水线[手动触发|自动触发|提交优化]
- 下载代码
- 构建
- 单元测试
- 扫描
- 通知
1.配置参数
仓库url地址
分支选择
2.编写流水线
流水线 语法设置添加仓库语法
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-root', url: 'http://192.168.1.110:9080/gitops/gitops-demo-service.git']]])
1.触发器配置
参考文章:Jenkins-[配置作业触发器|解析GET/HEADER/POST请求数据]
目的: 开启trigger后,就可以实现其他系统通过一个指定的URL进行自动触发构建了;
新建一个文件夹存放对应GitLab仓库组中的流水线。这里建议用仓库组的名称作为文件夹的名称devops03
;
用Gitlab项目名称与流水线命名; devops03-demo-service
项目;
(Jenkins流水线截图)
- ✅开启Generic webhook;
- ✅配置触发Token,例如:作业名称
devops03-demo-service
(这个token是流水线触发需要传递的);
- ✅生成的触发URL;
http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops03-demo-service
(此时,已经生成了触发URL,接着可以使用Curl或者Postman进行触发测试了!)
2.配置GitLab WebHook[自动远程 触发流水线]
进入GitLab项目设置, 进入 webhook
配置页面;
- ✅ 配置要触发的URL,即Jenkins触发器接口URL;
- ✅ 选择发生哪种GitLab事件后触发此Webhook;例如:Push提交代码、Tag创建标签等等;
- 项目里找
- 要是报Url is blocked: Requests to the local network are not allowed,解决办法 参考文章https://blog.csdn.net/anqixiang/article/details/104968469
事件:
- Push 提交事件
- Tag Push 创建事件
- MergeRequest 合并事件
- Issue 问题创建更新事件
- ✅测试模拟触发
模拟事件触发,点击test按钮选择push事件,此时去看下Jenkins是否成功被触发。
触发成功则提示:Hook executed successfully: HTTP 200, 此时可以看下Jenkins是否已经触发了一次构建
如果出现此FAQ:Url is blocked: Requests to the local network are not allowed
解决方法:进入admin管理页面设置 > network
找到"Outbound requests"勾选允许请求webhooks和服务。(更改后,重启触发即可)
3.Webhook问题排查调试
进入webhook添加页面的最下方,点击你所创建的webhook的 Edit
按钮 ;
webhook历史记录: 此记录可以判断,当前动作提交是否产生了webhook。
点击 View details
可以看到此webhook发送给对端Jenkins的数据信息,和请求状态。
- 200: 表示触发Jenkins请求成功;
- Resend Request: 重新发送请求;(此处便于排查调试错误)
- RequestBody: GitLab传递给Jenkins的数据信息;
假如请求由于xxx原因导致没有触发jenkins构建, 可以在这里点击 Resend Request
按钮进行重新发送请求,而不是再次提交代码。
如果Jenkins触发成功了之后,我们可以在Jenkins的构建日志中查看效果。 这些数据就是gitlab post传递过来的。
到此:你基本上已经知道了Gitlab如何触发Jenkins的了。(多看几遍,多练习几遍)
仓库发生变化自动触发
//gitlab传递的数据{} println("${webhookdata}") //数据格式化 webhookdata = readJSON text: "${webhookdata}" //提取仓库信息 env.srcUrl= webhookdata["project"]["git_http_url"] //项目地址 env.branchName= webhookdata["ref"]-"refs/heads/" // 分支 env.commitId= webhookdata["checkout_sha"] //提交id env.commitUser= webhookdata["user_username"] // 提交人 env.commitEmail= webhookdata["user_email"] // 邮箱 currentBuild.description = "Trigger by Gitlab \n branch: ${env.branchName} \n user: ${env.commitUser} " currentBuild.displayName = "${env.commitId}" pipeline{ //指定运行此流水线的节点,指定标签的名字 agent { node { label "build"}} stages{ //阶段1 获取代码 stage("CheckOut"){ //定义阶段1的变量 environment { NAME = "hwf01" VERSION = "1.1.11" ENVTYPE = "DEV1" } steps{ script{ //branchName = "${params.branchName}" //srcUrl = "${params.srcUrl}" checkout([$class: 'GitSCM', branches: [[name: "${env.branchName}"]], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-root', url: "${env.srcUrl}"]]]) } } } stage("Build") { //input加到这里就是选择是否运行 input { message '选择部署的环境' ok '提交' submitter 'hwf' parameters { choice choices: ["${env.srcUrl}"], name: "${env.branchName}" } } steps { script { println("运行构建") //要是想获取input的值,打印他的环境变量 } } } stage("Test"){ steps{ script { println("运行测试") } } } } post { always{ script{ println("流水线结束后,经常做的事情") sh "rm -rf ${env.nworkspace} " } } success{ script{ println("流水线成功后,要做的事情") } } failure{ script{ println("流水线失败后,要做的事情") } } aborted{ script{ println("流水线取消后,要做的事情") } } } }
4.提交流水线优化
过滤新建分支和tag的触发
你可能发现问题了,新建一个分支或者标签也会出现构建,这个构建是没有意义的。我们需要排除掉。没错,jenkins 的 Generic webHook
也是支持的。
新建分支触发流水线,gitlab上传递 的流水线 参数 会多一个before全0,after为全0就是,合并分支请求
添加三个变量,获取当前的提交信息 $object_kind $before $after
(此步骤一定要注意下参数名和值后面的空格,要去掉)
通过正则表达式配置触发条件:Expression ^push\s(?!0{40}).{40}\s(?!0{40}).{40}$
Text $object_kind $before $after
。 push请求只有after和before的值都不是40个0的时候触发构建(为40个0的情况是删除分支或者新建分支)
新建tag的时候触发 流水线需要勾选参数
如何支持多个分支触发构建?
创建多个gitlab webhook, 设置不同的分支,最终指向同一个jenkins 作业;
gitlab通过webhook限制自动触发的分支
其他集成
代码下载部分
找一个pipeline 类型的项目进入流水线语法, 找到片段生成器中的 checkout
。 我们使用checkout方法来进行代码下载(svn也是支持的哦)
我们的代码库是私有类型的,需要一个具有clone 代码权限的用户账号来下载代码。(测试场景你可以将gitlab admin用户的账号存储在Jenkins的凭据中用于后期代码下载, 线上环境最好创建一个单独的reporter角色的用户进行代码下载,机器人账号。)
然后我们来生成代码片段吧,
- 1 填写项目仓库地址
- 2 指定访问项目仓库的账号
- 3 指定要下载的代码库分支
- 4 点击生成代码
一个基本的下载代码的demo示例:
pipeline { agent { label "build" } stages{ stage("CheckOut"){ steps{ script { //仓库信息 branchName = "${params.branchName}" srcUrl = "${params.srcUrl}" //下载代码 checkout([$class: 'GitSCM', branches: [[name: branchName]], extensions: [], userRemoteConfigs: [[ credentialsId: '7eaa6c7f-f954-4a65-bcd7-15f27edb680b', url: srcUrl]]]) //验证 sh "ls -l " } } } // 代码构建 stage("Build"){ steps{ script{ echo "build" } } } //单元测试 stage("UnitTest"){ steps{ script{ echo "unit test" } } } } }

评论