设为首页 收藏本站
查看: 1699|回复: 0

[经验分享] jenkins+webhook+docker做持续集成

[复制链接]

尚未签到

发表于 2017-12-6 10:32:52 | 显示全部楼层 |阅读模式
  简介:我们现在都流行把项目封装成docker的镜像,不过实际用的时候就会发现很麻烦,我们每次更改代码了以后都要打包成docker容器
  ,事实证明项目比较多的时候真的会让人崩溃,我这边用spring cloud微服务+docker,才跑了6个项目每次修改上传,内心早已崩溃
  现在我介绍一下利用jenkins做持续集成,阿里code作代码托管平台,为什么不用开源中国呢,其实我这边的项目一直都是托管在开源中国上面的,主要是我实验的时候发现开源中国的https协议的证书,不是很被官方jenkins容器认同,每次都可以触发,但代码就是下载失败,jenkins是基于java的,所以我们要把开源中国的证书导入到java的cacerts中
  本来把它的证书从浏览器导出来了,但是cacerts文件需要root权限而jenkins容器又只有jenkins用户的权限,宝宝发脾气就用了阿里的code了。
  所以不推荐用开源中国webhook和jenkins搭配
  环境:阿里云code的代码托管平台
  jenkins容器
  一台安装docker环境的主服务器
  思路:分为3个job,job1->job2->job3,只有当前面的一个job单元测试成功了,才触发执行下一个job
  job1:在阿里云code上面设置webhook的push操作,我们提交代码到阿里云code,触发webhook给jenkins发送消息,jenkins自动去配置好的git地址下载源码到主目录
  job2:job1成功后,将源码打包成docker镜像,并且push到阿里云的docker仓库,或者自己的私有register的docker仓库
  job3:job2成功后,将以前老的容器stop,甚至删除,从阿里云的docker仓库,或者自己的私有register的docker仓库pull镜像并且运行docker镜像
  步骤:
  job1:
  1.运行jenkins容器:
  docker run -d -p 8080:8080 -p 50000:50000 -v /home/container:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone jenkins
  这里映射注意:
  /home/container目录需要设置权限,jenkins内部的用户是jenkins,不然会权限被拒绝,具体看http://www.cnblogs.com/waterlufei/p/6682283.html
  jenkins的默认时间是有问题的,有8个小时的时差,是时区的问题所以我们需要映射下时间
  点击新建,建一个自由风格的项目,描述简单介绍下
DSC0000.png

DSC0001.png

  填写自己的项目git地址,和git的用户名和密码,阿里云的用户名和密码不是登陆的用户名密码,这里和开源中国不一样
  触发器:
DSC0002.png

  我用的是通用的webhook插件,在系统管理->管理插件中下载,如果你不想下载插件也可以直接用触发远程构建,不过我试过,阿里code和开源中国上面webhook一直添加不上去,
  这里不深究,没意义
  构建的时候执行的命令,选择构建->Execute shell:
DSC0003.png

  然后apply,保存,job1就搭建完了
  2.系统设置->管理用户,点击右边的设置
DSC0004.png

  这是我们的apikey,我们都知道访问api的时候,正规点的软件都会有提供专门的api的账号密码,我们访问的时候携带这对用户名和密码就好了
  3.系统设置->Configure Global Security,去掉防止跨站点请求伪造的勾,这样我们就可以在浏览器和阿里的webhook访问到api的地址了,不然我们把用户名和密码放到url
  中,还是不能访问
DSC0005.png

  4.进入阿里code的一个项目,点击setting->webhook
  http://userID:apitoken@IP:8080/generic-webhook-trigger/invoke
  userID:apitoken就是前面看到的User ID和API Token
  IP:8080是jenkin容器的主页地址
  generic-webhook-trigger/invoke是固定的,对应jenkins的Generic Webhook Trigger插件
  现在我们测试下:
  改变下项目,push下,然后触发jenkins执行
DSC0006.png

  主目录下已经有我们的项目了
  QA:我们的项目下载在jenkins容器里,不管怎么改都是在容器中而jenkins容器中又没有docker的环境,对于这种情况有两种思想:
  1.想办法在容器内部搭建docker环境,可以实现(不推荐)
  2.容器是固定好的,容器只应该负责做它该做的事,而不是什么都干,像现在这种情况,应该是在别的有docker环境的主机上执行,jenkins只负责自己的触发执行等等(推荐)
  我们采用第二种方法,jenkins的设计者应该也是这么想的,所以提供的我们子节点的概念,我们可以配置子节点slave,并且用ssh协议连接
  ,这样我们的工作空间就在一个有docker环境的主机上了,
  job2
  job2的工作就是打包docker镜像,并将image推送到远程,我这里用的是阿里云的docker仓库
  添加子节点:系统设置->管理节点,新建一个节点,我们用ssh连接,这里需要瞎子jdk上面的,它会自动下载
DSC0007.png

  我们用jenkins新建一个job,命名为dockerimage,标签是我们子节点的标识,后面要用的,工作空间会放我们下载的代码,这样我们就
  实现了再主机环境上面构建docker
  1.新建job2,填写刚刚新建的子节点的标签
DSC0008.png

  设置当上一个job执行成功的时候,继续执行job2
DSC0009.png

  打包docker镜像,这里需要自己写好dockerfile文件
DSC00010.png

  然后我们再push下代码,发现两个job都能执行成功,在我的阿里云上面也有对应的最新的镜像了
DSC00011.png

  待解决问题:
  1.jenkins怎么解决版本依赖,这里我们实验的时候是写死的版本,实际开发肯定不能这样
  有实现版本标签的插件,后面会介绍
  2.jenkins怎么运行镜像在容器中,我们每次运行一个新的容器,就要关掉以前的老容器
  思路:可以写好一个docker-compose.yml文件,利用docker compose来控制容器
  未完待续。。。。。。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421149-1-1.html 上篇帖子: Docker安装Jenkins 下篇帖子: Jenkins(Docker容器内)使用宿主机的docker命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表