Drone 相对于常见的 Jenkins,选中 Drone 的原因在于它非常简洁,不像 Jenkins 那样复杂,同时它拥有可以满足基本需求的能力,并且提供了许多实用的插件。
而且 Jenkins 包含了大量的图形化界面,虽然大而全,但是在有时候只想简单的做一个 CI 的容器时就显得有些笨重,本文简单的介绍使用 docker 搭建 drone 项目,并发布一个 SpringBoot 的 Java 项目。
Drone 文档给出了相对于不同git仓库和部署方式的方案,支持的git仓库有:GitHub,GitLab,Gitea,Gogs 等,本文使用 Gogs 仓库
使用 Docker 安装 Drone
首先下载 Drone 的 Server 和 Runner 的镜像
docker pull drone/drone:2
docker pull drone/drone-runner-docker:1
Server:为 Drone 的管理提供了 Web 页面,用于管理从 Git 上获取的仓库中的流水线任务
Runner:一个单独的守护进程,会轮询 Server,获取需要执行的流水线任务,之后执行
安装 drone-server
sudo docker run \
--volume=/home/cl/drone:/data \
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GOGS_SERVER=http://192.168.50.228:13000 \
--env=DRONE_RPC_SECRET=rpc_secret \
--env=DRONE_SERVER_HOST=192.168.50.228:3080 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_USER_CREATE=username:chenglong,admin:true \
--publish=3080:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:2
DRONE_GOGS_SERVER:用于配置 Gogs 服务地址
DRONE_RPC_SECRET:Drone 的共享秘钥,用于验证连接到 server 的 rpc 连接,server 和 runner 需要提供同样的秘钥
DRONE_SERVER_HOST:用于配置 Drone server 外部可访问的地址
DRONE_SERVER_PROTO:用于配置 Drone server 外部可访问的协议,必须是 http 或 https
DRONE_USER_CREATE:创建一个管理员账号,该账号需要在 Gogs 中注册好,否则在后面无法将仓库设置为Trusted
安装 drone-runner-docker
sudo docker run --detach \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--env=DRONE_RPC_PROTO=http \
--env=DRONE_RPC_HOST=192.168.50.228:3080 \
--env=DRONE_RPC_SECRET=rpc_secret \
--env=DRONE_RUNNER_CAPACITY=2 \
--env=DRONE_RUNNER_NAME=docker-runner \
--publish=3000:3000 \
--restart=always \
--name=runner \
drone/drone-runner-docker:1
DRONE_RPC_PROTO:用于配置连接到 Drone server 的协议,必须是 http 或 https
DRONE_RPC_HOST:用于配置 Drone server 的访问地址,runner 会连接到 server 获取流水线任务并执行
DRONE_RPC_SECRET:用于配置连接到 Drone server 的共享秘钥
DRONE_RUNNER_CAPACITY:限制 runner 并发执行的流水线任务数量
DRONE_RUNNER_NAME:自定义 runner 的名称
Drone 的使用
访问下 Drone 的控制台页面,第一次登录需要输入账号密码(在Gogs中注册的账号),访问地址就是刚刚制定的 DRONE_SERVER_HOST 的地址。此时我们在Gogs中的项目会现在在列表中
点击项目后点击 Activate Repository
接下来我们需要对仓库进行设置,将仓库设置为 Trusted,最后点击SAVE按钮保存
保存成功后会在 Gogs 中自动配置一个 Web 钩子,当我们推送代码到 Gogs 中去时,会触发这个钩子,然后执行在 Drone 中的流水线任务
这里要注意,现在 Gogs 的 WebHooks 是没有办法测试的,点击后会提示 io timeout,这是由于我们项目中还没有配置 .drone.yml 文件导致的,添加后即可正常调用
剩下的就是 .drone.yml 脚本的编写了,这个脚本要放在项目的根目录下,我这里简单的演示一下在项目的部署。
.drone.yml
kind: pipeline
type: docker
name: house-pipeline
steps:
- name: build image
image: maven:3-jdk-11
volumes:
- name: maven-cache
path: /root/.m2/repository
- name: maven-build
path: /app/build
commands:
- mvn install -DskipTests=true -Dmaven.javadoc.skip=true
- mv -f /drone/src/target/*.jar /app/build/house.jar
- name: build-start
image: appleboy/drone-ssh
settings:
host: 192.168.50.228
username: cl
password:
from_secret: ssh_password
port: 22
command_timeout: 5m
script:
- cd /home/cl/maven-build
- chmod +x run.sh
- sh run.sh
volumes:
- name: maven-cache
host:
path: /home/cl/repository
- name: maven-build
host:
path: /home/cl/maven-build
run.sh
#!/bin/bash
source /etc/profile
nohup java -jar -Xmx1024M -Xms256M -Duser.timezone=GMT+8 house.jar --server.port=5188 > house.log 2>&1 &
注意 yml 的语法,使用空格而不是 Tab 可以减少看不见的错误
在使用 shell 脚本发布项目的时候,如果提示 java command not found,需要先执行一下 source 一下环境变量,这样就能正常使用了
简单解释一下 .drone.yml,具体的使用请参考官网 demo,这里不做详细说明
挂载容器的 /root/.m2/repository 和 /app/build 到宿主机,方便重复使用 .m2 仓库以及保存打包好的 jar 文件
使用 appleboy/drone-ssh 这个镜像远程到制定的服务器中,然后调用 shell 脚本发布项目
成果
配置好后,每当我提交代码到指定分支后,drone 就会帮我们自动部署项目啦。