jenkins+webhook+docker作持续集成

简介:咱们如今都流行把项目封装成docker的镜像,不过实际用的时候就会发现很麻烦,咱们每次更改代码了之后都要打包成docker容器html

,事实证实项目比较多的时候真的会让人崩溃,我这边用spring cloud微服务+docker,才跑了6个项目每次修改上传,心里早已崩溃java

如今我介绍一下利用jenkins作持续集成,阿里code做代码托管平台,为何不用开源中国呢,其实我这边的项目一直都是托管在开源中国上面的,主要是我实验的时候发现开源中国的https协议的证书,不是很被官方jenkins容器认同,每次均可以触发,但代码就是下载失败,jenkins是基于java的,因此咱们要把开源中国的证书导入到java的cacerts中git

原本把它的证书从浏览器导出来了,可是cacerts文件须要root权限而jenkins容器又只有jenkins用户的权限,宝宝发脾气就用了阿里的code了。web

因此不推荐用开源中国webhook和jenkins搭配spring

环境:阿里云code的代码托管平台docker

         jenkins容器shell

         一台安装docker环境的主服务器api

思路:分为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个小时的时差,是时区的问题因此咱们须要映射下时间

点击新建,建一个自由风格的项目,描述简单介绍下

 

 

 填写本身的项目git地址,和git的用户名和密码,阿里云的用户名和密码不是登录的用户名密码,这里和开源中国不同

触发器:

 

 我用的是通用的webhook插件,在系统管理->管理插件中下载,若是你不想下载插件也能够直接用触发远程构建,不过我试过,阿里code和开源中国上面webhook一直添加不上去,

这里不深究,没意义

构建的时候执行的命令,选择构建->Execute shell:

而后apply,保存,job1就搭建完了

2.系统设置->管理用户,点击右边的设置

这是咱们的apikey,咱们都知道访问api的时候,正规点的软件都会有提供专门的api的帐号密码,咱们访问的时候携带这对用户名和密码就行了

3.系统设置->Configure Global Security,去掉防止跨站点请求伪造的勾,这样咱们就能够在浏览器和阿里的webhook访问到api的地址了,否则咱们把用户名和密码放到url

中,仍是不能访问

 

 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执行

主目录下已经有咱们的项目了

QA:咱们的项目下载在jenkins容器里,无论怎么改都是在容器中而jenkins容器中又没有docker的环境,对于这种状况有两种思想:

1.想办法在容器内部搭建docker环境,能够实现(不推荐)

2.容器是固定好的,容器只应该负责作它该作的事,而不是什么都干,像如今这种状况,应该是在别的有docker环境的主机上执行,jenkins只负责本身的触发执行等等(推荐)

咱们采用第二种方法,jenkins的设计者应该也是这么想的,因此提供的咱们子节点的概念,咱们能够配置子节点slave,而且用ssh协议链接

,这样咱们的工做空间就在一个有docker环境的主机上了,

job2

job2的工做就是打包docker镜像,并将image推送到远程,我这里用的是阿里云的docker仓库 

添加子节点:系统设置->管理节点,新建一个节点,咱们用ssh链接,这里须要瞎子jdk上面的,它会自动下载

 

咱们用jenkins新建一个job,命名为dockerimage,标签是咱们子节点的标识,后面要用的,工做空间会放咱们下载的代码,这样咱们就

实现了再主机环境上面构建docker

1.新建job2,填写刚刚新建的子节点的标签

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

打包docker镜像,这里须要本身写好dockerfile文件

 

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

待解决问题:

1.jenkins怎么解决版本依赖,这里咱们实验的时候是写死的版本,实际开发确定不能这样

有实现版本标签的插件,后面会介绍

2.jenkins怎么运行镜像在容器中,咱们每次运行一个新的容器,就要关掉之前的老容器

思路:能够写好一个docker-compose.yml文件,利用docker compose来控制容器

未完待续。。。。。。

相关文章
相关标签/搜索