
CI/CD(持续集成与持续发布)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
CI/CD最主要的价值在于减少重复的过程,例如代码编译、数据库集成、测试、审查、部署及反馈。通过自动化的持续集成可以将这些重复的动作都变成自动化的,无需太多人工干预,让人们的时间更多的投入到动脑筋的、更高价值的事情上。
下面就来介绍DataFoundry团队基于drone进行的CI/CD实践:
一、安装Docker
使用以下命令在Ubuntu上安装最新版本的Docker:
curl -sSL https://get.docker.com | sudo sh
安装过程结束后,可执行下面命令验证安装结果。如果看到输出docker start/running就表示安装成功:
sudo service docker status
Docker安装成功后,创建Docker属组,将当前用户ubuntu加入Docker属组:
sudo groupadd docker
sudo usermod -aG docker ubuntu
二、为drone注册github OAuth
进入github,找到下图对应位置,点击Settings:

进入以下页面,点击OAuth applications:

点击developerapplications中的register a new application,进入以下页面进行drone的配置:

其中,Application name输入drone,Homepage url输入http://ip:port/authorize,Authorization callback url一定要使用http://ip:port/authorize,否则后面drone登录时会报错。
这一步完成后,我们会获得Client ID和ClientSecret,这两项会在drone的启动配置文件中使用到。
三、为drone配置数据库
Drone支持多种数据库,在这里我们使用mysql。我们使用的是aws的RDS。在aws上创建数据库后,得到数据库的连接地址,数据库地址也将在drone的启动配置文件中使用到。
四、创建drone的启动配置文件
在ubunru系统中,使用以下命令创建drone的启动配置文件dronerc:
sudo mkdir /etc/drone
sudo vi dronerc
配置以下内容:
DATABASE_DRIVER=mysql
DATABASE_CONFIG=
REMOTE_DRIVER=github
REMOTE_CONFIG=https://github.com?client_id=${client_id}&client_secret=${client_secret}
将client_id与client_secret替换为前面步骤中获取到的值。这里要注意,数据库配置中一定不能使用引号,否则会报错。
五、启动drone
我们是以容器的方式来启动drone,使用以下命令:
sudo docker run \
--volume /var/lib/drone:/var/lib/drone \
--volume /var/run/docker.sock:/var/run/docker.sock \
--env-file /etc/drone/dronerc \
--restart=always \
--publish=80:8000 \
--detach=true \
--name=drone \
drone/drone:0.4.2
目前,drone的最新稳定版本为0.4.2,/etc/drone/dronerc为上一步中的启动配置文件,这里我们要挂载宿主机的/var/run/docker.sock文件。
启动后,使用docker logs <container-id>查看日志,正确的日志输出应当如下所示:

六、登录drone,enable 要进行CI/CD的项目:
登录http://ip:port,点击login进行登录,在此过程中,drone会根据github中配置的OAuth将项目显示在available repositories中:

选中要进行CI/CD的项目,点击activate now,项目会显示在active repositories中,同时,drone会自动为activate的项目加上webhook,通过这个webhook,每一次代码变更,drone都会拉取改动分支的代码进行持续集成。
七、为项目配置drone.yml文件
drone.yml文件用来定义整个CI/CD过程,drone通过寻找项目中的drone.yml来自动执行CI/CD。以下为我们某个项目的drone.yml文件:
compose:
database:
image: registry.dataos.io/library/mysql
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=1234
build:
image: golang
branch: develop
environment:
- MYSQL_PORT_3306_TCP_ADDR=127.0.0.1
- MYSQL_PORT_3306_TCP_PORT=3306
- MYSQL_ENV_MYSQL_DATABASE=test
- MYSQL_ENV_MYSQL_USER=root
- MYSQL_ENV_MYSQL_PASSWORD=1234
- MYSQL_CONFIG_DONT_UPGRADE_TABLES=yes
commands:
- mkdir -p /drone/src/github.com/asiainfoLDP
- cp -R /drone/src/github.com/cherry4477/datahub_subscriptions /drone/src/github.com/asiainfoLDP/
- export GOPATH=/drone
- go get github.com/tools/godep
- cd /drone/src/github.com/asiainfoLDP/datahub_subscriptions
- $GOPATH/bin/godep restore
- _db/initdb_v1.0.sh
- go test -v -cover ./....
- go build
publish:
docker:
environment:
- DOCKER_LAUNCH_DEBUG=true
registry: registry.dataos.io
#mirror: registry.dataos.io
#image_name: registry.dataos.io/datahubdevelop/sub
repo: datahubdevelop/sub
username: username
password: password
email: mengjing@asiainfo.com
#file: Dockerfile
Tag: $$COMMIT
when:
branch: develop
event: push
deploy:
ssh:
host: hostip
user: mengjing
port: 22
commands:
- ssh dev.dataos.io
- oc login host --username=username --password=password
Drone所有的插件都以docker形式运行,例如克隆代码会拉取drone-git插件的镜像,然后启动git容器,在容器中执行克隆代码的操作。以上配置中,每部分都涉及到drone的插件,所以在执行每部分的时候都会去拉取相应的镜像,启动相应的容器执行我们定义的步骤。
Compose部分使用了我们自定义的镜像来启动测试需要连接的数据库,此时,drone为自动起一个mysql容器,这里需要提到的一点是:所有配置文件中定义的容器都将被启动在同一个namespace下,这意味着所有容器将共用同一个网络空间,所以以上配置中为应用传递数据库连接信息时,host是可以直接使用127.0.0.1的。
Publish部分,我们将构建出来的镜像推送到我们的私有仓库上,deploy部分可以使用ssh插件登录到任意主机上进行部署。在CI/CD结束后,所有进行测试的容器都将被销毁,我们的ci服务器上只有drone服务器这个容器而已。在页面或者通过docker logs –f <drone容器id>查看执行日志。
至此,self-hosted drone CI/CD服务器搭建完毕,后续我们还会推出drone的k8s插件的使用,敬请期待!


