Nov November 2014

使用docker来提升你的Jenkins演示 - 3

系列介绍

使用docker来提升你的Jenkins演示会安排五篇文章循序渐进地学习:

  • 第一篇使用docker来提升你的Jenkins演示 - 1:把需要的Jenkins软件、插件和作业配置放到了Jenkins docker容器中,使得你很容易演示,别人也很轻松的可以下载自己尝试。
  • 第二篇使用docker来提升你的Jenkins演示 - 2:演示了如何更进一步docker化你的Jenkins应用程序,学到了如何管理配置文件和巧妙地使用run --volumeexec来获取容器内的数据。
  • 第三篇使用docker来提升你的Jenkins演示 - 3:用docker中的docker来解决Jenkins主从机的演示
  • 第四篇:巧用ENTRYPOINT/CMD配合脚本来解决复杂的环境
  • 第五篇:讨厌的Jenkins docker插件

回顾

前两篇还是很简单,搭了个架子而已,在Jenkins的持续集成部署中,它的一个重要的使用方式就是构建的实际任务放在Slave(从属)机器上,Jenkins Master(主机)主要负责调度。这样能确保干净的构建环境和整体性能。

jenkins-demo1-main

这就是这个博客系列的第三篇文章,我会用一些例子一步一步来说明如何用docker实现这种演示,如果你对Jenkins的这种使用还不熟悉的话,正好可以一起学习。

用docker容器作为从属机器

现在我们考虑来个C++编译的Jenkins任务,在Jenkins中为了不污染主机和提高性能,一般都把具体的累活在从属机上实现。

既然jenkins主机已经用docker了,从属机当仁不让的也用docker了,这个已经有很多文章了,我就用了我以前做的一个镜像larrycai/jenkins-slave-ubuntu,可以查看Dockerfile,里面主要有以下几个:

  1. openjdk-7-jdk 包,jenkins从属机运行环境
  2. sshd 服务
  3. ssh的公钥(public key),当然密码也有。
  4. 为了演示方便,镜像里面已经预先下载好了一个小的c++程序outhome仓库。

先把它启动后监听在2222端口。

docker@boot2docker:~$ docker run -d -p 2222:22 larrycai/jenkins-slave-ubuntu 
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE                                  COMMAND                CREATED             STATUS              PORTS                    NAMES
4d1189c2c7be        larrycai/jenkins-slave-ubuntu:latest   "/usr/sbin/sshd -D"    16 minutes ago      Up 16 minutes       0.0.0.0:2222->22/tcp     boring_morse

创建新环境 craft3

把上次的larrycai/jenkins-demo2构建目录拷贝一份到新的工作环境,这次叫larrycai/jenkins-demo3,重新构建,启动(别忘了上次怎么做JENKINS_HOME)。

docker@boot2docker:$ docker build -t larrycai/jenkins-demo3 .
docker@boot2docker:$ docker run -v ~/jenkins:/data -p 8080:8080 -it larrycai/jenkins-demo3

先在系统中配好从节点,如下:

jenkins-demo1-main

Host要选172.17.42.1这是boot2docker的主机IP地址,每个docker容器都能访问,端口就是映射出的2222端口。这里也可以直接访问从属机的IP地址,那么端口就是标准的22了。

其中还要配好ssh访问的私钥。

jenkins-demo1-main

最后创建好新的工作craft3。

jenkins-demo1-main

里面配好从属机和工作脚本,运行一下看看

jenkins-demo1-main

一级棒,它工作了。

用上一篇博客教的方式把数据拷贝出来放到镜像里,重新构建镜像实验一下。

  • $JENKINS_HOME/credentials.xml # 这是一些Jenkins的认证信息(私钥)。
  • $JENKINS_HOME/config.xml # 包含了从属节点的配置

自动启动从属节点

现在从属节点是手工下载和启动的,那么在演示时怎么能够自动启动从属节点呢,一般有以下种办法

  1. 用脚本或编排(orechstration)工具如fig来启动多docker镜像
  2. 在Jenkins任务里面启动docker从属节点
  3. 在docker容器启动docker从属节点
  4. Jenkins Docker插件

第一种用脚本的方式肯定可以,但是感觉有点老土,而且还要下载其他脚本,何况也不能确定fig等工具是否能运行。

第四种情况听起来不错,但是坑很多,留待以后的博客专门来批判。

第二、第三种都需要要用到docker里的docker技术,其中第二种需要改变jenkins里的任务脚本,不够简洁,下面着重讨论第三种。

docker里的docker

Docker是有客户端和服务器Daemon端组成,具体请看Infoq上的Docker源码分析(一):Docker架构

所以我们可以在镜像装好docker客户端,很简单,就是一个二进制文件而已。

RUN curl https://get.docker.io/builds/Linux/x86_64/docker-latest -o /usr/local/bin/docker
RUN chmod +x /usr/local/bin/docker

为了访问,我们必须传递访问的套接字/var/run/docker.sock,这个用我们学过的标记-v就可以了。

我们把这段写在已有的start.sh脚本中,放在启动jenkins之前。

#!/bin/bash

export DOCKER_HOST=unix://docker.sock
docker run -d -p 2222:22 larrycai/jenkins-slave-ubuntu

exec java -jar /opt/jenkins/jenkins.war

重新构建运行一下(别忘了传递Docker主机的docker.sock)。

docker run -v /var/run/docker.sock:/docker.sock -p 8080:8080 -it larrycai/jenkins-demo3

就这么简单!是的,docker就是简洁,永远的v5。

当然现在的start.sh还是比较简单,如果第二次运行或者想每次强制更新从属机的镜像还不行,留待下次讨论,不过你可以想想,如果是你怎么解决。

摘要

在这篇博客中,我们讲解了如何用Docker演示Jenkins持续集成的主从应用实践,和利用docker中的docker技术来自动启动从属机器。

所有的代码你都可以在github上的jenkins-demo3上找到。

现在,您可以更新您的Jenkins新功能打包到Docker到处演示。

在接下来的博客中,我将展示如何更好地用docker和脚本来控制jenkins的从属节点。

Docker可以帮助我们做很多事情,关注新浪微博 @larrycaiyu @Docker中文社区 @infoq的docker专栏

blog comments powered by Disqus
comments powered by Disqus