6

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

 1 year ago
source link: https://www.cnblogs.com/Gitea/p/drone.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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 流水线。

2956540-20220920131322349-395401470.png

由于 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 服务器。例如:

[webhook]
ALLOWED_HOST_LIST = *

创建共享密钥

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

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

$ 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 服务器。

# 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
  • 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。

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 建立连接。

$ 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 不匹配,请重新检查。

2956540-20220920115519753-1146614566.png
2956540-20220920115532205-1539030682.png

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

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

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

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

.drone.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 任务。

2956540-20220920120609519-1075082240.jpg

回到 Gitea 可以看到构建完成后显示的消息:

✔ continuous-integration/drone/push Build is passing
2956540-20220920120011729-849477881.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK