You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
7.8 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 进行持续集成的原因,希望对你也有所帮助。