基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成

WoodpeckerCI 是一个由社区维护的 DroneCI 分支,使用 Apache License 2.0 许可证发布 。社区版进一步扩展了 pipeline 的功能特性、支持对文件路径设置 pipeline 执行条件,并且可以与 Gitea 实现紧密集成 。不同的是,DroneCI 的配置文件是 .drone.yml,WoodpeckerCI 重命名为了 .woodpecker.yml 。好在 WoodpeckerCI 也兼容 DroneCI 的配置文件,迁移起来并不会太麻烦 。

基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成

文章插图
下面 , 我们以 try.gitea.io 服务器为例,实现 Gitea 与 WoodpeckerCI 的系统集成 。
系统结构
  • Gitea : VCS , 代码仓库 。
  • Server : 中心服务器,负责任务调度 。
  • Agent : 边缘节点,执行 Pipeline 的具体任务 。
用户将代码推送到 Gitea 时触发 Webhook,调动 WoodpeckerCI 从 Gitea 拉取最新的代码并根据 .woodpecker.yml 描述文件执行 CI 流水线 。
基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成

文章插图
网络结构由于 CI 任务的特殊性 , 工作繁忙时会占用较多的系统资源,因此为了提高系统整体可靠性,不建议将 Gitea、WoodpeckerCI Server 和 Agent 安装在同一台服务器上 。
  • 在本地局域网搭建时应该确保以上服务可以通过域名、IP 互相访问 。例如:gitea.example.com -> 192.168.3.10ci.example.com-> 192.168.3.20agent.example.com -> 192.168.3.30
  • 如需使用 docker compose 在本地开发环境搭建整套系统,可以阅读参考官方手册:
    https://woodpecker-ci.org/docs/administration/setup
准备工作在 Gitea 上创建 OAuth2 应用程序在本例中,WoodpeckerCI 基于 OAuth2 认证授权访问您的 Gitea API 。您可以创建一个专用于 CI 的账号 , 并将该账号添加为代码仓库协作者或者组织管理员 。
首先 , 登录一个您要用于集成 WoodpeckerCI 的 Gitea 账号,进入 设置 - 应用,创建一个 Gitea OAuth2 应用程序 。
  • 应用名称 : 您可以任取一个名字,此案例中我们填写 WoodpeckerCI
  • 重定向 URL : 授权回调 URL,例如 https://<host>/authorize

基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成

文章插图
修改 Gitea 服务器的 Webhook 白名单出于安全考虑,Gitea 默认禁止触发外部主机的 Webhook 。您可以将外部主机添加到 webhook.ALLOWED_HOST_LIST 白名单来解除这一限制 。请参考文档 Webhook 了解具体方法 。
修改配置时 , 打开 conf/app.ini,添加 ALLOWED_HOST_LIST = *[webhook] 栏目中,并重启 Gitea 服务器 。例如:
[webhook]ALLOWED_HOST_LIST = *创建共享密钥共享密钥用于 WoodpeckerCI Server 和 Agent 之间的通信认证 。记录下您创建的共享密钥,稍后在安装 WoodpeckerCI Server 和 Agent 时将使用此密钥填充环境变量 WOODPECKER_AGENT_SECRET
您可以使用 OpenSSL 生成随机的长度为 32 位的十六进制共享密钥:
$ openssl rand -hex 32c5704bc389f1e3d47f1c4751d1295c86使用 Docker 安装 WoodpeckerCI 服务器和 AgentWoodpeckerCI 服务器是一个轻量级的 Docker 容器 , 使用 SQLite 作为默认数据库,支持通过环境变量动态设定运行参数 。有关配置参数的完整列表,请参阅 WoodpeckerCI 服务器配置文档 。
环境变量
  • WOODPECKER_OPEN : 默认 false 。是否开放注册 。
  • WOODPECKER_HOST : 默认空 。设置服务器访问地址,例如 http://ci.example.com
  • WOODPECKER_GITEA : 默认 false 。启用 Gitea 驱动 。
  • WOODPECKER_GITEA_UR : 默认 https://try.gitea.io 。配置 Gitea 服务器地址 。
  • OODPECKER_GITEA_CLIENT : 默认空 。配置 Gitea OAuth 客户端 ID
  • WOODPECKER_GITEA_SECRE : 默认空 。配置 Gitea OAuth 客户端密钥
  • WOODPECKER_GITEA_SKIP_VERIFY : 默认 false 。不验证 SSL 证书有效性 。
  • WOODPECKER_SERVER : 默认空 。WoodpeckerCI 主服务器地址 。
  • WOODPECKER_AGENT_SECRET : 默认空 。WoodpeckerCI 服务器之间的共享密钥 。可以使用命令 openssl rand -hex 32 生成 。
启动服务器为了便于修改容器参数,我们创建一个 docker-compose.yml 模板来配置 WoodpeckerCI 服务器容器 。
根据下面的 Docker Compose 模板,使用命令 docker compose up -d 启动 WoodpeckerCI 服务器 。
# docker-compose.ymlversion: '3'services:woodpecker-server:image: woodpeckerci/woodpecker-server:latestports:- 8000:8000volumes:- woodpecker-server-data:/var/lib/woodpecker/environment:- WOODPECKER_OPEN=true- WOODPECKER_HOST=${WOODPECKER_HOST}- WOODPECKER_GITEA=true- WOODPECKER_GITEA_URL=${WOODPECKER_GITEA_URL}- WOODPECKER_GITEA_CLIENT=${WOODPECKER_GITEA_CLIENT}- WOODPECKER_GITEA_SECRET=${WOODPECKER_GITEA_SECRET}- WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}woodpecker-agent:image: woodpeckerci/woodpecker-agent:latestcommand: agentrestart: alwaysdepends_on:- woodpecker-servervolumes:- /var/run/docker.sock:/var/run/docker.sockenvironment:- WOODPECKER_SERVER=woodpecker-server:9000- WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}volumes:woodpecker-server-data:

推荐阅读