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://<host>/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://<host>: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

基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成的更多相关文章

  1. DevOps实践之一:基于Docker构建企业Jenkins CI平台

    基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  2. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  3. Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务

    本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...

  4. 【docker构建】基于docker构建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  5. 基于MRS-ClickHouse构建用户画像系统方案介绍

    业务场景 用户画像是对用户信息的标签化.用户画像系统通过对收集的各维度数据,进行深度的分析和挖掘,给不同的用户打上不同的标签,从而刻画出客户的全貌.通过用户画像系统,可以对各个用户进行精准定位,从而将 ...

  6. Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_196 Python自动化,大概也许或者是今年最具热度的话题之一了.七月流火,招聘市场上对于Python自动化的追捧热度仍未消减,那 ...

  7. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作

    一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...

  8. 基于docker构建jenkins和svn服务(转)

    码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有. jenkins可能很多人都不了解.这是一个持续集成的工具,在敏捷开发领域很流行:跟svn结合可以实现定期build.check ...

  9. 基于 Docker 构建企业 Jenkins CI平台

    持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous Deployment,CD):部 ...

随机推荐

  1. React报错之React hook 'useState' cannot be called in a class component

    正文从这开始~ 总览 当我们尝试在类组件中使用useState 钩子时,会产生"React hook 'useState' cannot be called in a class compo ...

  2. 页面POST请求302重定向解决方案

    一.在后端Middleware中判断如果是post请求,返回json格式 二.前端全局js中捕获ajax请求进行处理

  3. Html飞机大战(二):面向对象绘制背景

    好家伙, 我们为了后续工作的顺利进行,我试着把每一个模块封装为对象 但冻手之前还是要构思一下 我们把天空封装成一个类: 1.来搞一手简单的对象分析:  属性方面的都好理解 来说明一下方法: (1) p ...

  4. 第八十一篇:Vue购物车(二) 名称,图片,价格的渲染

    好家伙, 1,为组件封装属性, 需要封装以下属性: 需要定义的属性 属性名 值的类型 商品名 title String 商品图片 pic String 商品价格 price Number 是否勾选 s ...

  5. docker注册中心相关操作

    相关命令详解 (1)push推送 将镜像推送到由其名称或标签指定的仓库中.与pull命令相对. [root@docker ~]# docker push --help Usage: docker pu ...

  6. 第五章 部署master主控节点

    一.部署etcd集群 1.1 集群规划 主机名 角色 IP hdss7-12 leader 10.4.7.12 hdss7-21 follow 10.4.7.21 hdss7-22 follow 10 ...

  7. KingbaseES V8R3 集群专用机网关失败分析案例

    ​ KingbaseES R3集群网关检测工作机制: 1.Cluster下watchdog进程在固定间隔时间,通过ping 网关地址监控链路的连通性,如果连通网关地址失败,则修改cluster sta ...

  8. 创建一个k8s私有仓库-harbor

    〇.前言 这一步应该是在搭建k8s之前做好,注意了奥 一.安装docker和docker-compose 1.下载docker-compose的最新版本 # 建议那种网上冲浪下载!,下载下来记得命名成 ...

  9. 面试突击83:什么情况会导致@Transactional事务失效?

    一个程序中不可能没有事务,而 Spring 中,事务的实现方式分为两种:编程式事务和声明式事务,又因为编程式事务实现相对麻烦,而声明式事务实现极其简单,所以在日常项目中,我们都会使用声明式事务 @Tr ...

  10. WSUS无法发现客户端

    这几天遇到一个问题,刚装好的WSUS服务器同步完补丁后,打算上线使用.挑了几个客户端,使用注册表配置了WSUS,但是迟迟无法在控制台上看到这些客户端.由于部分客户端不在域中,无法使用组策略配置,就写了 ...