一、Drone服务安装
Drone服务分为server和runner,server是drone的服务端,包括web页面等都是server服务里面;runner在官方文档的描述如下:
Drone Runners are standalone daemons that poll the server for pending pipelines to execute. There are different types of runners optimized for different use cases and runtime environments. Once the server is successfully installed you must install one or more runners.
简单描述为:runner是独立于server的守护程序,用于轮询server以执行挂起的管道(drone执行ci/cd的基本单位是pipline),根据不同的运行的环境不同有对应的runner实例类型。在安装上server程序后,drone服务就算启动成功了,但是还没有办法执行ci/cd操作,只有安装了runner后,由runner负责执行。runner可以有一个或者多个。下面开始安装:
1、在GitHub上创建一个OAuth项目
地址:
https://github.com/settings/applications/new
填写内容如:
提交后记录下生成的client ID和client Secret
2、安装drone-server
docker run -v /var/lib/drone:/data:z -e DRONE_GITHUB_CLIENT_ID="*****" -e DRONE_GITHUB_CLIENT_SECRET="*****" -e DRONE_RPC_SECRET="*****" -e DRONE_SERVER_HOST="drone.renqzh.com" -e DRONE_SERVER_PROTO="http" -p 3080:80 --restart=always --detach=true --name=drone-server drone/drone:1
将DRONE_GITHUB_CLIENT_ID替换为之前记下的client ID,DRONE_GITHUB_CLIENT_SECRET替换为client Secret,DRONE_RPC_SECRET替换为drone server和runner之间的密码,可以随便设置,也可以使用以下命令生成一个:
openssl rand -hex 16
DRONE_SERVER_HOST为server端的地址,DRONE_SERVER_PROTO为server端的协议类型
3、安装runner
runner在不同的运行环境下有不同的类型,我们采用的是docker,并在Linux下运行,可以使用下面的命令直接启动(其他类型请移步官方文档):
docker run -d -v /var/run/docker.sock:/var/run/docker.sock:z -e DRONE_RPC_PROTO=http -e DRONE_RPC_HOST=drone.renqzh.com -e DRONE_RPC_SECRET=*** -e DRONE_RUNNER_CAPACITY=2 -e DRONE_RUNNER_NAME=${HOSTNAME} -p 3000:3000 --restart=always --privileged --name=drone-runner drone/drone-runner-docker
DRONE_RPC_PROTO为drone server的网络协议类型,可选为http和https,如果选择https,还需配置ssl证书等内容,我个人测试环境使用,没有必要上https,所以这里选的是http,DRONE_RPC_HOST为drone server的地址,DRONE_RPC_SECRET为之前在server中设置的密码。
DRONE_RUNNER_CAPACITY为runner的实例个数。
4、检查是否启动成功
$ docker logs runner
INFO[0000] starting the server
INFO[0000] successfully pinged the remote server
查看runner容器日志并出现相似的日志即为启动成功。
5、登录
访问drone server的地址,出现web页面,输入GitHub的账号密码,即可登录成功,此账号即为管理员账户,之后导入项目即可。
2、使用Drone服务
使用Drone服务通过在项目的根目录编写.drone.yml文件,并推送到GitHub以触发更新。.drone.yml实例如下:
kind: pipeline
name: default
type: docker
steps:
- name: notify_start
image: lddsb/drone-dingtalk-message
settings:
token: ***
type: markdown
tips_title: 触发构建通知
tpl: https://renercc.github.io/static/drone/dingtalk-notify-start.tpl
- name: gradle_build
image: gradle
volumes:
- name: gradle_home
path: /home/gradle/.gradle
privileged: true
commands:
- gradle build
- name: docker_build
image: plugins/docker
settings:
registry: registry.cn-shanghai.aliyuncs.com
username: ***
password: ***
repo: registry.cn-shanghai.aliyuncs.com/rener/halo
auto_tag: true
volumes:
- name: docker
path: /var/run/docker.sock
- name: docker_conf
path: /root/.docker
privileged: true
- name: deploy
image: appleboy/drone-ssh
settings:
host: renqzh.com
username: ci
password: ***
port: 22
script:
- docker pull registry.cn-shanghai.aliyuncs.com/rener/halo
- docker tag registry.cn-shanghai.aliyuncs.com/rener/halo drone/halo:latest
- docker run --name halo --privileged -d -p8085:8090 -v /www/halo:/root/halo -v /www/halo-dev:/root/halo-dev drone/halo
- name: notify_end
image: lddsb/drone-dingtalk-message
settings:
token: ***
type: markdown
tips_title: 构建结果通知
tpl: https://renercc.github.io/static/drone/dingtalk-notify-end.tpl
when:
status:
- success
- failure
volumes:
- name: gradle_home
host:
path: /root/.gradle
- name: docker
host:
path: /var/run/docker.sock
- name: docker_conf
host:
path: /root/.docker
此实例会通过5步完成自动部署,第一步由钉钉机器人发构建开始通知到钉钉群;第二步gradle编译为jar包;第三步构建docker镜像并推送到docker仓库;第四步拉去最新项目镜像,并启动最新的容器停止旧容器;第五步发送完成通知。Drone很强大,所以.drone.yml的具体文件格式和内容很多,在此一言难尽,请移步官网详细阅读:https://docs.drone.io/
总结
本文简单写了使用Github+Drone+Docker实现CI/CD的基本流程,通过此步骤可以实现简单的CI/CD,仅作为入门使用。我在阅读官方文档前,读了多篇相关博客,并按照他们的步骤操作,但全都失败了,可能是那些博客中用的版本太低吧,并且对drone的工作流程和原理几乎完全没懂,所以详细读了文档,然后事情就变得简单多了。所以,若需要更强大的功能或与本文使用的环境不同,建议详细阅读官方文档后再着手搭建。甚至需求和本文的完全一致,也建议先读一下文档,必定会收到更好的效果。