Gerrit + Jenkins

背景

当前团队使用Gerrit来做代码管理、CodeReview。计划实现当review提交到了Gerrit并且review通过(merged)自动触发Jenkins流水线。以前接触Gitlab比较多,Gerrit还是第一次开始用,踩了点坑记录下来。本文主要讲述Gerrit Trigger流水线配置,关于服务器配置等细节问题暂不研究,降低复杂性。

Gerrit 配置

我们可以通过Docker的方式快速启动一个Gerrit实例,默认Gerrit使用的是HTTP 8080端口、SSH29418端口。通过CANONICAL_WEB_URL参数指定服务器网页地址。

docker run --name gerrit -itd \
-p 8088:8080 \
-p 29418:29418 \
-e CANONICAL_WEB_URL=http://192.168.1.200:8088 gerritcodereview/gerrit

启动成功后,默认打开的是一个插件安装的页面,此时可以根据个人需要安装相关插件,也可以跳过。

默认登录就是admin, 创建一个Jenkins用户。


登录Jenkins用户然后配置SSH-KEY,创建ssh-key添加到jenkins用户配置中。

[root@zeyang-nuc-service ~]# kubectl exec -it jenkins-6ccf555769-sfdw6 -n devops bash
bash-4.2$ id
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
bash-4.2$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nGqkSVAUuc2xrGe8Bz/xuWcQ/YVrDISPJux+tCZkJgI jenkins@jenkins-6ccf555769-sfdw6
The key's randomart image is:
+---[RSA 2048]----+
|   .+o     .     |
|   .. .   . .    |
|  .  = +   =   . |
|  E.. =.o.+ + . .|
|   ..o..So . + o |
|   .o+*.* o   =  |
|    o+oX + + .   |
|     .. * * o    |
|       . =.+     |
+----[SHA256]-----+

默认的key在JENKINS_HOME目录中/var/jenkins_home/.ssh/id_rsa

bash-4.2$ cat /var/jenkins_home/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCb+BcXnBXG4f4T3MSDsL/aNLm4zlMkX5xn5pwC4eaep+XMe9kXMsYJZ3xuQ1dxUTAeTHAYX33IsclpE63H0nXdNj8cgcC9dnyXFYGieKfSx44JeP3O4rcMFN+cPGlEcIVJdTF8RfpvDANObCUJ0fnsw7f/yVImdwqGbXaBsU11+s6uRuCghXUw1JhA4H+mVp89YZN7ilhif4I8rol/cUkcKnQhxM0ziClWL5VLBTfpO5QNhj+vy2JICMSgU93EEs0LgBUdT2Q+1tduQo3R7fNOkQm46y1oonoUMzXTr9/kOlcAxZR9kIT7WYPxGQGCoyf2AiMP3VKwowv98MenDCFZ jenkins@jenkins-6ccf555769-sfdw6

这里使用的是id_rsa.pub,复制文件内容,然后添加到Gerrit Jenkins用户中。(记得点击ADD)


将Jenkins用户加入Non-interactive Users组。BROWSE>Groups>Non-Interactive Users>Members

创建一个仓库,然后简单的设置下repo权限:

refs/* :read Non-interactive Users
refs/heads/* : Label Code-Review Non-interactive Users

Gerrit 2.7+  创建一个组Event Streaming Users,将Jenkins用户加入。


设置All-projects access 权限, BROWSE> repos>All-Projects>Access>Global Capabilities >Stream Events

allow Event Streaming Users


到此,Gerrit配置基本上已经完成了,页面样式很简洁。


Jenkins配置

首先我们安装Gerrit Hook插件,然后进入系统管理会看到gerrit的图标。



Connection error : com.jcraft.jsch.JSchException: Auth fail 错误一般是ssh-key问题。

在流水线项目中添加Gerrit Trigger.


Ok,Jenkins的配置完成了。接下来开始测试自动触发。


创建codereview

[root@zeyang-nuc-service devops]# ls
aa,txt  aasss,txt  sss  test.txt
[root@zeyang-nuc-service devops]# echo 123 >test.txt
[root@zeyang-nuc-service devops]# git add .
[root@zeyang-nuc-service devops]# git commit -m "init"
[master 77f6474] init1 file changed, 1 insertion(+), 1 deletion(-)
[root@zeyang-nuc-service devops]# git push origin HEAD:refs/for/master
Username for 'http://192.168.1.200:8088': admin
Password for 'http://admin@192.168.1.200:8088':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 253 bytes | 253.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1)
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote:   http://192.168.1.200:8088/c/devops/+/21 init [NEW]
remote:
To http://192.168.1.200:8088/devops* [new branch]      HEAD -> refs/for/master

merge 测试


Gerrit传递的参数还是挺多的,可以很方便的获取。基本上这些参数就够用了。



Pipeline As Code

//Pipeline params
String BRANCH_NAME = "${env.GERRIT_BRANCH}"
String PROJECT_NAME = "devops"
String PROJECT_URL = "http://192.168.1.200:8088/devops"
currentBuild.description = "Trigger By ${BRANCH_NAME}"//Pipeline
pipeline{agent {node {  label "build"   //指定运行节点的标签或者名称}}options{skipDefaultCheckout()}triggers {//配置gerrit触发器gerrit  customUrl: '',gerritProjects: [[branches: [[compareType: 'ANT', pattern: '**']],compareType: 'PLAIN',disableStrictForbiddenFileVerification: false,pattern: "${PROJECT_NAME}"]],serverName: 'devops',triggerOnEvents: [changeMerged()]}stages{stage("GetCode"){steps{echo "========executing GetCode========"//下载代码checkout([$class: 'GitSCM', branches: [[name: "${BRANCH_NAME}"]],doGenerateSubmoduleConfigurations: false,extensions: [],submoduleCfg: [],userRemoteConfigs: [[url: "${PROJECT_URL}"]]])}}}post{always{echo "========always========"cleanWs()}success{echo "========pipeline executed successfully ========"}failure{echo "========pipeline execution failed========"}}
}

到此基本上触发就已经完成了,后续添加构建和发布步骤。Gerrit进行CodeReview还是很方便的,现在每次提交的代码、Jenkinsfile都需要先进行CodeReview才能进行merge。哈哈,注意文件中的空格.....


历史文章

  • 新Jenkins实践

  • GitLabCI实践专辑

  • Jenkins流水线实践专辑

  • ChatOps微实践

关于作者

泽阳,DevOps领域实践者。专注于企业级DevOps运维开发技术实践分享,主要以新Linux运维技术、DevOps技术课程为主。丰富的一线实战经验,课程追求实用性获得多数学员认可。课程内容均来源于企业应用,在这里既学习技术又能获取热门技能,欢迎您的到来!(微信ID: devopsvip)

好课推荐

  • 系统的教你实施流水线

  • 掌握DevOps流水线的多样性,原来还能这样?点击下图,即可购买????


长按识别二维码关注我们

欢迎把我们推荐给您的朋友们

DevOps流水线实践课程

????戳阅读原文,立即购买

CodeReview实践-Gerrit自动触发JenkinsCI相关推荐

  1. SAP公司间STO流程里外向交货单PGI后自动触发内向交货单的实现

    SAP公司间STO流程里外向交货单PGI后自动触发内向交货单的实现 公司间采购(公司间库存转储)在很多SAP项目里很常见,笔者在很多项目里都有这种场景.项目实践中,都是采用SAP的Inter-comp ...

  2. 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 – Part 2

    通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 – Part B 6, 入站IDOC的设置 IDoc type – DELVRY01 Message Type – DES ...

  3. 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 - Part I

    通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 - Part I 公司间采购(公司间库存转储)流程里,常见的解决方案是发货方完成发货过账后,自动触发收货方的内向交货单.除 ...

  4. SAP QM 内向交货单在完成包装之后就自动触发了检验批?

    SAP QM 内向交货单在完成包装之后就自动触发了检验批? 我们知道,启用了SAP QM模块之后,在很多业务活动的时候会自动触发检验批.比如收货,转库,改库存状态,Release工单等业务操作完成后, ...

  5. SAP PM 初级系列19 - IP10为维修计划触发维修工单的同时也自动触发了维修通知单!

    SAP PM 初级系列19 - IP10为维修计划触发维修工单的同时也自动触发了维修通知单! 执行事务代码IP10, 输入维修计划代码,回车, 点击Manual call按钮,如上图.进入如下界面, ...

  6. SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现

    SAP MM 公司间STO里交货单PGI之后自动触发内向交货单功能的实现 笔者所在的项目上的公司间STO的流程里,发货公司在做PGI之后系统自动触发收货公司的内向交货单.这个功能是通过交货单的Outp ...

  7. 使用jQuery中trigger()方法自动触发事件

    一.常用事件 在页面加载完成时  自动触发input的点击事件,在移动端可以实现自动弹出输入法,获得焦点 $("input").trigger("click") ...

  8. 2015.1.10 解决DataGridView SelectionChanged事件自动触发问题

    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题 参考文章: (1)2015.1.10 解决DataGridView SelectionChanged ...

  9. SAP S/4HANA销售订单创建时,会自动触发生产订单的创建

    这个自动触发的过程是怎么实现的? 使用下面的代码创建一个销售订单: DATA: ls_header TYPE bapisdhd1,ls_headerx TYPE bapisdhd1x,lt_bapir ...

最新文章

  1. 《LeetCode力扣练习》第5题 C语言版 (做出来就行,别问我效率。。。。)
  2. delphi TWebBrowser组件使用详解
  3. 搜狐视频app如何设置仅自己可看我的关注列表
  4. 基于智能卡的嵌入式网络加密安全系统设计
  5. C++中怎么调用C函数
  6. Tensorflow:分类模型评估
  7. 版式设计优秀作品欣赏_垂直版式的垂直作品设计探索
  8. 如何执行冲刺sprint
  9. 如何下载一个网页的背景图片
  10. linux vi文件加密和文件解密
  11. 【相濡以沫、相忘于江湖】
  12. 如何把文本文档转换成html格式,把固定格式的文本文档转换为Excel电子表格的方法...
  13. Mysql安装后打开MySQL Command Line Client闪退处理办法,亲测有效
  14. Nacos 1.0.1 发布,社区一起定义的 Nacos
  15. 双减之后,体育培训升温,如何为孩子选择合适的体育项目?
  16. [软件人生]抢钱的电影与现在的软件开发
  17. html图片折叠,CSS 实现 图片鼠标悬停折叠效果
  18. CHM:噬菌体对肠道菌群和代谢组的调控
  19. PooledDataSource forcefully closed/removed all connections的解决
  20. python内置函数布尔值bool用法详解

热门文章

  1. 4.9 朗斯基行列式
  2. linux怎么进mysql天气_Linux命令行怎么浏览天气预报
  3. java中验证手机号_Java验证手机号
  4. 数字信号处理大作业——基于matlab R2019a的男声变女声资料汇总与代码
  5. 敏捷项目一页纸测试计划通用模板
  6. isis学不到looback口的路由_干货 | ONU、机顶盒、路由器常见网络问题及处理方法...
  7. 无锁队列原理及实现(二)
  8. Ubuntu常用快捷键使用记录
  9. jQUery第一课(入门选择器)
  10. JS Worker多线程