drone官方文档:https://docs.drone.io/
drone跟Jenkins一样,可实现持续集成,就是可以帮助我们解决重复的代码构建,自动化测试,发布等重复劳动,通过简单一个提交代码的动作,解决接下来要做的很多事。
Drone是一种基于容器技术的连续运输系统,所以安装也是基于docker安装。
相对于Jenkins,Jenkins虽然有1000多种插件可实现复杂的功能,所以操作部署也是同样的复杂。
而drone,短小精悍,部署简单,比 Jenkins 语法简单,更加适合 云原生应用。
gitlab搭建参考:Linux安装gitlab、docker安装gitlab教程
在Applications选项填写Name 和 Redirect URI,Name取个好记得即可。
Redirect URI 为搭建drone的地址,后面需要以login结尾。
scopes根据自己选择,最后Save applications即可
保存后,记下相关信息,安装drone会用到。
drone有个Server和Runner(Agent)的概念,我们先来理解下:
Server:为Drone的管理提供了Web页面,用于管理从Git上获取的仓库中的流水线任务。
Runner(Agent):一个单独的守护进程,会轮询Server,获取需要执行的流水线任务,之后执行。
drone-runner不是必选的,官方不推荐吧runner和server安装在一个实例上
先生产共享密钥,用于连接Server和Runner之间,两者需一致。
$ openssl rand -hex 16
1d8ae98e6fd61c91b2e7dad6775ca771
拉取镜像,docker运行drone Server
#拉取镜像
docker pull drone/drone
#运行
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GITLAB_SERVER=http://192.168.152.131 \
--env=DRONE_GITLAB_CLIENT_ID=6873788c9b46a5c4faf49a2ea1ebaf9c8683d43371c4ec7bca8a2b1429d35165 \
--env=DRONE_GITLAB_CLIENT_SECRET=b0fb674c1c00a48eea472281ad4c99609ea29fe66a3684e7ca5341385ab3f89f \
--env=DRONE_SERVER_HOST=192.168.152.132 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_TLS_AUTOCERT=false \
--env=DRONE_LOGS_DEBUG=true \
--env=DRONE_RPC_SECRET=1d8ae98e6fd61c91b2e7dad6775ca771 \
--env=DRONE_USER_CREATE=username:root,admin:true \
--publish=80:80 --publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone
可选选项(时区):-e TZ="Asia/Shanghai" \
注意选项(没有创建管理员选项,功能会少):
--env=DRONE_USER_CREATE=username:root,admin:true \
用户名需和gitlab登录用户一致,才会有Project Setting选项,我gitlab和drone都是root可见:
浏览器访问192.168.152.132,点击继续Continue,自动跳转gitlab,授权即可进入drone。
进入可看到gitlab所有项目,选择一个项目,进入点击activate 激活进入项目即可。
注:如果项目无法激活,需要在admin设置里面,设置Network选择,如下:
回到gitlab,在项目设置里面的钩子里,也自动生成了一个钩子。
拉取镜像,根据自己项目需要选择合适的runner。如有docker,k8s,exec,ssh等。
这里,我需要远程ssh部署,就选择ssh的runner,如果runner不合适,在构建时,会一直pending状态。
docker pull drone/drone-runner-ssh
#如果时docker项目,则拉取docker的镜像
docker pull drone/drone-runner-docker
drone 已经正常,接下来需要Runner执行工作了。
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.152.132 \
-e DRONE_RPC_SECRET=1d8ae98e6fd61c91b2e7dad6775ca771 \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=${HOSTNAME} \
-p 3000:3000 \
--restart always \
--name runner \
drone/drone-runner-ssh
运行成功后,查看日志,docker logs runner
可查看是否连接成功。
$ docker logs runner
time="2021-11-02T07:41:19Z" level=info msg="starting the server" addr=":3000"
time="2021-11-02T07:41:19Z" level=info msg="successfully pinged the remote server"
time="2021-11-02T07:41:19Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="http://192.168.152.132" kind=pipeline os=linux type=docker
successfully pinged the remote serve连接成功。
到这里drone安装完成。
既然可以用docker安装drone,那可以用docker-compose编排,更简单,不用每次run 很多命令参数,参数直接写在环境.env文件即可,有任何改动,只需要更改.env参数即可。
创建目录/docker_drone
#创建目录
sudo mkdir /docker_drone
#进入目录
cd /docker_drone
#编辑创建docker-compose.yml文件
vim docker-compose.yml
内容如下:
version: "3.7"
services:
drone-server:
image: drone/drone:latest
container_name: drone-server
networks:
- drone_net # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信
ports:
- '80:80' # Web管理面板的入口 PROTO=http 时使用该端口
- '443:443' # Web管理面板的入口 PROTO=https 时使用该端口
- '9000:9000' # RPC服务端口
volumes:
- /var/run/docker.sock:/var/run/docker.sock # docker.sock [1]
- /var/data/drone/:/var/lib/drone # drone数据存放路径
environment:
- DRONE_AGENTS_ENABLED=true # 使用Runner
- DRONE_GITLAB_SERVER=${DRONE_GITLAB_SERVER} # gitlab的地址
- DRONE_GITLAB_CLIENT_ID=${DRONE_GITLAB_CLIENT_ID} # gitlab获得的ClientID
- DRONE_GITLAB_CLIENT_SECRET=${DRONE_GITLAB_CLIENT_SECRET} # gitlab获得的ClientSecret
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # RPC秘钥 [2]
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST} # RPC域名(在一个实例上可以不用)
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} # git webhook使用的协议(建议http)
- DRONE_OPEN=true # 开发drone
#- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite # 数据库文件
#- DRONE_DATABASE_DRIVER=sqlite3 # 数据库驱动,我这里选的sqlite
- DRONE_DEBUG=true # 调试相关,部署的时候建议先打开
- DRONE_LOGS_DEBUG=true # 调试相关,部署的时候建议先打开
- DRONE_LOGS_TRACE=true # 调试相关,部署的时候建议先打开
- DRONE_USER_CREATE=username:root,admin:true # 初始管理员用户
- TZ=Asia/Shanghai # 时区
restart: always
drone-runner:
image: drone/drone-runner-ssh:latest
container_name: drone-runner
networks:
- drone_net # 让drone-server和drone-agent处于一个网络中,方便进行RPC通信
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock # docker.sock [1]
environment:
- DRONE_RPC_HOST=${DRONE_RPC_HOST} # RPC服务地址
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET} # RPC秘钥
- DRONE_RPC_PROTO=${DRONE_RPC_PROTO} # RPC协议(http || https)
- DRONE_RUNNER_CAPACITY=2 # 最大并发执行的 pipeline 数
- DRONE_DEBUG=true # 调试相关,部署的时候建议先打开
- DRONE_LOGS_DEBUG=true # 调试相关,部署的时候建议先打开
- DRONE_LOGS_TRACE=true # 调试相关,部署的时候建议先打开
- TZ=Asia/Shanghai
restart: always
networks:
drone_net:
# 注意空格格式,否则报错,让drone-server和drone-agent处于一个网络中,方便进行RPC通信
sudo vim .env
内容如下:
DRONE_GITLAB_SERVER=http://192.168.152.131
DRONE_GITLAB_CLIENT_ID=6873788c9b46a5c4faf49a2ea1ebaf9c8683d43371c4ec7bca8a2b1429d35165
DRONE_GITLAB_CLIENT_SECRET=b0fb674c1c00a48eea472281ad4c99609ea29fe66a3684e7ca5341385ab3f89f
DRONE_RPC_SECRET=1d8ae98e6fd61c91b2e7dad6775ca771
DRONE_SERVER_HOST=192.168.152.132
DRONE_SERVER_PROTO=http
DRONE_RPC_HOST=192.168.152.132
DRONE_RPC_PROTO=http
docker-compose up -d
如果没有启动,用docker-compose up 不加参数-d,实时打印日志查看错误。
docker-compose up
到这里drone创建完成。
搭建完成,开始下一步,使用Drone自动构建项目
Drone Ci自动构建部署项目