一直以来对于项目的部署管理我都是采用Jenkins,但其实我使用到的也只是它接收webhook的功能,然后触发对应的项目预设shell脚本来运行部署,这就显得有些杀鸡用牛刀(实际大部分公司的部署流程应该也差不多),就在最近突然心血来潮,想尝试下不同的集成构建方案,在简单调研后选择了Drone,其轻量、高颜值的特点立刻吸引了我,话不多说马上开搞,嗳~ 就是玩~
我目前的构建方案是:Github + Drone + Docker ( docker安装 )
先来看看修改前后服务器内存占用对比
使用Jenkins时:
这是停掉Jenkins,启用Drone时:
可以看到内存占用直接下降了一半,感觉轻量到可以飞起来~
体积上更是两个维度:
如果要说Drone有什么缺点的话,就是官方文档过于简单吧,有什么问题也比较难找到文章,导致折腾了不少时间。
0. 配置Github
这是使用Github作为代码托管的前置工作,首先登陆你的github账户,在右上角点击个人头像,选择Setting
,选择Developer settings
,选择OAuth Application
,选择新建一个application:
创建成功以后,拿到Client ID
和Client Secret
,拿小本本记下来。
- 这里需要注意的是 callback URL 需要填写你的Drone的登录地址,具体为drone主页链接后面加上
/login
1. 安装Drone
使用docker安装drone,drone需要创建两个容器,一个提供视图界面的webService端,另一个是执行任务的runner端,这里先安装web端。
注:运行时去掉#号后面的说明
docker run \
--volume=/var/drone:/data \ # 备注:1
--env=DRONE_GITHUB_CLIENT_ID= \ # 备注:2
--env=DRONE_GITHUB_CLIENT_SECRET= \ # 备注:2
--env=DRONE_RPC_SECRET= \ # 备注:2
--env=DRONE_SERVER_HOST= xxx.com \ #备注:3
--env=DRONE_SERVER_PROTO=http \ #备注:4
--env=DRONE_USER_CREATE=username:name,admin:true \ #备注:5
--publish=10086:80 \ #备注:6
--publish=10087:443 \ #备注:6
--restart=always \
--detach=true \
--name=drone \
drone/drone:latest
- drone与宿主机的目录映射,其中可将/var/drone换成你宿主机自定义的目录
- 填写上一步的
Client ID
和Client Secret
,RPC_SECRET和下面runner保持一致就行,为了方便我们可以直接填Client Secret
,你也可以在任意终端运行openssl rand -hex 16
自己生成秘钥。 - 你的drone域名,没有则填
IP:端口
- 没特殊情况推荐设置http
- 设置admin账户(必须),将
name
改成你的github账户名称 - 映射主机的端口号(我这里占用宿主机10086端口,使用drone容器中的80端口),对外的10086端口设置为你自定义端口,记得确认已配置白名单,不是https协议可以不配443
1.1 配置nginx
贴一份nginx的配置,这里主要映射了目录到宿主机/data/nginx
的位置,方便修改配置,提前配置好上一步用到的域名,如果需要的话。
docker run -d \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/cert:/etc/nginx/cert \
-v /data/docker_home:/home \
--net host \
--name nginx \
nginx
2. 安装runner
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=xxx.com \ # 备注:1
-e DRONE_RPC_SECRET=xxx \ # 备注:2
-e DRONE_RUNNER_CAPACITY=2 \ # 备注:3
-e DRONE_RUNNER_NAME=runner\
-e TZ="Asia/GuangZhou" \
-p 10088:3000 \
--restart always \
--name drone-runner \
drone/drone-runner-docker:latest
- 填写drone域名,或IP:端口
- 同上一步drone容器配置的的RPC_SECRET一致,如果不是自己生成的那就是填
Client Secret
值 - 最多同时执行任务数
3. 登录
打开配置好的网址,登录时会调起Github登录,登录你的Github账户即可。
点击右上角可同步你的仓库,会看到你所有的项目
点进你需要进行管理的项目(可以往github创建一个仓库测试),点击激活即可:
激活仓库之后可以进行一些配置,基本按如下即可,Trusted
选项为管理员才可设置:
激活仓库时Drone会往仓库发送一条activie通知,此时对应仓库会设置进一个当前的webhook
记录,不用手动去配置,非常方便。
4. 自动触发构建
接下来往测试仓库提交一条commit记录测试下
- 直接前往Github创建一个仓库
d_test
,进入Drone,点击右上角同步仓库,搜索d_test
,点击Active
按钮激活。 - 往
d_test
仓库根目录创建新文件.drone.yml
:
kind: pipeline
type: docker
name: default
clone:
disable: true
steps:
- name: 编译步骤
image: alpine
commands:
- echo hello drone
简单解释下上面的配置,首先这个文件目录与名称是可以自定义配置的,在Drone项目管理的Setting里:
配置文件注意缩进,type: docker
是我们后面最主要使用的构建方式,你或许已经看出来了step里可以配置多个步骤,每个步骤都会拉取一份docker镜像使用一个临时的容器来运行,结束后立即销毁。
clone
哪一行配置是将drone默认的clone步骤关闭了,由于网络问题clone仓库代码会比较耗时,后面会详细讲解实例如何自己编写一个clone操作。
- 回到Drone的项目管理,看到构建已经自动触发了:
而这时候这个项目也成为了活跃项目可以被筛选
至此Drone已经顺利跑起来了。
更多关于yml配置的编写在下一篇文章中会提到。
后记: 一个坑点
在Github配置Apps的时候,关注下这个地方的设置,有个token过期的机制最好退出一下,不然8小时后webhook就会失效,只能重新登录drone才会正常。
补充: 码云Gitee
drone从v2.7.2
版本开始支持gitee 官网文档,部署方式和Github差不多,可以直接参考官网文档来配置,流程就是在Gitee创建第三方应用,获取Id和Key,记录下来,然后参照上面的流程即可。
如果配置Admin账户那一步不清楚用户名的话,点击码云的个人中心,看浏览器URL链接,/
后面的就是你的用户名。
成功后登录时是这样的:
如果遇到仓库404问题,检查仓库名称与路径两者是否一致,采用驼峰写法它会"自作聪明"地给你把链接拆成带'-'的形式,这样drone识别仓库就会404了。
后面的就不用多说了,和Github是一样的。看了下Gitee做了个自动化推送Github的功能,可以同步两边的仓库,不过看起来以后要收费的样子,如果稳定免费的话那码云就非常业界良心了,我们也能从此摆脱Github时不时就失灵的困境,观望观望吧。
最近两天服务器连接Github直接504,我也把drone的仓库换成码云了。