|
|
# Drone CI - 自动化部署
|
|
|
|
|
|
Drone CI 是一款流行的开源持续集成工具,它能够帮助团队自动化构建、测试和部署软件项目。本文将介绍 Drone CI 的安装、基础用法以及常用插件。
|
|
|
|
|
|
![](https://oss.aqzscn.cn//resource/blog/img/2023/09c8a0857087561a890c8650db9670f3.png)
|
|
|
|
|
|
:::caution
|
|
|
|
|
|
**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`。
|
|
|
|
|
|
:::info
|
|
|
|
|
|
重定向地址一定要确保正确配置,否则将登录失败。
|
|
|
|
|
|
:::
|
|
|
|
|
|
![](https://oss.aqzscn.cn//resource/blog/img/2023/2f2f7fcb484d89d3c81429c454bf68e9.png)
|
|
|
|
|
|
接下来,以 docker-compose 为例,对以下配置的高亮部分按自己的需求调整即可。
|
|
|
|
|
|
```yaml title="docker-compose.yaml"
|
|
|
version: '3'
|
|
|
services:
|
|
|
drone-server:
|
|
|
image: drone/drone:latest
|
|
|
container_name: drone-server
|
|
|
ports:
|
|
|
# 端口映射,左侧是宿主机端口,右侧是容器端口
|
|
|
# highlight-next-line
|
|
|
- 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
|
|
|
# highlight-start
|
|
|
- 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/
|
|
|
# highlight-end
|
|
|
drone-runner:
|
|
|
image: drone/drone-runner-docker:latest
|
|
|
container_name: drone-runner
|
|
|
restart: always
|
|
|
environment:
|
|
|
# highlight-start
|
|
|
- DRONE_RPC_HOST=droneci.aqzscn.cn
|
|
|
- DRONE_RPC_PROTO=https
|
|
|
- DRONE_RPC_SECRET=generateyourrpcsecret
|
|
|
# highlight-end
|
|
|
- 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` 即可启动配置的两个容器。
|
|
|
|
|
|
:::caution
|
|
|
|
|
|
如果你使用的版本控制工具不是 Gitea,可从[官方文档](https://docs.drone.io/)或其他人的教程中找到对应的安装方法。
|
|
|
|
|
|
:::
|
|
|
|
|
|
## 基础使用
|
|
|
|
|
|
安装完成后,我们可以访问 Drone CI 的 Web 界面,并通过 Gitea 账号登录。
|
|
|
|
|
|
![](https://oss.aqzscn.cn//resource/blog/img/2023/3fb9205df41e348597ef1941648a719d.png)
|
|
|
|
|
|
默认的存储库都是没有开启自动构建流程的,需要先选中存储库,点击激活按钮。
|
|
|
|
|
|
![](https://oss.aqzscn.cn//resource/blog/img/2023/4d78ad407897b25a8a80a4806d3e74f5.png)
|
|
|
|
|
|
这个操作的目的是在 Gitea 对应的存储库创建了一个 WebHook 钩子,一旦存储库有了变更,就会发送一个 POST 请求通知 Drone CI,这样 Drone CI 就可以根据配置执行后续的自动化流程了。
|
|
|
|
|
|
![](https://oss.aqzscn.cn//resource/blog/img/2023/87172b757ea8928c9a0919e65ef25b76.png)
|
|
|
|
|
|
Drone CI 的配置文件需要放在存储库的根目录,并以 `.drone.yml` 命名。
|
|
|
|
|
|
下面以我制作的某个 Webpack 项目为例,介绍一下较为基础的配置:
|
|
|
|
|
|
```yaml title=".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:
|
|
|
# highlight-next-line
|
|
|
from_secret: host
|
|
|
username:
|
|
|
# highlight-next-line
|
|
|
from_secret: username
|
|
|
password:
|
|
|
# highlight-next-line
|
|
|
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:
|
|
|
# highlight-next-line
|
|
|
from_secret: host
|
|
|
username:
|
|
|
# highlight-next-line
|
|
|
from_secret: username
|
|
|
password:
|
|
|
# highlight-next-line
|
|
|
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/](https://plugins.drone.io/) 查找。
|
|
|
|
|
|
其中有个参数 `from_secret` 有点特殊,填的值是在 Drone CI Web 页面配置的密钥名,作用是让配置文件脱敏。
|
|
|
|
|
|
![](https://oss.aqzscn.cn//resource/blog/img/2023/4c39e4faba2999ae2c02add0ea61a5c2.png)
|
|
|
|
|
|
配置 Secret 的时候建议直接配置在**组织**下面,这样不同项目可以使用同一套配置,不用再额外配置。
|
|
|
|
|
|
以上步骤做好之后,提交并推送代码,Drone CI 就会收到代码库变动的通知,从而根据项目根目录下的 `.drone.yml` 进行一次构建。
|
|
|
|
|
|
刚开始写的流水线配置文件或多或少都会有些问题,耐心查看运行日志并修改,最后总能成功的。
|
|
|
|
|
|
![](https://oss.aqzscn.cn//resource/blog/img/2023/46f3eaa7939e795ebbd8b1aba0454d83.png)
|
|
|
|
|
|
## 结语
|
|
|
|
|
|
Drone CI 是一款功能强大的持续集成工具,支持多种语言和框架,以及许多高级用法和插件。类似的持续集成工具其实还有很多选择,如 Gitlab 和 Jerkins。
|
|
|
|
|
|
Gitlab 基本上涵盖了代码开发所需的一切功能,但缺点就是占用内存过高,个人的服务器不适合使用这个,而且如果要使用全部功能,还需要花钱购买。
|
|
|
|
|
|
:::note
|
|
|
|
|
|
自己在群晖上尝试部署过 Gitlab,几乎吃了我快 4 个 G 的内存,这样我就没有富裕的内存去应对一些突发的计算任务了。
|
|
|
|
|
|
:::
|
|
|
|
|
|
Jenkins 则是一个历史比较久的工具,积累了种类繁多的插件可供开发者使用,但还是那个问题,它是用 Java 编写的,内存占用较多。
|
|
|
|
|
|
而 Drone CI 是用 GO 语言编写的,空闲时基本不占用内存,很适合个人部署使用,而且网页 UI 也很现代化,看着就很舒服。所以这就是我最后选择 Drone CI 搭配 Gitea 进行持续集成的原因,希望对你也有所帮助。
|