基于Docker 与 DaoCloud 创建简单够用的持续集成环境

[编者的话] 当文字偶遇代码,当程序插上了翅膀,让分享成为我们彼此沟通的语言。我们期待可以构建这样一个平台让开发者们看到你们的智慧,挖掘你们的才华,让彼此在开源的路上不再孤独。“DaoCloud分享写作计划”已全面启动,欢迎投稿。


作者:叶挺


本次持续集成环境主要构成

  1. 代码版本库 coding.net
  2. CI服务 DaoCloud
  3. CI运行器 DaoCloud

搭建过程中的主要步骤

  1. 在coding.net上添加代码库
  2. 申请DaoCloud自有主机服务
  3. 安装docker
  4. 搭建基础 docker image
  5. 把代码库添加到DaoCloud生成项目
  6. 编写daocloud.yml
  7. 发布镜像
  8. 完成一个简单够用的持续集成环境

以下为详细步骤:

1. 在coding.net上添加代码库

这步不是重点,我只是随便选了一个daocloud支持的代码源。

目前(2015-06-14)DaoCloud支持的代码源是:

  1. Github
  2. Bitbucker
  3. Coding
  4. GitCafe

期间有个小插曲刚注册coding在激活用户的时候出现一个Bug。 Bug真的是无处不在。

2. 申请 DaoCloud 自有主机服务

DaoCloud自有主机官方介绍:DaoCloud邀请您体验全新混合式容器主机管理服务

3. 安装Docker

完成申请之后自由主机申请之后请安装主机监控程序,需要登录以及具有自有主机服务的权限才能进入上面链接。

安装主机监控程序的命令如下

curl -sSL https://get.daocloud.io/docker | sh // 安装docker

curl -sSL https://get.daocloud.io/daomonit/install.sh | sh -s XXXXXXXX //这是自有主机的标识,系统随机生成

sudo service docker restart  

完成上面步骤之后我们就能在Daocloud/我的主机 看到我们已经链接上的主机信息 包含主机ipCPU使用率内存使用率磁盘使用率主机上的容器

主机上的容器这个功能真的是太吊了,至于多么吊,大家自己试试看就知道了。所有信息一目了然,有木有!

4. 搭建基础docker image

DaoCloud 提供了一些基础镜像用于搭建测试环境,貌似他们的提供的环境不是我想要的额,所以很多时候就要我们自己去DIY这个基础的运行镜像。自己DIY还是有蛮多好处的:

  1. 每次下的库就那么几个测试用的第三方库就固定那么几个,每次都要下,先不说其他,下载库的时间要等吧?做个基础镜像,也帮DaoCloud省省带宽,重点是我们自己的程序在构建的时间跑的快。不然每次都要等个10+分钟,对于我这种性子急得人真是要命。
  2. 自己做的镜像里面有啥玩意自己都知道,能hold住。有坑自己也能填上。
  3. 酷,自己搭的镜像逼格比用别人搭的高。

由于我的代码环境是PHP,我这里就拿PHP来举例子,来构建PHP运行及测试环境。

No Code No BB,直接上 Dockerfile:

FROM php:5.6-apache  
MAINTAINER YeTing <me@yeting.info>

#Download Require
RUN apt-get update && apt-get install -y libmcrypt-dev libz-dev git wget \  
    && docker-php-ext-install mcrypt mbstring zip \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 

ENV PATH=$PATH:~/.composer/vendor/bin

RUN composer global require "phpunit/phpunit=~4.0" "phpspec/phpspec=~2.1" "laravel/envoy=~1.0" && a2enmod rewrite  

这个dockerfile很简单

  • 武林秘籍第一式:找一个靠谱的镜像
FROM php:5.6-apache  
MAINTAINER YeTing <me@yeting.info>  

https://registry.hub.docker.com/ 上面有很多官方的镜像,我自己DIY的镜像就是基于官方php:5.6-apache镜像来做的。

个人镜像多多少少会有一些坑等着我们去踏,我们还是踏踏实实的根据我们的需求自己写一个Dockerfile。不过别人写的都可以借(chao)鉴(xi)。

  • 武林秘籍第二式:精确定位
RUN apt-get update && apt-get install -y libmcrypt-dev libz-dev git wget \  
    && docker-php-ext-install mcrypt mbstring zip \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 

要啥就下啥,知道我们每次下载的东西是拿来干什么的,不然为什么要下呢。 docker-php-ext-install是官方镜像中提供的一个配置PHP环境的方法,所以文档我们还是要多看看的。不然好东西都发现不了。composer是一个PHP的包管理工具,类似于node与npm的关系。

  • 武林秘籍第三式:欲练此功,必先利其器
ENV PATH=$PATH:~/.composer/vendor/bin

RUN composer global require "phpunit/phpunit=~4.0" "phpspec/phpspec=~2.1" "laravel/envoy=~1.0" && a2enmod rewrite  

前人的经验真是数不胜数,前人创造的工具我们也好好好利用。phpunit phpspec 是PHP上的测试工具。envoy一个简易的部署工具,我们在后面的部署会用到。a2enmod rewriteapache开启url重写模块。

基础镜像终于好了,我们的测试,部署可都是要靠它了。

5. 新建DaoCloud项目

起项目名,绑定项目代码源,一个项目就建好了。还是很简单的。

首次生成项目的时候会默认拉取master分支,构建一个master-init的镜像(当然项目中是要包含Dockerfile),只要构建成功,我们就能把这个镜像部署到我们自己的主机上。这个部署可比我上一篇 基于docker 与 gitlab CI 做一个简单够用的持续集成环境中的部署,简单好多,轻轻一点就行。构建是在DaoCloud服务器上做的,据说他们还备好了梯子给我们拉第三方库的时候好翻墙。

记得在部署的时候选择关联到自己的主机,不然默认会部署在DaoCloud提供的主机上。DaoCloud提供的主机也还不错,就是访问速度慢了点,胜在不用钱的。不过我们都自己搭了主机,当然还是部署到我们自己的主机上是最妥的。

我们可以开启自动发布功能,每当有镜像构建成功,DaoCloud就会帮我们自动发布。

6. 编写daocloud.yml

在DaoCloud代码测试需要用到DaoCloud。所以我们要先来看看官方的介绍:

看完了之后,发现还是格式蛮简单的,例子好长,都快看不下去了。就一个重点

How it works

  1. 设置环境变量
  2. 执行install脚本
  3. 克隆源代码,切换对应的commit
  4. 执行before_script脚本
  5. 执行script脚本

做好前期准备,我们就来写自己项目的daocloud.yml

image: yeting/laravel-prebuild-docker // 我们的基础镜像

env:  
    - MYENV = "hello" // 纯粹为了测试代码执行

install:  
    - echo $MYENV

before_script: //执行测试前的准备  
    - composer config -g github-oauth.github.com XXXX 
// 个人的github token 这个有一个github上面的坑,限制了非认证用户下载dist包的次数,60次/小时。这个限制很容易就超了,超了之后下的库超慢
    - composer install
// composer依赖包安装 composer是php上的包管理工具类似于npm与node的关系

script: // 执行测试  
    - phpunit //php单元测试

写了daocloud.yml,DaoCloud会在你每次的代码push的时候,进行测试。

不过有点略坑的是,每次测试通过的时候,他不会帮你自动build,需要自己build。就这一点,联系DaoCloud工作人员。他们说,并不是每一次代码的push都需要build成镜像的,如果需要build,需要在该代码版本上打一个tag,这样DaoCloud才会把代码build成镜像。这样也能解决我们自动build的需求,也还行。

7. 发布镜像

部署的时候就点击打包好的镜像,发布到我们自己的主机上,就可以了,这点真的很赞,好方便。DaoCloud还帮你存了好多个镜像,供你随时切换着版本部署,想想他们也不容易啊。


总结

一个简单够用的持续集成环境,就这样完成了,真不敢相信,是不是很简单?太酷了。

DaoCloud真的的是一个贴心的开发者伙伴。希望他们在未来的路上走的更远。

Docker是一项好技术,但是我们要以正式的姿势去使用它。

要做一个能hold住技术的开发者,而不是盲目跟随潮流最求新技术的人。

工具能提高人的效率,而产品的还坏最终还是在于人。

这是我个人的第一个系列的技术博客,希望能与更多的人进行交流。

本篇博客为个人原创,转载请联系 me@yeting.info


本文来自“DaoCloud分享写作计划”,这项计划旨在为开发者提供一个平台,分享使用Docker的心得体会和技术经验。DaoCloud将为文章作者提供一定的物质奖励,具体方式请访问:DaoCloud写作分享计划 ,欢迎Docker爱好者和DaoCloud用户踊跃投稿。