简介
用了很多ci的工具,比如jenkins,gitlabci等,最终发现,适合自己的只有drone,这篇博客不是介绍drone有多少的好用,只是介绍如何去搭建drone
drone的介绍
drone 他和大部分的ci工具一样分为server端和agent端或者说runner端,所以搭建它也分为搭建server端和agent端,但是有一个不好的地方就是,你在server端是看不到我这个server连接了几个agent,但是这个不是什么问题,因为drone会给你找到最合适的agent去编译,你只需要在.drone.yml
文件中定义就好了
drone目前支持以下git平台
- github
- gitlab
- gogs
- gitea
- bitbucket cloud
- bitbucket server
如果你使用比如码云,那你可以考虑不要使用drone了
每个平台搭建的时候只有定义的环境变量有些不同,其他都是差不多的,下面我介绍的是在gitlab下,因为我个人使用的是gitlab
搭建drone server之前的准备
drone和jenkins不一样的是,drone和gitlab,github是无缝集成的,所以在搭建之前第一步需要你在gitlab上创建一个OAuth应用,这样drone才可以通过OAuth接口获取用户在gitlab上的所有信息,但是这样的方式也会造成一个问题,就是如果公司内部其他人的项目,不能给这个账号授权的项目就要重新搭建一个server了,好在小公司没有这样的问题存在
gitlab创建oauth应用的方式很简单,直接登录点击设置然后点击application,输入名字并且赋予权限点击保存应用就好了
要注意的是Redirect URI这里一定要写drone的url加/login
,比如下面
https://drone.example.cn/login
创建完成之后会有Application ID
和Secret
这两个东西之后的docker-compose.yaml需要这两个参数
生成共享秘钥
这个共享秘钥其实可以是任何值,用来验证drone server和runner之间的通信,如果你不知道创建什么值的话可以使用下面的方式
openssl rand -hex 16
编写compose文件
首先给大家看下我的compose文件,仅做参考
https://github.com/bboysoulcn/awesome-dockercompose/blob/master/drone/drone/docker-compose.yaml
version: "3"
services:
drone:
image: "drone/drone:1.6.5"
container_name: "drone-server"
restart: "always"
volumes:
- "/etc/localtime:/etc/localtime"
- "drone-data:/data"
ports:
- "80:80"
environment:
- "DRONE_AGENTS_ENABLED=true"
- "DRONE_GITLAB_SERVER=https://gitlab.example.cn"
- "DRONE_GITLAB_CLIENT_ID=client_id"
- "DRONE_GITLAB_CLIENT_SECRET=client_secret"
- "DRONE_RPC_SECRET=secret"
- "DRONE_SERVER_HOST=drone.example.cn"
- "DRONE_SERVER_PROTO=https"
volumes:
drone-data:
大部分东西都不用修改,只要修改environment中对应的参数就好了
- DRONE_GITLAB_CLIENT_ID gitlab的client_id
- DRONE_GITLAB_CLIENT_SECRET gitlab的client_secret
- DRONE_GITLAB_SERVER gitlab服务器地址
- DRONE_RPC_SECRET 这个填写我们刚才生成的预共享秘钥
- DRONE_SERVER_HOST 你drone对外的地址
- DRONE_SERVER_PROTO drone对外地址的的协议
DRONE_SERVER_HOST 和 DRONE_SERVER_PROTO 这两个参数当你在drone中点击active的时候drone会合并添加到gitlab项目webhook中,所以如果你项目提交了,但并没有触发drone的自动构建,你可以看看是不是因为这两个参数的原因,比如使用的是https的,但是上面写成了http导致添加到项目的webhook地址为http://drone.example.cn/hook
然后就不触发构建了
编写完成之后使用docker-compose启动就好了
安装runner
runner的安装也很简单,直接上compose文件
https://github.com/bboysoulcn/awesome-dockercompose/blob/master/drone/runner/docker-compose.yaml
version: "3"
services:
runner:
image: "drone/drone-agent:1.6.2"
container_name: "drone-runner"
restart: "always"
volumes:
- "/etc/localtime:/etc/localtime"
- "/var/run/docker.sock:/var/run/docker.sock"
ports:
- "3000:3000"
environment:
- "DRONE_RPC_PROTO=http"
- "DRONE_RPC_HOST=drone_drone"
- "DRONE_RPC_SECRET=secret"
- "DRONE_RUNNER_CAPACITY=2"
- "DRONE_RUNNER_NAME=drone-agent-4"
和server一样,只需要动environment的变量就好了
- DRONE_RPC_PROTO drone server 的协议http或者https
- DRONE_RPC_HOST drone server的域名或者ip
- DRONE_RPC_SECRET 之前说过的共享秘钥和server的要一样
- DRONE_RUNNER_CAPACITY 运行的最大pipeline
- DRONE_RUNNER_NAME 运行的runner的名字
最后说几句
其实其他比如github gogs的drone搭建的方式都是一样的就是environment有几个环境变量不一样,个人觉得和别的ci工具比起来drone是最好使用的,而且也是支持各种插件的相比于jenkins对于容器的支持更好,个人小团队使用是很nice的
欢迎关注我的博客www.bboy.app
Have Fun