背景
近期在公司内部部署CI/CD平台, 经过比较Jenkins
和Drone
, 基于Drone
的优点最终选择了Drone
.
一开始也尝试使用docker部署Jenkins
, 部署过程中下载插件失败(估计是伟大的墙的原因), 最后直接放弃并尝试部署Drone
.
没想到搜遍全网, 相关资料甚少, 能用的drone版本也很老旧.
随后只能一步步看官方文档进行部署, 但是部署过程中发现官方文档也写得不明不白, 遇到了一堆坑.
最后解决问题, 特此记录下来, 供大家参考.
官方文档是使用docker的方式安装, 网上也有博文说使用docker-compose
安装失败.
这里先做声明: 不管哪种方式其实都是可以的, 我会先使用docker的方式安装一遍, 最后再提供一个docker-compose
文件给大家享用. (我本地是直接使用docker-compose
运行的)
安装Gogs
这里不做说明, 看到这篇文章, 相信大家已经安装好Gogs了, 没有安装的可查找相关博文或看官方文档安装, 这个不难, 也没什么坑(如果使用docker安装, 填写MySQL地址使用外部可访问的网络地址, 建议docker服务设置别名).
安装启动drone
调试阶段建议启动设置detach=false
, 这样可以查看日志输出
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_DEBUG=true\
--env=DRONE_LOGS_TRACE=true\
--env=DRONE_LOGS_DEBUG=true\
--env=DRONE_LOGS_PRETTY=true\
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GIT_ALWAYS_AUTH=true \
--env=DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b \
--env=DRONE_SERVER_HOST=192.168.0.201:10080 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_GOGS_SERVER=http://192.168.0.201:3000 \
--env=DRONE_USER_CREATE=username:admin,admin:true \
--publish=10080:80 \
--publish=10443:443 \
--restart=always \
--detach=false \
--name=drone \
drone/drone:1
环境变量配置说明
DRONE_GOGS_SERVER
: Gogs服务地址(建议填写宿主机地址+端口, 需要http://
开头)DRONE_GIT_ALWAYS_AUTH
: 是否每次都要验证DRONE_RPC_SECRET
: Drone服务密匙(后面安装runner
使用相同的秘钥)DRONE_SERVER_HOST
: Drone服务地址,外部可访问的域名或IP地址(建议填写宿主机地址+端口, 不需要http://
开头)DRONE_SERVER_PROTO
: Drone提供服务的协议类型,可选为http
或https
DRONE_USER_CREATE
: 设置Drone管理员账号(注意设置的是Gogs平台里的账号),Drone
是直接使用Gogs
账号登录的- 其他相关DEBUG参数建议开启
安装Drone-runner
drone-runner
分几种, 每一种是不一样的, 但是可同时存在.
drone-runner
是执行pipeline
的服务, 对应编写.drone.yml
的type
.
如果你只安装了drone-runner-ssh, 然后你type使用docker, 那是运行不了的
注意:这里很坑, 官方文档没有说明, 当时卡了我两天
kind: pipeline
type: ssh # 必须安装运行的是 drone-runner-ssh, 如果是docker类型则需要安装运行drone/drone-runner-docker
name: default
这里我会同时安装两种类型的runner
(ssh
和docker
)
安装启动drone-runner-ssh
docker run -d \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.0.201:10080 \
-e DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b \
-e DRONE_DEBUG=true \
-p 10081:3000 \
--restart always \
--name ssh-runner \
drone/drone-runner-ssh
环境变量配置说明
DRONE_RPC_SECRET
: Drone服务密匙(后面安装runner
使用相同的秘钥)DRONE_RPC_HOST
: Drone服务地址,外部可访问的域名或IP地址(建议填写宿主机地址+端口, 不需要http://
开头)DRONE_RPC_PROTO
: Drone提供服务的协议类型,可选为http
或https
安装启动drone-runner-docker
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.0.201:10080 \
-e DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=docker-runner \
-e DRONE_DEBUG=true \
-p 10082:3000 \
--restart always \
--name docker-runner \
drone/drone-runner-docker:1
到此, 如无意外, 服务基本安装成功了.
打开浏览器访问一下地址:
http://192.168.0.201:10080
出现一下登录界面:
输入Gogs
平台账号, 前面设置的admin
账号或其他gogs
里的账号也可以登录.
登录后你会发现Drone已同步了Gogs的项目
选择一个项目, 点击右边的ACTIVATE
勾选Trusted
, 注意, 如果你登录的不是管理员, 那么你看不到这个项目.
勾选Trusted
是docker数据卷挂载需要此权限.
例如:
kind: pipeline
type: docker
name: default
steps:
- name: build
image: golang
volumes:
- name: docker
path: /var/run/docker.sock
commands:
- go build
volumes:
- name: docker
host:
path: /var/run/docker.sock
上图点击保存后, Drone
会在Gogs
对应项目设置Webhook
登录Gogs
平台查看
使用IDE
在项目根目录新建文件.drone.yml
注意文件名: 前面有一个"."开头, 这里又一个坑, 坑了我半天
输入内容, 这里以go
项目为例:
kind: pipeline
type: docker # 使用docker
name: default
steps:
- name: test
image: golang
commands:
- echo Hello Drone !!
- go build
保存后commit&push
项目文件, 同时刷新查看Drone平台项目状态
可以看到, 项目已自动部署成功.
测试ssh项目
新增并激活ssh
项目(同上)
另外新增一个Secrets
, Secrets
用于保存一些敏感信息, 供.drone.yml
使用.
kind: pipeline
type: ssh # 使用SSH
name: default
server:
host: 192.168.0.201
user: root
password:
from_secret: rootpass # Secrets保存的密码
steps:
- name: build
commands:
- echo Hello Drone!!
- df -h
- pwd
- ls -l
- go version
- go build
commit&push
项目文件, 查看部署情况, 可以看到是ssh
在远程服务器执行命令
我们再试一下停止drone-runner-ssh
修改一下.drone.yml
文件, 重新commit&push
项目文件, 查看部署情况
你会发现以上异常情况 (界面显示default: Pending
), 无法部署完成.
这里卡了我两天, 之前我只安装了drone-runner-docker
,
我以为docker
是可以的, 那应该ssh
也可以, 没想到是不行的. 后来查看日志才发现错误.
教训: 开启DEBUG日志, 遇到问题及时查看
以上只是一些简单例子, 详细的可自行编写
使用docker-compose
一键启动服务
version: "3.8"
services:
gogs:
image: gogs/gogs
container_name: my-gogs
restart: always
networks:
dronenet:
aliases:
- gogs
volumes:
- /data1/mygogs:/data
ports:
- "10022:22"
- "3000:3000"
drone:
# 参考文档 https://docs.drone.io/server/provider/gogs/
image: drone/drone:1
container_name: my-drone
restart: always
ports:
- 10080:80
- 10443:443
networks:
dronenet:
aliases:
- drone
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /data1/drone/:/var/lib/drone
environment:
- TZ=Asia/Shanghai
- DRONE_DEBUG=true
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_LOGS_PRETTY=true
- DRONE_GIT_ALWAYS_AUTH=false
- DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b
- DRONE_SERVER_HOST=192.168.0.201:10080
- DRONE_SERVER_PROTO=http
- DRONE_GOGS_SERVER=http://192.168.0.201:3000
- DRONE_USER_CREATE=username:admin,admin:true
drone-sshrunner:
# docker类型的pipeline必须安装运行drone-runner-ssh
# 参考文档 https://docs.drone.io/runner/ssh/overview/
image: drone/drone-runner-ssh
container_name: my-drone-sshrunner
restart: always
ports:
- 10081:3000
depends_on:
- drone
networks:
dronenet:
aliases:
- drone-sshrunner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai
- DRONE_DEBUG=true
- DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b
- DRONE_RPC_HOST=192.168.0.201:10080
- DRONE_RPC_PROTO=http
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=drone-sshrunner
drone-runner:
# docker类型的pipeline必须安装运行drone-runner-docker
# 参考文档 https://docs.drone.io/runner/docker/overview/
image: drone/drone-runner-docker:1
container_name: my-drone-runner
restart: always
ports:
- 10082:3000
depends_on:
- drone
networks:
dronenet:
aliases:
- drone-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai
- DRONE_DEBUG=true
- DRONE_RPC_SECRET=bca6ae9c4bc3022eb59f19642167068b
- DRONE_RPC_HOST=192.168.0.201:10080
- DRONE_RPC_PROTO=http
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=drone-runner
networks:
dronenet:
external: true # 使用外部网络, 需先创建网络
运行服务
docker-compose up
运行单个服务
docker-compose up drone
docker-compose up drone-runner
docker-compose up drone-sshrunner
停止服务
docker-compose stop
停止单个服务
docker-compose stop drone
docker-compose stop drone-runner
docker-compose stop drone-sshrunner
感想
Drone
还是挺好用的, 搭建和上手速度都很快, 特别是熟悉docker
的同学.
只是官方文档不够详细, 社区生态不是很好. 网上可参考的资料比较少. 可能中国用的人比较少.
写这篇文章: 希望可以帮助到需要的同学, 带动生态的发展
参考文档: Drone官方文档