Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统

语言: CN / TW / HK

Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模。开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目录下的描述文件 .drone.yml 就可以完成 CI/CD 配置。

下面,我们以 gitea.com 服务器为例,搭建一套使用 Gitea 与 Drone 的 CI/CD 系统。

系统结构

Drone 由两部分构成:

  • Server : 负责任务调度
  • Runner : 执行 Pipeline 的具体任务

用户将代码推送到 Gitea 时触发 Webhook,调动 Drone 从 Gitea 拉取最新的代码并根据 .drone.yml 描述文件执行 CI/CD 流水线。

网络结构

由于 CI/CD 任务的特殊性,工作繁忙时会占用较多的系统资源,因此为了提高系统整体可靠性,不建议将 Gitea、Drone Server、Drone Runner 安装在同一台服务器上。

  • 在本地局域网搭建时应该确保以上服务可以通过域名、IP互相访问。例如: gitea.example.com -> 192.168.3.10 drone.example.com -> 192.168.3.20 runner.example.com -> 192.168.3.30
  • 如需使用 docker compose 在本地开发环境搭建高可用结构系统,请参考官方文档: : https://docs.drone.io/server/ha/developer-setup/

准备工作

在 Gitea 上创建 OAuth2 应用程序

在本例中,Drone 基于 OAuth2 认证授权访问您的 Gitea API。您可以创建一个专用于 CI/CD 的账号,并将该账号添加为代码仓库协作者或者组织管理员。

首先,登录一个您要用于集成 Drone 的 Gitea 账号,进入 设置 - 应用,创建一个 Gitea OAuth2 应用程序。

  • 应用名称 : 您可以任取一个名字,此案例中我们填写 Drone

  • 重定向 URL : 授权回调 URL 形如 http(s)://<YOUR_DRONE_SERVER>:<PORT>/login,必须使用您设定的 Drone 服务器协议和主机地址。如果使用非标准的HTTP(S)端口,还应该指定准确的端口。 : 例如 https://drone.gitea.io/login

创建 OAuth2 应用

编辑 OAuth2 应用

修改 Gitea 服务器的 Webhook 白名单

出于安全考虑,Gitea 默认禁止触发外部主机的 Webhook。您可以将外部主机添加到 webhook.ALLOWED_HOST_LIST 白名单来解除这一限制。具体信息参考文档 Webhook

修改配置时,打开 conf/app.ini,添加 ALLOWED_HOST_LIST = *[webhook] 栏目中,并重启 Gitea 服务器。例如:

ini [webhook] ALLOWED_HOST_LIST = *

创建共享密钥

共享密钥用于 Drone Server 和 Drone Runner 之间的通信认证。记录下您创建的共享密钥,稍后在安装 Drone Server 和 Drone Runner 时将使用此密钥填充环境变量 DRONE_RPC_SECRET

您可以使用 OpenSSL 生成随机的十六进制共享密钥:

bash $ openssl rand -hex 16 c5704bc389f1e3d47f1c4751d1295c86

使用 Docker 安装 Drone 服务器

Drone 服务器是一个轻量级的 Docker 容器,使用 SQLite 作为默认数据库,支持通过环境变量动态设定运行参数。有关配置参数的完整列表,请参阅 Drone Server 文档

环境变量

  • DRONE_GITEA_CLIENT_ID : (必填)您的 Gitea OAuth 客户端ID
  • DRONE_GITEA_CLIENT_SECRET : (必填)您的 Gitea OAuth 客户端密钥
  • DRONE_GITEA_SERVER : (必填)您的 Gitea 服务器地址,例如 https://gitea.com。注意填写准确的 http(s) 协议,否则您会看到来自 Gitea 的错误报告:unsupported protocol scheme
  • DRONE_RPC_SECRET : (必填)在准备工作中使用 openssl rand -hex 16 生成的共享密钥。这个密钥用于验证 Drone Server 和 Runner 之间的 RPC 连接。因此,在 Server 和 Runner 上都必须使用相同的密钥。
  • DRONE_SERVER_HOST : (必填)您访问 Drone 时所用的域名或 IP 地址。如果使用 IP 地址,还应该包含端口。 例如 drone.gitea.io
  • DRONE_SERVER_PROTO : (必填)设置服务器的协议,使用:httphttps。 如果您已经配置 ssl 或 acme,此字段默认为 https

启动服务器

为了便于修改容器参数,我们创建一个 docker-compose.yml 模板来配置 Drone 服务器容器。

根据下面的 Docker Compose 模板,使用命令 docker compose up -d 启动 Drone 服务器。

```yml

docker-compose.yml

version: "3"

services: drone: image: drone/drone:2 container_name: drone environment: - DRONE_GITEA_SERVER=https://gitea.com - DRONE_GITEA_CLIENT_ID=change-to-your-gitea-client-id - DRONE_GITEA_CLIENT_SECRET=change-to-your-gitea-client-secret - DRONE_RPC_SECRET=change-to-your-shared-secret - DRONE_SERVER_HOST=drone.gitea.io - DRONE_SERVER_PROTO=https restart: always volumes: - ./drone:/data ports: - 80:80 - 443:443 ```

使用 Docker 安装 Drone Runner

Drone 服务器管理 CI/CD 系统的调度,而 Drone Runner 则是 CI/CD 流水线的执行者。

环境准备

Drone Runner 支持多种运行环境:Doceker、K8s、Windows/Linux/MacOS客户端、SSH 等。

使用 Docker 作为 Drone Runner 的好处是可以将流水线执行过程完全以容器化的方式执行,不对容器的宿主服务器环境造成破坏。在本实践中,我们依然使用 Docker 在 Linux 服务器上安装 Drone Runner。Docker 容器支持的架构包括:

  • amd64
  • arm
  • arm64

环境变量

Docker Runner 使用环境变量动态设定运行参数。有关参数的完整列表,请参阅 Drone Runner 文档

  • DRONE_RPC_HOST : 填写 Drone Server 的主机名(以及可选填的端口号)。基于 PRC 协议连接 Runner 与 Server,接收流水线任务
  • DRONE_RPC_PROTO : 传输协议:httphttps
  • DRONE_RPC_SECRET : 与 Drone Server 共享的密钥
  • DRONE_RUNNER_CAPACITY : Runner 可以并发执行的流水线数量,默认:2
  • DRONE_RUNNER_NAME : 自定义 Runner 名称

启动 Runner

根据下面的 Docker Compose 模板,使用命令 docker compose up -d 启动 Drone Runner。

```yml version: "3"

services: runner: image: drone/drone-runner-docker:1 container_name: runner environment: - DRONE_RPC_PROTO=https - DRONE_RPC_HOST=drone.gitea.io - DRONE_RPC_SECRET=change-to-your-shared-secret - DRONE_RUNNER_CAPACITY=2 - DRONE_RUNNER_NAME=my-first-runner restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock ports: - 3000:3000 ```

验证安装

使用 docker logs 命令查看日志,并验证 Runner 程序是否与 Drone Server 建立连接。

```bash $ docker logs runner

INFO[0000] starting the server INFO[0000] successfully pinged the remote server ```

初始化 Drone

登录 Drone 网页面板,例如 https://drone.gitea.io,点击 continue 跳转到 Gitea 授权页面,点击应用授权

如果出现 Unregistered Redirect URI,表示您设置的重定向 URI与 Drone 不匹配,请重新检查。

CI/CD 实操:创建 .drone.yml 验证 Pipeline

Drone 文档为各种编程语言和包管理工具提供了流水线模板。

https://docs.drone.io/pipeline/docker/examples/

这里我们以 Go 语言为例,在 Gitea 仓库根目录创建一个 .drone.yml 作为我们自定义的流水线。

.drone.yml

示范:

```yml

.drone.yml

kind: pipeline name: default

steps: - name: test image: golang commands: - go test

  • name: build image: golang commands:
  • go build ```

在 Drone 面板上激活仓库后提交代码到 Gitea 仓库,随即触发 Pipeline 任务。

回到 Gitea 可以看到构建完成后显示的消息: ✔ continuous-integration/drone/push Build is passing

Ok,这样我们就为 Gitea 搭建好了一个 Drone CI/CD 系统。