Jenkins与Docker的持续集成实践_weixin_33859665的博客-程序员信息网

技术标签: python  ui  运维  

本文讲的是Jenkins与Docker的持续集成实践【编者的话】持续集成(CI/CD)是一种软件开发实践。用于帮助团队成员频繁、快速的集成,测试他们的工作成果,以尽快发现集成错误。 更频繁、更早的集成意味着更早的发现问题。通过持续集成,及时发现和解决代码故障,提高代码质量,减少故障处理成本等等。

【3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站】本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览;持续集成系统介绍;客户端与服务端的 CI/CD 实践;开发流程中引入 CI、CD;Gitlab 和 CI、CD 工具;Gitlab CI、Drone 的使用以及实践经验分享等。

常见持续集成工具

目前持续集成的生态越来越完善,工具也有很多,开源的或商业的。如:
  • 最最流行的,也是使用最多的Jenkins
  • 有着持续集成DNA的ThoughtWorks GO。理念:"Deployment as pipeline" (华为容器平台应该是基于GO做的二次开发实现)
  • Atlassian工具链之一的Bamboo
  • 与Gitlab紧密集成的Gitlab CI
  • 专为开源打造的Travis CI,与Github紧密集成
  • 使用Python语言实现的Buildbot,相信Pythoner看到会喜欢

我们的选型是Jenkins,所以我们来看下Jenkins。

Jenkins

Jenkins特点

  • Jenkins是开源的应用最广泛的持续集成工具,支持CI, CD;
  • Jenkins有很多插件,而且用户也可以自定义插件,可扩展性非常强;
  • Jenkins对Docker支持非常好,有一套完善的Docker插件;
  • Jenkins 2.0开始支持Pipeline,一个非常强大的插件,使用基于Groovy的DSL,支持CI/CD流水线;
  • Jenkins基于Java语言开发;

Jenkins几个概念

  • Master是Jenkins安装和运行的地方,它负责解析job脚本,处理任务,调度计算资源;
  • Agent 负责处理从Master分发的任务;
  • Executor就是执行任务的计算资源,它可以在Master或者Agent上运行。多个Executor也可以合作执行一些任务;
  • job 任务,用来定义具体的构建过程;
  • Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy代码能够与Java代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy可以使用其他Java语言编写的库。Jenkins用Groovy作为DSL;
  • Pipeline 流水线即代码(Pipeline as Code),通过编码而非配置持续集成/持续交付(CI/CD)运行工具的方式定义部署。流水线使得部署是可重现、可重复的;

    流水线包括节点(Node)、阶段(Stage)和步骤(Step)。

    流水线执行在节点上。节点是Jenkins安装的一部分。流水线通常包含多个阶段。一个阶段包含多个步骤。流水线上手指南可以查看到更多的内容。
    • node在Pipeline中的context中,node是job运行的地方。 node会给job创建一个工作空间。工作空间就是一个文件目录,这是为了避免跟资源相关的处理互相产生影响。工作空间是node创建的,在node里的所有step都执行完毕后会自动删除。
    • stage阶段,stage是一个任务执行过程的独立的并且唯一的逻辑块,Pipeline定义在语法上就是由一系列的stage组成的。 每一个stage逻辑都包含一个或多个step。
    • step步骤,一个step是整个流程中的一系列事情中的一个独立的任务,step是用来告诉Jenkins如何做。
  • Jenkinfile Jenkins支持创建流水线。它使用一种基于Groovy的流水线领域特定语言(Pipeline DSL)的简单脚。而这些脚本,通常名字叫Jenkinsfile。它定义了一些根据指定参数执行简单或复杂的任务的步骤。流水线创建好后,可以用来构建代码,或者编排从代码提交到交付过程中所需的工作。Jenkins中的Jenkinsfile有点类似Docker中的Dockfile的感觉

Jenkins 部署

Jenkins组件其实非常少,安装部署也非常简单。 Jenkins按角色就两类: master节点和slave节点。master安装完成后,在控制台中添加节点即可。

下面以Dcoker的部署方式为例说一下Jenkins的部署:

Master节点

查看 docker hub 中 jenkins 的 image
[[email protected] /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 image
docker 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 JDK
yun 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 [email protected]_ip:~/.ssh/authorized_keys

确保在scp前,slave节点根目录下.ssh目录已存在
chmod 700 authorized_keys

使用Jenkins来构建Docker是需要安装插件的。那我们需要安装哪些插件呢?

Jenkins有哪些Docker的Plugins
01.png

是非常丰富的,但并不是我们都能用的上,所以需要根据你使用的环境和平台来选择适合自己的Plugin安装就可以了。 每个Plugin都需要适配 Jenkins的版本,且每个Plugin也需要依赖一些其它Plugin,上面都已经做了标注,需要配套来用。

这里介绍几个常用的Docker插件:

Docker Commons Plugin

其基本功能:
  • API for managing Docker image and container fingerprints
  • Credentials and location of Docker Registry
  • Credentials and location of Docker Daemon (aka Docker Remote API)
  • ToolInstallation for Docker CLI clients
  • DockerImageExtractor extension point to get Docker image relations from jobs
  • Simple UI referring related image fingerprints in Docker builds

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。该插件适用于 “自由风格的软件项目”,如图:
02.png


CloudBees Docker Traceability,用于追踪通过Jenkins启停的容器的事件。

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有没有API?

因为,我们不是直接在Jenkins的Dashbord来操作, 而是集成到现有平台,所以我们需要使用它的API。

Jenkins的Remote API以REST的形式进行提供。例如,我们搭建的Jenkins站点为 http://myjenkins.com:8080 。那么,访问 http://myjenkins.com:8080/api  即可查看到该站点所有可用的API。

查询操作
03.png


执行一些动作
04.png

例如,我要创建一个 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的压测、性能扩展、高可用等,还需要持续深入的介绍。

本文转载自公众号:HULK一线技术杂谈,ID:hulktalk,作者:ADDOPS团队霍明明。

原文发布时间为:2017-08-16

本文作者:霍明明

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Jenkins与Docker的持续集成实践

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33859665/article/details/90335126

智能推荐

PaddleOCR之模型介绍与测试_宗而研之的博客-程序员信息网_paddleocr模型

在上一篇文章中,对 PaddleOCR 的功能进行了尝鲜,感觉还不错,但调参的时候发现通过 pip 安装的包支持的模型算法有限,无法满足使用需求,因此需要下载源码进行安装测试,本文对该方法进行一个介绍

IDEA打包得到的jar包运行报错的解决方法_资深吹牛专家的博客-程序员信息网_idea有jar包但是报错

报错原因使用IDEA中自带maven打包项目得到的jar包会有很多bug,意思就是可能本来能在IDEA中成功运行的项目可能会在被打包为jar包后运行报错,因此推荐直接使用maven打包项目maven打包springboot项目在命令行或终端进入项目目录windows的话需要在左下开始框中输入cmd打开如上命令行界面,linux系统可以直接右键进入终端注意:windows中如果项目不再C盘的话,需要先切换磁盘再cd到项目目录在项目目录下的终端输入:mvn clean package会有一大串

MY-IMX6-EK200 Linux-4.1.15 测试手册 v2.0(1)_myzr123的博客-程序员信息网

明远智睿MY-IMX6-EK200 Linux-4.1.15 测试手册 v2.01 第一部分 测试说明1.1 测试环境【开发板型号】:MY-IMX6-EK200-6Q-1G【内核版本】:Linux-4.1.15【文件系统】:L4115-fsl-image-qt5-myimx6a9.tar.bz2【工具版本】:MfgTool-MYIMX6A9-L4.1.15-Patch....

MVC.数据回填_半纸烟蓝的博客-程序员信息网

对于在页面上回填数据,这是很常见的,在编程时,往往伴随着数据的新增,修改,删除,查询,当要对数据执行修改的时候,这时候就需要针对个别页面或者input标签进行数据的回填,然后对回填的数据进行修改。数据回填的思路主要是针对于自身存在的ID,把ID传输到控制器执行数据的查询,然后控制器里面定义好的方法就会从数据库里面查询,筛选数据,,然后再把查询出来的数据返回给页面,从而达到数据的回填。既然要回填...

petalinux下建立zynq 工程_JiaoCL的博客-程序员信息网_zynq 建立petalinux

zynq系列的裸跑部分完成后,用片内的arm跑一下linux,并运行sdk文件:petalinux-create -t project --template zynq --name zynqprojectcd zynqproject将vivado生成的sysytem_wrapper.hdf 复制到zynqproject文件夹petalinux-config --get-hw-descrip...

随便推点

OpenShift 4 之Service Mesh教程(1)- 创建ServiceMesh环境,部署Istio的微服务_dawnsky.liu的博客-程序员信息网

文章目录部署微服务部署微服务本部分会部署3个微服务,它们的关系如下图:Frontend_v1接收用户请求后会转发给后台Backend_v1和Backend_v2。执行命令部署3个微服务和相关对象。在完成后可以看到3个运行的Pod,每个Pod中有2个Container(其中1个Container是自动注入的sidecar)。$ oc apply -f ocp/backend-v1-de...

STM32常见错误_兴风作浪的梦的博客-程序员信息网

一、 在“Debug选项卡”下设置好仿真器的类型后,下载程序时却提示“No ULINK Device found.”    解决办法: Keil MDK默认使用ULINK仿真器下载程序,在“Utilities选项卡”下把编程所使用的仿真器改为相应的类型即可。 二、 编译工程时提示如下信息: main.axf: Error: L6218E: Undefined symbol

FastJson带泛型转换时,JSON.parseObject后面的new TypeReference<Map<String, Object>>() {},花括号的由来_曼妥思的傅里叶变换的博客-程序员信息网_jsonparseobject 泛型

在用FastJson做类型转换时,尤其是泛型操作时,会用到JSON.parseObject,如下所示:Map&lt;String, Object&gt; objectMap = JSON.parseObject(responseStr, new TypeReference&lt;Map&lt;String, Object&gt;&gt;() {});那么它末尾为什么有个花括号呢,我们可以直接看TypeReference的源码public class TypeReference&lt;T&gt; {

python中tf.boolean_mask()函数的使用_大彤小忆的博客-程序员信息网_python中mask函数

  tf.boolean_mask() 函数的作用是通过布尔值对指定的列的元素进行过滤。语法结构boolean_mask(tensor, mask, name="boolean_mask", axis=None)其中,tensor:被过滤的元素   mask:一堆bool值,它的维度不一定等于tensor   return:mask为true对应的tensor的元素   当tensor与mask维度一致时,返回一维1-D exampleexamples1: &gt;&gt;&gt;

mysql按照给定的顺序筛选_mysql 查询结果集按照指定的字段值顺序排序_我是史迪仔的博客-程序员信息网

mysql 查询结果如果不给予指定的order by ,那么mysql会按照主键顺序(innodb引擎)对结果集加以排序,那么最后的排序可能就不是你想要的排序结果。举个例子,我要按照前端传过来的mongoId集合来查询数据库并且返回同样排序的结果集合,如(M3,M5,M4),他们对应的主键顺序为(M4,M3,M5)。如果在查询语句中不加order by 对查询结果排序,那么结果就会变成主键顺序(M...

网络测速命令--speedtest_weixin_34166472的博客-程序员信息网

网络测速speedtest-cli顾名思义,这个命令为网络测速命令,基于Python编写,测试系统网络的上传下载速度,GitHub托管的项目地址,以下列出常见的用法安装命令pip install speedtest-cli使用命令# 查看帮助,具体选项说明自行查看,这里列出几个常用的speedtest-cli -h参数说明原文-h, --help显示帮助信息...

推荐文章

热门文章

相关标签