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


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

    下面,我们以 try.gitea.io 服务器为例,实现 Gitea 与 WoodpeckerCI 的系统集成。

    系统结构

    • Gitea : VCS,代码仓库。
    • Server : 中心服务器,负责任务调度。
    • Agent : 边缘节点,执行 Pipeline 的具体任务。

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

    网络结构

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

    • 在本地局域网搭建时应该确保以上服务可以通过域名、IP 互相访问。例如:
      gitea.example.com -> 192.168.3.10
      ci.example.com    -> 192.168.3.20
      agent.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:///authorize

    修改 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 32
    c5704bc389f1e3d47f1c4751d1295c86
    

    使用 Docker 安装 WoodpeckerCI 服务器和 Agent

    WoodpeckerCI 服务器是一个轻量级的 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.yml
    version: '3'
    
    services:
      woodpecker-server:
        image: woodpeckerci/woodpecker-server:latest
        ports:
          - 8000:8000
        volumes:
          - 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:latest
        command: agent
        restart: always
        depends_on:
          - woodpecker-server
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          - WOODPECKER_SERVER=woodpecker-server:9000
          - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}
    
    volumes:
      woodpecker-server-data:
    

    初始化 WoodpeckerCI

    登录 WoodpeckerCI 网页面板,http://:8000,点击 login 跳转到 Gitea 授权页面,点击应用授权

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

    CI 实操:创建 .woodpecker.yml 验证 Pipeline

    WoodpeckerCI 基于 Docker 实现了对各种编程语言和包管理工具的流水线支持。这部分在官方的使用说明中有完整详细的介绍:

    https://woodpecker-ci.org/docs/usage/intro

    这里我们以 Golang + Node.js 的项目为例,在 Gitea 仓库根目录创建一个 .woodpecker.yml 作为我们自定义的流水线。示范:

    # .woodpecker.yml
    pipeline:
      backend:
        image: golang
        commands:
          - go build
          - go test
      frontend:
        image: node
        commands:
          - npm install
          - npm run test
          - npm run build
    

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

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

    ✔ ci/woodpecker/push/woodpecker Build is passing
    
  • 相关阅读:
    k8s pod 绑核
    敏捷发布列车初探3 ---- Agile Release Train
    【JavaScript进阶之旅 ES6篇 第九章】对象密封的四种方式、is()、assign()、取值函数的拷贝
    Linux入门攻坚——3、基础命令学习-文件管理、别名、glob、重定向、管道、用户及组管理、权限管理
    PyCharm安装教程
    神经网络物联网未来发展趋势怎么样
    重温FPGA开发37
    信息抽取(UIE)技术:让保险理赔信息处理流程便捷高效
    【owt】owt-client-native-p2p-e2e-test vs2017构建2 :测试单元构建及运行
    【SpringMVC】_设置响应状态码与Header
  • 原文地址:https://www.cnblogs.com/Gitea/p/woodpecker.html