【编者的话】持续集成(CI/CD)是一种软件开发实践。用于帮助团队成员频繁、快速的集成,测试他们的工做成果,以尽快发现集成错误。 更频繁、更早的集成意味着更早的发现问题。经过持续集成,及时发现和解决代码故障,提升代码质量,减小故障处理成本等等。java
目前持续集成的生态愈来愈完善,工具也有不少,开源的或商业的。如:git
咱们的选型是Jenkins,因此咱们来看下Jenkins。docker
Pipeline 流水线即代码(Pipeline as Code),经过编码而非配置持续集成/持续交付(CI/CD)运行工具的方式定义部署。流水线使得部署是可重现、可重复的;数据库
流水线包括节点(Node)、阶段(Stage)和步骤(Step)。api
流水线执行在节点上。节点是Jenkins安装的一部分。流水线一般包含多个阶段。一个阶段包含多个步骤。流水线上手指南能够查看到更多的内容。浏览器
node在Pipeline中的context中,node是job运行的地方。 node会给job建立一个工做空间。工做空间就是一个文件目录,这是为了不跟资源相关的处理互相产生影响。工做空间是node建立的,在node里的全部step都执行完毕后会自动删除。app
stage阶段,stage是一个任务执行过程的独立的而且惟一的逻辑块,Pipeline定义在语法上就是由一系列的stage组成的。 每个stage逻辑都包含一个或多个step。ssh
step步骤,一个step是整个流程中的一系列事情中的一个独立的任务,step是用来告诉Jenkins如何作。curl
Jenkinfile Jenkins支持建立流水线。它使用一种基于Groovy的流水线领域特定语言(Pipeline DSL)的简单脚。而这些脚本,一般名字叫Jenkinsfile。它定义了一些根据指定参数执行简单或复杂的任务的步骤。流水线建立好后,能够用来构建代码,或者编排从代码提交到交付过程当中所需的工做。Jenkins中的Jenkinsfile有点相似Docker中的Dockfile的感受
Jenkins组件其实很是少,安装部署也很是简单。 Jenkins按角色就两类: master节点和slave节点。master安装完成后,在控制台中添加节点便可。
下面以Dcoker的部署方式为例说一下Jenkins的部署:
Master节点
查看 docker hub 中 jenkins 的 image[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
能够看到第一个是官方提供的,因此咱们选择这个便可。
拉取jenkins imagedocker pull jenkins
启动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
启动完 jenkins master 后,在浏览器中数据输入 http://jenkins_master_ip:8080 登陆Jenkins控制台进行接下来的安装和配置。 具体图就不贴出来了。
查看Jenkins的版本java -jar /usr/share/jenkins/jenkins.war --version
slave 节点
安装Java JDKyun install java-1.8.0-openjdk
建立Jenkins用户$ useradd -m jenkins -d /home/jenkins$ passwd jenkins
建立工做目录mkdir /data/jenkinschown jenkins.jenkins /data/jenkins
添加Jenkins用户到Docker用户组sudo usermod -a -G docker jenkins
配置SSH互信,Master免密码登录Slave
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是须要安装插件的。那咱们须要安装哪些插件呢?
Jenkins有哪些Docker的Plugins
这里介绍几个经常使用的Docker插件:
Docker Commons Plugin
其基本功能:
Docker Plugins,该插件是将Docker做为Jenkins的slave来使用,来在Docker容器种完成项目的build,build完成后该容器slave容器就会被销毁。全部的工做都是在slave容器内完成。docker-build-step
该插件在 build 过程种增长了对 Docker 命令的支持。
Docker Pipeline Plugin,基于Docker Commons Plugin实现的一些上层的基于Docker的Pipeline编排。
Docker Hub Notification Trigger Plugin,该插件提供了当Registry中的image发生变化时触发build新镜像的功能。
CloudBees Docker Build and Publish,该插件提供了经过Dockerfile来构建项目并将生成的镜像上传到镜像仓库的功能。
CloudBees Docker Custom Build Environment,This plugin allows the definition of a build environment for a job using a Docker container。该插件适用于 “自由风格的软件项目”,如图:
Kubernetes, 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的Dashbord来操做, 而是集成到现有平台,因此咱们须要使用它的API。
Jenkins的Remote API以REST的形式进行提供。例如,咱们搭建的Jenkins站点为myjenkins.com:8080。那么,访问http://myjenkins.… 便可查看到该站点全部可用的API。
查询操做
<?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了。它的管理页面为myjenkins.com:8080/job/my_job。… /my_job/api/ 便可查看到该job可用的API。
更多的API介绍能够参考Jenkins的官方wiki,这里只是个引子,在此就不过多进行介绍。
该篇文章主要是介绍了Jenkins和Docker的持续集成的实现部分,后续还有关于Jenkins的压测、性能扩展、高可用等,还须要持续深刻的介绍。