Drone是一个现代化的持续集成和持续交付平台,使繁忙的团队能够自动化他们的构建、测试和发布工作流。
上面是官方对Drone的定义,和我们在工作过程中用的Jenkins一样,这是一款开源的CI/CD软件。不过Drone是基于Docker的,这一点也许是它的一大优势,它的所有编译和测试流程都在Docker容器中执行,与Jenkins相比它安装方便配置简单,此外也很容易集成到我们应用中。
在大概了解一番后,我想着试用下看看,于是在网上搜了下,不过发现资料不是很多,而且比较坑的是搜到的文章中部署使用方法和官网描述的不太一致,这一点在具体过程中再细说。没有办法,只能完全参考官网的教程了,以下是具体的过程:
我用的是阿里云的ECS,装有CentOS7系统,并且已经安装了Docker。
Drone支持集成很多代码托管平台,包括GitHub、GitLab、Gitea等,以下以GitHub为例:
第一步:准备
创建一个GitHub的OAuth认证应用
这一步主要是为了获取客户端ID和客户端秘钥,Drone服务在启动时候需要指定这两个参数,后续才有权限从GitHub拉取代码等一系列操作:
创建一个可共享秘钥
通过openssl
命令创建(这一步感觉可以省略,后面会设置Drone服务为”http”方式):1
2$ openssl rand -hex 16
bea26a2221fd8090ea38720fc445eca6
第二步:下载镜像
我们上面说到了Drone是基于Docker的,Drone服务也是如此:1
docker pull drone/drone
官网上指定了版本”1”,这里我们默认使用”latest”。
第三步:配置
- DRONE_GITHUB_CLIENT_ID,第一步中获取到的客户端ID
- DRONE_GITHUB_CLIENT_SECRET,第一步中获取到的客户端秘钥
- DRONE_RPC_SECRET,第一步中openssl命令创建的共享秘钥
- DRONE_SERVER_HOST,Drone服务所在主机域名或者公网IP
- DRONE_SERVER_PROTO,Drone服务协议,可选”http”和”https”
第四步:启动服务
以下是完整的Drone服务运行参数:1
2
3
4
5
6
7
8
9
10
11
12
13
14docker pull drone/drone
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITHUB_CLIENT_ID=XXX \
--env=DRONE_GITHUB_CLIENT_SECRET=XXX \
--env=DRONE_RPC_SECRET=bea26a2221fd8090ea38720fc445eca6 \
--env=DRONE_SERVER_HOST=47.104.243.84:9001 \
--env=DRONE_SERVER_PROTO=http \
--publish=9001:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone
映射端口根据实际需要进行调整,执行完该命令后,Drone服务已经运行起来了,我们可以在浏览器中打开http://47.104.243.84:9001
,会出现GitHub授权登陆界面:
用GitHub授权成功后,可以进入到服务管理页面。
服务启动成功之后我就迫不及待的去GitHub上建了个用来测试的项目”drone-demo”,不用具体的实现就放一个README.md就可以了,并且按照官网文档在项目根目录增加了一个配置文件.drone.yml
:1
2
3
4
5
6
7
8
9
10
11
12
13
14kind: pipeline
type: exec
name: default
platform:
os: linux
arch: 386
steps:
- name: build
commands:
- pwd
- ls -la
trigger:
branch:
- master
回到服务管理页面点击”SYNC”,发现”drone-demo”已经在列表中了,我们在列表中点击对应的”ACTIVATE”链接激活该项目,这样才会触发Drone的构建操作。随便更改drone-demo中的代码然后提交上传,再回到管理页面发现已经触发了构建但问题是一直卡在那里不动了:
在网上搜了下,发现基本上都说需要安装drone-agent
,而且使用docker-compose一次性安装服务和代理,看起来挺靠谱的,但问题是官网上没有代理的相关描述!不管怎么样,我们还是能看出来是缺少了什么导致的,再回到官网细看才发现还需要安装执行器”Runner”,而执行器分为以下几种:
- Docker Runner,在相关的docker容器中执行构建步骤,比如我们可以根据需要在不同版本的node容器中执行构建
- Kubernetes Runner
- Exec Runner,这个执行器比较特殊,本次就是使用的这个执行器,其他的几个执行器都是可以通过docker容器形式提供服务,这个是以原生的服务提供,具体安装过程和参数配置这里不细说了,官网上已经很详细了,可以参考官网:在Linux安装Exec执行器
- SSH Runner
- Digital Ocean Runner
安装并成功启动exec执行器之后,我们发现原先的构建已经成功了:
过程也还算顺利,比当初我在使用Jenkins的时候容易多了。如果安装其他的执行器的话可以使用docker-compose,这样服务和执行器可以一起安装比较方便,这里提供一个docker-compose的配置文件以供参考(只包含Drone服务,根据需要自行添加执行器的相关配置):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16version: '3'
services:
drone-server:
image: drone/drone
ports:
- 9001:80
container_name: drone
volumes:
- /var/lib/drone:/data
restart: always
environment:
- DRONE_GITHUB_CLIENT_ID=XXX
- DRONE_GITHUB_CLIENT_SECRET=XXX
- DRONE_RPC_SECRET=cf51230bedda724d772507cb7140596f
- DRONE_SERVER_HOST=47.104.243.84:9001
- DRONE_SERVER_PROTO=http
我现在还只是停留在试用阶段,Drone的很多功能还有待进一步探索,有兴趣的朋友也可以自己试用一下。
参考资料: