该文章出自于 ADDOPS 团队,是一篇关于 Jenkins 与 Docker 的持续集成实践,当前使用 Jenkins 做 CI,并且支持 Docker 插件做 CD 的实践案例使用越来越多,该文章只是一个开始,后续还会有 Jenkins 与 docker 集成的一个系列,希望大家能持续关注,最后希望该文章能给大家更多的一些关于持续集成的启发。
PS:丰富的一线技术、多元化的表现形式,尽在 "HULK 一线技术杂谈",点关注哦!
前言
持续集成 (CI/CD) 是一种软件开发实践。用于帮助团队成员频繁、快速的集成,测试他们的工作成果,以尽快发现集成错误。 更频繁、更早的集成意味着更早的发现问题。通过持续集成,及时发现和解决代码故障,提高代码质量,减少故障处理成本等等。
常见持续集成工具
目前持续集成的生态越来越完善,工具也有很多,开源的或商业的。如:
我们的选型是 Jenkins,所以我们来看下 Jenkins
Jenkins 特点
Jenkins 几个概念
Jenkins 部署
Jenkins 组件其实非常少,安装部署也非常简单。 Jenkins 按角色就两类: master 节点和 slave 节点。master 安装完成后,在控制台中添加节点即可。
下面以 Dcoker 的部署方式为例说一下 Jenkins 的部署:
master 节点
[root@k3128v /home/huomingming]# docker search jenkinsNAME DESCRIPTION STARS OFFICIAL AUTOMATEDjenkins Official Jenkins Docker image 2600 [OK] stephenreed/jenkins-java8-maven-git Automated build that provides a continuous... 53
可以看到第一个是官方提供的,所以我们选择这个即可。
docker pull jenkins
jenkins 没有数据库,所有数据都是存放在文件中的,首先在本地创建 jenkins 数据目录,用于保存 jenkins 的数据 这个目录需要定期的备份,用于容灾 (当前 jenkins 容器所在节点由于不可抗因素无法使用时,可以在新机器上使用备份的数据启动新的 jenkins master 节点)。
sudo mkdir /var/jenkins
sudo chown 1000:1000 /var/jenkins
sudo docker run -p 8080:8080 -p 50000:50000 -v /var/jenkins:/var/jenkins_home --name my_jenkins -d jenkins
这样 jenkins 就成功跑起来了。可以直接通过机器的 8080 端口访问 jenkins. 本地的 / var/jenkins 就相当于容器里 jenkins 用户的用户主目录,所以要保证该目录的权限为 uid 为 j1000 的用户目录。
启动完 jenkins master 后,在浏览器中数据输入 http://jenkins_master_ip:8080 登录 Jenkins 控制台进行接下来的安装和配置。 具体图就不贴出来了~~
java -jar /usr/share/jenkins/jenkins.war --version
slave 节点
yun install java-1.8.0-openjdk
$ useradd -m jenkins -d /home/jenkins$ passwd jenkins
mkdir /data/jenkinschown jenkins.jenkins /data/jenkins
sudo usermod -a -G docker jenkins
master 有多种管理 slave 的方式,我们选择 SSH 方式 在 master 节点中,切换到 jenkins 用户 ssh-keygen -t rsa 创建秘钥对 把公钥拷贝到 slave 节点
scp ~/.ssh/id_rsa.pub jenkins@slave_ip:~/.ssh/authorized_keys
确保在 scp 前,slave 节点根目录下. ssh 目录已存在
chmod 700 authorized_keys
使用 jenkins 来构建 docker 是需要安装插件的。那我们需要安装哪些插件呢?
是非常丰富的,但并不是我们都能用的上,所以需要根据你使用的环境和平台来选择适合自己的 plugin 安装就可以了。 每个 plugin 都需要适配 Jenkins 的版本,且每个 plugin 也需要依赖一些其它 plugin,上面都已经做了标注,需要配套来用。
这里介绍几个常用的 Docker 插件
其基本功能:
该插件是将 docker 作为 jenkins 的 slave 来使用,来在 docker 容器种完成项目的 build,build 完成后该容器 slave 容器就会被销毁。所有的工作都是在 slave 容器内完成。
docker-build-step
该插件在 build 过程种增加了对 Docker 命令的支持。
基于 Docker Commons Plugin 实现的一些上层的基于 Docker 的 Pipeline 编排
该插件提供了当 registry 中的 image 发生变化时触发 build 新镜像的功能。
该插件提供了通过 Dockerfile 来构建项目并将生成的镜像上传到镜像仓库的功能。
This plugin allows the definition of a build environment for a job using a Docker container.
该插件适用于 "自由风格的软件项目",如图:
用于追踪通过 jenkins 启停的容器的事件
- This plugin allows Jenkins agents to be dynamically provisioned on a Kubernetes cluster. The aim of the Kubernetes plugin is to be able to use a Kubernetes cluster to dynamically provision a Jenkins agent (using Kubernetes scheduling mechanisms to optimize the loads), run a single build, then tear-down that slave.
与 Kubernetes 结合,通过 kubernetes 提供 jenkins 的 slave 节点。利用 kubernetes 的调度功能提供快速的启停 slave 节点执行 build 等任务。目前是 0.11 版本,稳定性有待验证。
Jenkins 有没有 API?
因为,我们不是直接在 Jenkins 的 Dashbord 来操作, 而是集成到现有平台,所以我们需要使用它的 API。
Jenkins 的 Remote API 以 REST 的形式进行提供。例如,我们搭建的 Jenkins 站点为 http://myjenkins.com:8080。那么,访问 http://myjenkins.com:8080/api 即可查看到该站点所有可用的 API;
例如,我要创建一个 job,名字为 my_job
my_job 的配置文件
<?xml version='1.0'encoding='UTF-8'?><project>
<actions/>
<description></description>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers class="vector"/>
<concurrentBuild>false</concurrentBuild>
<builders/>
<publishers/>
<buildWrappers/></project>
调用 api 创建 my_job
curl -X POST http://www.xxx.xxx/jenkins/createItem?name=my_job --user uname:pass --data-binary "my_job_config.xml" -H "Content-Type: application/xml"
然后,你就可以在 Jenkins dashboard 上看到这个 job 了。它的管理页面为 http://myjenkins.com:8080/job/my_job。那么我们访问 /my_job/api/ 即可查看到该 job 可用的 API。
更多的 api 介绍可以参考 Jenkins 的官方 wiki,这里只是个引子,在此就不过多进行介绍。
该篇文章主要是介绍了 Jenkins 和 docker 的持续集成的实现部分,后续还有关于 Jenkins 的压测、性能扩展、高可用等,还需要持续深入的介绍。敬请关注。
扫描下方
二维码
了解更多内容
来源: http://www.tuicool.com/articles/VNz6NrM