基于 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://<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 实现了对各种编程语言和包管理工具的流水线支持。这部分在官方的使用说明中有完整详细的介绍:
这里我们以 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 集成的更多相关文章
- DevOps实践之一:基于Docker构建企业Jenkins CI平台
基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- 视频私有云实战:基于Docker构建点播私有云平台
私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- 【docker构建】基于docker构建wordpress博客网站平台
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...
- 基于MRS-ClickHouse构建用户画像系统方案介绍
业务场景 用户画像是对用户信息的标签化.用户画像系统通过对收集的各维度数据,进行深度的分析和挖掘,给不同的用户打上不同的标签,从而刻画出客户的全貌.通过用户画像系统,可以对各个用户进行精准定位,从而将 ...
- Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_196 Python自动化,大概也许或者是今年最具热度的话题之一了.七月流火,招聘市场上对于Python自动化的追捧热度仍未消减,那 ...
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作
一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...
- 基于docker构建jenkins和svn服务(转)
码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有. jenkins可能很多人都不了解.这是一个持续集成的工具,在敏捷开发领域很流行:跟svn结合可以实现定期build.check ...
- 基于 Docker 构建企业 Jenkins CI平台
持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous Deployment,CD):部 ...
随机推荐
- github action 实现CI/CD
两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库 1.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试. ...
- NOI2021 同步赛游记
写在前面的话 为什么叫游记呢?因为我第一天是在划水中度过的,错过了对原题的发现. O n e I n D a r k \tt OneInDark OneInDark 无比风光地去了浙江,却倒霉地遇上了 ...
- C#基础_C#计算样本标准差和总体标准差
首先我们先了解样本标准差和总体标准差: 样本标准差=方差的算术平方根=s=sqrt(((x1-x)^2 +(x2-x)^2 +......(xn-x)^2)/(n-1)) 总体标准差=σ=sqrt(( ...
- 第七十一篇:Vue组件的私有和全局注册
好家伙, 1.组件的父子关系 我们封装三个组件,分别为left组件,right组件和App组件 在封装时: 在封装时,彼此的关系是独立的,并不存在父子关系 在使用时: 在使用时,根据彼此的嵌套关系,形 ...
- SpringMVC 04: SpringMVC中4种页面跳转方式
转发和重定向的页面跳转方式 页面跳转方式,本质上只有2种方式:转发 + 重定向 但在SpringMVC的具体实现上,转发可以细分为:普通的页面转发 + 经由action方法的页面转发 重定向可以细分为 ...
- KingbaseES 的闪回查询
KingbaseES V008R006C006B0013版本新增支持闪回查询,闪回版本查询.闪回表到指定时间点.旧版本已支持闪回回收站技术. 闪回技术(闪回查询和闪回表到指定时间点)可以通过时间戳和C ...
- Kingbase V8R6集群安装部署案例---脚本在线一键扩容
案例说明: KingbaseES V8R6支持图形化方式在线扩容,但是在一些生产环境,在服务器不支持图形化界面的情况下 ,只能通过脚本命令行的方式执行集群的部署或在线扩容. Tips: Kingbas ...
- etcd v3版本生产级集群搭建以及实现一键启动脚本
本专栏的上一篇文章写了<长篇图解etcd核心应用场景及编码实战>,本文继续.后续计划章节内容如下: <长篇图解etcd核心应用场景及编码实战> <搭建高可用etcd集群& ...
- CSS之垂直水平居中的背后
最开始,我想说,这个体系有点大,我写的并不好.就当作是一个思路吧,虽然这个思路有点乱.几乎每一个实现方案的背后都是该属性及其组合的原理,每一个都要剖析其规范细节的话,这篇文章绝不会是这样的篇幅,所以每 ...
- Kubernetes 版本升级之路
把一个集群从1.22版升级到1.23版. 前提条件 确保备份所有重要组件,例如存储在数据库中的应用状态.Kubernetes 升级不涉及正常的工作负载,只涉及与 Kubernetes 相关的组件,但备 ...