docker + rancher + jenkins 实现集成测试和自动部署(CI/CD)

阅读6227评论5

docker jenkins rancher docker的火热程度相信不用说了, 只要你漫步在互联网上, 总是能看到docker的身影, 以致于你一天不去了解它, 都会感觉在你的世界里有一块未知地带, 做为立志做全栈的你, 岂能容忍!

基础知识及相关网站链接:

docker 的安装非常简单, mac os最新的安装方式是Docker for Mac,Docker Toolbox方式已经过时了. 国内下载docker官方镜像的速度比较慢, 可以使用阿里云或daocloud添加加速器, 登录阿里云或daocloud控制台可以查看自己的专属加速器地址.
Mac OS添加到Preferences->Advanced->Registory.
linux通过修改 /etc/default/docker文件添加一行

DOCKER_OPTS="--registry-mirror='专属加速器地址'"

一, 使用rancher管理docker

rancher是一个容器管理和服务编排工具, 有中文界面, 它最大的优点是可以跨云主机管理, 通过rancher-server和rancher-agent保持连接, 主机之间可以相互通信, 阿里云的容器服务也可以实现自动部署, 但是只能在阿里云. 另外国内一些商业容器服务, 如有容云它是基础于rancher开发的, daocloud也可以非常方便的管理不同主机的docker容器, 并实现自动部署, 但是是收费的, 可免费试用两个月.
安装方法:

docker run -d --restart=unless-stopped --name=rancher-server -v /opt/rancher/mysql:/var/lib/mysql -p 8080:8080 rancher/server

将/opt/rancher/mysql目录挂载到rancher-server以便将数据保存在本机.rancher/server镜像比较大,安装需要一些时间, 可以通过docker logs -f rancher-server查看是否安装完成.

注意保证mysql目录的权限,chown -R 102:105 /opt/rancher/mysql

安装完成后打开localhost:8080, 切换至中文界面, 将访问控制改为本地验证, 即可添加账号. rancher01 接下来就是添加环境, 添加主机, 添加应用栈, 添加服务, 每一个服务就是启动一个docker容器, 原本需要运行docker 命令来启动容器,都可通过界面填写参数来启动.

rancher-compose
docker 可以通过docker-compose来批量启动容器, rancher也可以借助rancher-compose来启动编排好的服务. 通过rancher web界面右下角下载rancher-compose工具, 然后需要两个文件, docker-compose.yml和rancher-compose.yml

添加环境API Keys和账号Api Keys, rancher-compose启动服务需要环境api keys, 后面实现自动部署需要账号API keys, 而且密钥只显示一次,先记下来后面会用来. rancher02

二, 利用webhooks触发jenkins测试任务

jenkins 分为主/从服务器, 主服务器用来调度, 从服务器来跑相关任务, 当然也可以只用一个主服务器, 我们用rancher-compose来让jenkins在容器中运行. 新建两个文件docker-compose.yml , rancher-compose.yml内容如下.
docker-compose.yml

jenkins-slave-nodejs-6:
  labels:
    io.rancher.container.pull_image: always
    io.rancher.scheduler.affinity:host_label: provider=主机标签
  tty: true
  image: jackhu/jenkins-slave-nodejs:6
  links:
  - redis:redis
  - mongo:mongo
  volumes:
  - /opt/jenkins/jenkins_slave_nodejs_6:/home/jenkins
  stdin_open: true
redis:
  labels:
    io.rancher.scheduler.affinity:host_label: provider=主机标签
  tty: true
  image: redis
  stdin_open: true
jenkins-master:
  ports:
  - 8090:8080/tcp
  labels:
    io.rancher.scheduler.affinity:host_label: provider=主机标签
  tty: true
  image: jackhu/jenkins-master-privileged
  links:
  - jenkins-slave-nodejs-6:nodejs6
  privileged: true
  volumes:
  - /opt/jenkins/jenkins_home:/var/jenkins_home
  - /usr/bin/docker:/usr/bin/docker
  - /var/run/docker.sock:/var/run/docker.sock
  stdin_open: true
mongo:
  labels:
    io.rancher.scheduler.affinity:host_label: provider=主机标签
  tty: true
  image: mongo
  stdin_open: true

rancher-compose.yml

jenkins-slave-nodejs-6:
  scale: 1
  retain_ip: true
redis:
  scale: 1
jenkins-master:
  scale: 1
mongo:
  scale: 1

注意jenkins-master的时间不正确可挂载本机的文件如:

  - /etc/localtime:/etc/localtime
  - /etc/timezone:/etc/timezone

上面jenkins-master 挂载了本机的docker文件, 这样才能在jenkins-master中使用docker命令, 而jenkins的数据文件保存在本机的/opt/jenkins/jenkins_home中, 注意保持此目录有jenkins用户的权限.如果在jenkins不能调用docker,查看/var/run/docker.sock文件jenkins用户是否有权限. chown -R 1000 /var/run/docker.sock

启动jenkins服务

rancher-compose --url http://RANCHER_HOST:RANCHER_PORT/v1/ --access-key RANCHER_API_KEY --secret-key RANCHER_API_KEY_SECRET --project-name jenkins --verbose up

稍等片刻,启动成功, 打开localhost:8090既可进入jenkins界面. 第一次启动将提示安装插件和添加管理员用户, 中文界面, 在系统管理->Configure Global Security中配置好访问控制权限, 后面添加webhooks需要有权限的用户Token. jenkins01

添加一个任务jenkins-demo-deploy-01,选择<构建一个自由风格的软件项目>,以https://github.com/jackhutu/jenkins-demo.git为例.如何触发自动构建项目, 配置如下: jenkins002
触发构建这里填上自己定义的token, 然后在github项目settings中webhooks项, 点击添加webhooks, Payload URL如下:

https://jenkins用户名:jenkins用户token@jenkinsServerURL/job/jenkins-demo-test-nodejs6/build?token=自定义的token

默认是仅push时触发. 这样当每次向github仓库push代码时这个jenkins任务就会触发.在jenkins任务构建这一栏可以执行相关测试任务, jenkins003 每次测试失败可邮件通知, 前提是安装邮件通知插件, 配置好邮箱账号.

三, 利用rancher api实现自动部署

上面是每次push时自动测试, 如果你想每次push后测试完成就自动部署, 可以在Execute Shell里接着添加部署命令,

docker login -u xxx -p xxx
docker build -t images_url $WORKSPACE
docker push images_url

上面代码将根据项目目录下的Dockerfile文件, 来构建一个镜像, 并推送到镜像仓库, 镜像仓库你可以自己搭建也可以用官方的,或者阿里云的.都是免费的.

然后添加另一个任务,在这次任务成功之后运行.如, 新建一个任务jenkins-demo-deploy-02, 在上一个任务jenkins-demo-deploy-01之后执行: jenkins004 执行代码如下:

jenkins005
通过上面的账号API Key调用rancher server api 来实现服务的自己升级, 这样就实现全自动测试部署. rancher升级如果失败,还可以回滚, 而且可以在不中断当前服务无缝升级.

5条评论添加新评论
pigchildepigchilde2016.10.25 11:25

dafasfasdf

pigchilde@pigchilde 55245646

JackJack2017.7.11 14:35

没毛病. 走起.

a willing hearta willing heart2017.7.12 9:21

aa

jiangliehujiangliehu2018.3.26 6:55

的萨芬

jiangliehujiangliehu2018.3.26 6:55

的萨芬的萨芬