使用docker作为jenkins slave。

文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciandcd

参考:

https://www.cloudbees.com/blog/templating-jenkins-build-environments-docker-containers

需要安装插件:

CloudBees Docker Custom Build Environment Plugin
https://wiki.jenkins-ci.org/display/JENKINS/CloudBees+Docker+Custom+Build+Environment+Plugin

1. docker 和插件CloudBees Docker Custom Build Environment Plugin

docker是一种非常好的方法来快速生成可重现,隔离的环境。docker相对虚拟机更轻量级,需要更少的资源来运行。

docker的另一个好处是docker image可以是从hub.docker.com或私有的repo获取的编译好的docker image, 也可以下载文本格式的Dockerfile,然后在生成docker image。

Dockerfile可以与项目的源代码一个版本控制,从而实现源代码和构建环境docker image同步且可重现。

插件CloudBees Docker Custom Build Environment Plugin,通过此插件可以直接使用docker image或Dockerfile来生成job的运行环境。

2. jenkins docker images

https://hub.docker.com/r/jenkinsci/jnlp-slave/ (docker pull jenkinsci/jnlp-slave)

https://hub.docker.com/r/jenkinsci/ssh-slave/ (docker pull jenkinsci/ssh-slave)

https://hub.docker.com/r/jenkinsci/slave/  (docker pull jenkinsci/slave)

所有jenkins相关的docker https://hub.docker.com/u/jenkinsci/。

本实例中使用jnlp-slave docker image,但是我的环境没有jenkins slave,job运行在master上,docker也安装在master上。

如果你job运行在node/slave上,需要node上安装docker。

确保已经安装docker,且当前用户可以不加sudo来使用docker。

sudo groupadd docker
sudo gpasswd -a ${USER} docker
newgrp docker
sudo service docker restart

然后运行以下确保docker安装且设置正确:

osboxes@osboxes:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
osboxes@osboxes:~$ docker info
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 3
Server Version: 1.11.2
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs

测试下载jenkins slave docker image:

osboxes@osboxes:~$ docker -H unix:///var/run/docker.sock pull jenkinsci/jnlp-slave
Using default tag: latest
latest: Pulling from jenkinsci/jnlp-slave
7ccc78f8af6d: Already exists
a3ed95caeb02: Already exists
29f19d8b362b: Already exists
a068cb6fd68b: Already exists
8f8532f99b46: Already exists
fc6378a07ddb: Already exists
debdb2a461e8: Already exists
4a4e85ec23cd: Already exists
af041ce270a0: Already exists
82928c989a2b: Already exists
a05116d5d5b4: Already exists
Digest: sha256:cfdb32e8fa5ebf965caf8244c337ca5451eb6c45c8f881f1823bd8eb3c61bb62
Status: Image is up to date for jenkinsci/jnlp-slave:latest

3. 创建freestyle job使用docker

1) 使用测试git repo:https://github.com/ciandcd/JavaHelloWorld.git

2)jenkins job 配置

使用jenkinsci/jnlp-slave docker image,注意docker host uri的配置,我的docker和jenkins都在同一测试机器上。

3)job的配置xml如下:https://github.com/ciandcd/jenkins-awesome/blob/master/jenkins_home/jobs/docker_hello/config.xml

4) 检查job的运行log可以看到jenkins自己下载启动docker image,然后运行后停止docker。

$ docker -H unix:///var/run/docker.sock inspect jenkinsci/jnlp-slave
$ docker -H unix:///var/run/docker.sock run --rm --entrypoint /bin/true alpine:3.2
$ docker -H unix:///var/run/docker.sock run --tty --detach --workdir /home/osboxes/github/jenkins-example/jenkins_home/jobs/docker_hello/workspace --volume /home/osboxes/github/jenkins-example/jenkins_home:/home/osboxes/github/jenkins-example/jenkins_home:rw --volume /tmp:/tmp:rw --net bridge --add-host dockerhost:172.17.0.1 --env BUILD_DISPLAY_NAME=#12 --env BUILD_ID=12 --env BUILD_NUMBER=12 --env BUILD_TAG=jenkins-docker_hello-12 --env BUILD_URL=http://10.130.28.78:8008/job/docker_hello/12/ --env CLASSPATH= --env EXECUTOR_NUMBER=0 --env GIT_BRANCH=origin/master --env GIT_COMMIT=b462496ca38e2c5b17aa6f599322cebffe104c24 --env GIT_PREVIOUS_COMMIT=b462496ca38e2c5b17aa6f599322cebffe104c24 --env GIT_URL=https://github.com/ciandcd/JavaHelloWorld.git --env HUDSON_HOME=/home/osboxes/github/jenkins-example/./jenkins_home --env HUDSON_SERVER_COOKIE=f2bf6016b1befbaa --env HUDSON_URL=http://10.130.28.78:8008/ --env JENKINS_SERVER_COOKIE=f2bf6016b1befbaa --env JENKINS_URL=http://10.130.28.78:8008/ --env JOB_BASE_NAME=docker_hello --env JOB_NAME=docker_hello --env JOB_URL=http://10.130.28.78:8008/job/docker_hello/ --env NODE_LABELS=master --env NODE_NAME=master --env PATH+JDK=/usr/lib/jvm/java-8-openjdk-amd64/bin --env WORKSPACE=/home/osboxes/github/jenkins-example/jenkins_home/jobs/docker_hello/workspace jenkinsci/jnlp-slave /bin/cat
Docker container a44510f2cc21a473c26759cfa650dc26b4c0b7799d11eb37ab21d02cf5682276 started to host the build
$ docker -H unix:///var/run/docker.sock exec --tty a44510f2cc21a473c26759cfa650dc26b4c0b7799d11eb37ab21d02cf5682276 env
[workspace] $ docker -H unix:///var/run/docker.sock exec --tty --user 1000:1000 a44510f2cc21a473c26759cfa650dc26b4c0b7799d11eb37ab21d02cf5682276 env BUILD_DISPLAY_NAME=#12 BUILD_ID=12 BUILD_NUMBER=12 BUILD_TAG=jenkins-docker_hello-12 BUILD_URL=http://10.130.28.78:8008/job/docker_hello/12/ CA_CERTIFICATES_JAVA_VERSION=20140324 CLASSPATH= EXECUTOR_NUMBER=0 GIT_BRANCH=origin/master GIT_COMMIT=b462496ca38e2c5b17aa6f599322cebffe104c24 GIT_PREVIOUS_COMMIT=b462496ca38e2c5b17aa6f599322cebffe104c24 GIT_URL=https://github.com/ciandcd/JavaHelloWorld.git HOME=/home/jenkins HOSTNAME=a44510f2cc21 HUDSON_HOME=/home/osboxes/github/jenkins-example/./jenkins_home HUDSON_SERVER_COOKIE=f2bf6016b1befbaa HUDSON_URL=http://10.130.28.78:8008/ JAVA_DEBIAN_VERSION=8u66-b01-1~bpo8+1 JAVA_VERSION=8u66 JENKINS_SERVER_COOKIE=f2bf6016b1befbaa JENKINS_URL=http://10.130.28.78:8008/ JOB_BASE_NAME=docker_hello JOB_NAME=docker_hello JOB_URL=http://10.130.28.78:8008/job/docker_hello/ LANG=C.UTF-8 NODE_LABELS=master NODE_NAME=master PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH+JDK=/usr/lib/jvm/java-8-openjdk-amd64/bin TERM=xterm WORKSPACE=/home/osboxes/github/jenkins-example/jenkins_home/jobs/docker_hello/workspace /usr/share/maven/bin/mvn clean verify
env: /usr/share/maven/bin/mvn: No such file or directory
Build step 'Invoke top-level Maven targets' marked build as failure
Stopping Docker container after build completion
$ docker -H unix:///var/run/docker.sock kill a44510f2cc21a473c26759cfa650dc26b4c0b7799d11eb37ab21d02cf5682276
a44510f2cc21a473c26759cfa650dc26b4c0b7799d11eb37ab21d02cf5682276
$ docker rm --force a44510f2cc21a473c26759cfa650dc26b4c0b7799d11eb37ab21d02cf5682276
a44510f2cc21a473c26759cfa650dc26b4c0b7799d11eb37ab21d02cf5682276

参考:

DOCKER_PORT 相关:http://stackoverflow.com/questions/26561963/how-to-detect-a-docker-daemon-port

jenkins和docker 使用docker作为slave的更多相关文章

  1. Docker 以 docker 方式运行 jenkins

    https://testerhome.com/topics/5798 Docker 以 docker 方式运行 jenkins jmcn · 2016年08月26日 · 最后由 blueshark 回 ...

  2. kubernetes部署jenkins(Docker in Docker)及认证

    引言 Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. 本文将Jenkins的master与slave置于Pod中,部署在namespace:jenk ...

  3. Jenkins在Pod中实现Docker in Docker并用kubectl进行部署

    Jenkins在Pod中实现Docker in Docker并用kubectl进行部署 准备工作 安装Jenkins Jenkins的kubernetes-plugin使用方法 说明 Jenkins的 ...

  4. jenkins+docker 持续构建非docker in docker jenkins docker svn maven

    工欲善其事必先利其器,为了解脱程序员的,我们程序员本身发明了很多好用的工具,通过各种工具的组合来达到我们想要的结果 本文采用jenkins docker svn maven作为相关工具,项目sprin ...

  5. jenkins+docker 持续构建非docker in docker

    工欲善其事必先利其器,为了解脱程序员的,我们程序员本身发明了很多好用的工具,通过各种工具的组合来达到我们想要的结果 本文采用jenkins docker svn maven作为相关工具,项目sprin ...

  6. Jenkins Jfrog Artifactory 以及docker下的pipeline 容器编排实践

    1. 测试环境情况: Docker主机 10.24.101.99 JFrog Artifactory 主机 (admin password) jenkinx github原始地址:https://gi ...

  7. [转帖]Docker里运行Docker docker in docker(dind)

    Docker里运行Docker docker in docker(dind) http://www.wantchalk.com/c/devops/docker/2017/05/24/docker-in ...

  8. Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

    在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择.而在 DevOps 中,我们需要将各种后端/前端 ...

  9. Docker系列——Docker安装&基础命令

    Docker 概述 Docker 是一个开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. ...

随机推荐

  1. 循序渐进Python3(六) -- 初识内置变量、反射、递归

    #python用下划线作为变量前缀和后缀指定特殊变量.稍后我们会发现,   #对于程序来说,其中的有些变量是非常有用的,而其他的则是未知或者无用的.   #我们总结一下Python中下划线的特殊用法  ...

  2. 【转载】Windows自带.NET Framework版本大全

    转载自:http://blogs.msdn.com/b/astebner/archive/2007/03/14/mailbag-what-version-of-the-net-framework-is ...

  3. rhel7防止开机破密码

    在/etc/grub.d/00_header文件结尾加入  cat <<EOF set  superusers="qin"#用户名称可以更加自身编辑 password ...

  4. nginx的特点

    1.热部署        我个人觉得这个很不错.在master管理进程与worker工作进程的分离设计,使的Nginx具有热部署的功能,那么在7×24小时不间断服务的前提下,升级Nginx的可执行文件 ...

  5. Scrum Meeting (Oct. 27 2014)

    软件工程是一门十分有意思的课程,它不仅锻炼了我们开发软件的能力,更是给了我们结队作业的机会,在团队协作中,我们学会了欣赏别人,学会了品鉴自己,学会了如何集思广益凝聚成一个锐意进取的集体.继单人单词查询 ...

  6. shell脚本批量处理字符串

    上周五运营那边给了一份手机号码的excle,要求查询出所有对应于用户编号的用户的信息.这个时候遇到了一个问题就是,需要查询的用户数量很多,不可能一个一个去查,而excle中的格式又不符合sqlquer ...

  7. co + Generator 写的迭代器 类似 async.whilst

    试着用用Koa,项目里原来有用到async 的whilst 用koa再用async感觉不太舒服,就用Generator+co写了个类似async whist的调用的主体功能,像传参这些没有作到 var ...

  8. unity3d使用脚本保存屏幕截图

    using UnityEngine; using System.Collections; using System.IO; public class FrameAnimation : MonoBeha ...

  9. spring访问静态资源文件

    用 Spring MVC 开发应用程序,对于初学者有一个很头疼的问题,那就是程序数据都已经查询出来了,但界面样式仍然十分丑陋,加载不了 css,js,图片等资源文件.当你在浏览器上直接输入某个css文 ...

  10. 如何正确接收 GitHub 的消息邮件

    背景 我厂的开发流程通常都是基于 GitHub 的.在 GitHub 上 review 代码,也是我日常工作的重要组成部分.对我来说,在 code review 过程中最讨厌的莫过于,我在 pull ...