跳到主要内容

Drone CI - 自动化部署

Drone CI 是一款流行的开源持续集成工具,它能够帮助团队自动化构建、测试和部署软件项目。本文将介绍 Drone CI 的安装、基础用法以及常用插件。

警告

Drone CI 需要配合版本控制工具使用,Github 或 Gitee 都可以,如果是自部署的,推荐使用 Gitea,相比 gogs 拥有更多功能,如镜像仓库。

安装 Drone CI

Drone CI 可以通过 Docker 镜像进行安装。不过首先我们需要做一点准备工作,这里以 Gitea 为例,需要在 设置 - 应用 中为 Drone CI 创建一个客户端,并把重定向 URI 指向 Drone CI 的登录地址,假设 Drone CI 的首页是 https://droneci.aqzscn.cn/ 的话,它的登录地址应该是这样的:https://droneci.aqzscn.cn/login

信息

重定向地址一定要确保正确配置,否则将登录失败。

接下来,以 docker-compose 为例,对以下配置的高亮部分按自己的需求调整即可。

docker-compose.yaml
version: '3'
services:
drone-server:
image: drone/drone:latest
container_name: drone-server
ports:
# 端口映射,左侧是宿主机端口,右侧是容器端口
- 8080:80
volumes:
# 注意,此处需要在 docker-compose.yaml 同目录下创建名为 data 的目录,用于保存 drone 的数据
- ./data:/var/lib/drone/
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_OPEN=true
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_SERVER_HOST=droneci.aqzscn.cn
- DRONE_SERVER_PROTO=https
- DRONE_GITEA_CLIENT_ID=inputyourclientid
- DRONE_GITEA_CLIENT_SECRET=inputyourclientsecret
# 注意,此处的密钥可通过 openssl rand -hex 16 命令随机生成一个,需要与下方 Runner 的配置相同
- DRONE_RPC_SECRET=generateyourrpcsecret
- DRONE_GITEA_SERVER=http://192.168.121.49:6060/
drone-runner:
image: drone/drone-runner-docker:latest
container_name: drone-runner
restart: always
environment:
- DRONE_RPC_HOST=droneci.aqzscn.cn
- DRONE_RPC_PROTO=https
- DRONE_RPC_SECRET=generateyourrpcsecret
- DRONE_RUNNER_NAME=my-runner
- DRONE_RUNNER_CAPACITY=2
ports:
- 8081:3000
volumes:
- /var/run/docker.sock:/var/run/docker.sock

接着执行命令 docker-compose up -d 即可启动配置的两个容器。

警告

如果你使用的版本控制工具不是 Gitea,可从官方文档或其他人的教程中找到对应的安装方法。

基础使用

安装完成后,我们可以访问 Drone CI 的 Web 界面,并通过 Gitea 账号登录。

默认的存储库都是没有开启自动构建流程的,需要先选中存储库,点击激活按钮。

这个操作的目的是在 Gitea 对应的存储库创建了一个 WebHook 钩子,一旦存储库有了变更,就会发送一个 POST 请求通知 Drone CI,这样 Drone CI 就可以根据配置执行后续的自动化流程了。

Drone CI 的配置文件需要放在存储库的根目录,并以 .drone.yml 命名。

下面以我制作的某个 Webpack 项目为例,介绍一下较为基础的配置:

.drone.yml
kind: pipeline
type: docker
name: default
# 每次执行自动化构建,都会重新拉取一遍代码,指定 depth=1 在仓库提交次数特别多时会非常有用,能大大减少拉取代码的时间
clone:
depth: 1
# 具体构建流程,每个步骤要以一个容器为载体,Drone CI 的插件本质上也是一个容器
steps:
# 步骤名称,可以自定义,需要注意的是,每个步骤虽然容器不同,但所处的工作目录是同一个
- name: build
# 拉取镜像的时机,选择不存在时拉取能减少构建时间
pull: if-not-exists
# 镜像名称
image: node:latest
commands:
# 待执行的脚本命令列表
- export NODE_OPTIONS="--max-old-space-size=4096"
- npm config set registry https://registry.npmmirror.com
- npm install
- npm run build
- cp -r build/ live-release/
- ls -al live-release
- name: upload
pull: if-not-exists
image: appleboy/drone-scp
settings:
host:
from_secret: host
username:
from_secret: username
password:
from_secret: password
port: 22
target: /usr/share/nginx/html
source: live-release/*
- name: deploy
pull: if-not-exists
image: appleboy/drone-ssh
settings:
host:
from_secret: host
username:
from_secret: username
password:
from_secret: password
port: 22
script:
- cd /usr/share/nginx/html/
- rm -rf live
- echo "delete success"
- mv live-release live
- echo "deploy success"

在上述配置文件中,我们定义了一个 pipeline,包含三个步骤:build、upload 和 deploy。每个步骤都可以指定要使用的镜像和运行的命令。

因为是 webpack 项目,所以打包的镜像选择了 node,后面两步上传和发布则是专为 Drone CI 构建的镜像,用于文件上传和连接 SSH。

另外还有很多 Drone CI 的插件,可以在 https://plugins.drone.io/ 查找。

其中有个参数 from_secret 有点特殊,填的值是在 Drone CI Web 页面配置的密钥名,作用是让配置文件脱敏。

配置 Secret 的时候建议直接配置在组织下面,这样不同项目可以使用同一套配置,不用再额外配置。

以上步骤做好之后,提交并推送代码,Drone CI 就会收到代码库变动的通知,从而根据项目根目录下的 .drone.yml 进行一次构建。

刚开始写的流水线配置文件或多或少都会有些问题,耐心查看运行日志并修改,最后总能成功的。

结语

Drone CI 是一款功能强大的持续集成工具,支持多种语言和框架,以及许多高级用法和插件。类似的持续集成工具其实还有很多选择,如 Gitlab 和 Jerkins。

Gitlab 基本上涵盖了代码开发所需的一切功能,但缺点就是占用内存过高,个人的服务器不适合使用这个,而且如果要使用全部功能,还需要花钱购买。

备注

自己在群晖上尝试部署过 Gitlab,几乎吃了我快 4 个 G 的内存,这样我就没有富裕的内存去应对一些突发的计算任务了。

Jenkins 则是一个历史比较久的工具,积累了种类繁多的插件可供开发者使用,但还是那个问题,它是用 Java 编写的,内存占用较多。

而 Drone CI 是用 GO 语言编写的,空闲时基本不占用内存,很适合个人部署使用,而且网页 UI 也很现代化,看着就很舒服。所以这就是我最后选择 Drone CI 搭配 Gitea 进行持续集成的原因,希望对你也有所帮助。