最近开源了一个挂机冒险游戏《模拟龙生》,有热心同学不仅帮忙做优化,还连夜在给游戏加页面,泪目。详见文末小结部分。

一、前言

大家好,这里是白泽。这篇文章是《Woodpecker CI 设计分析》的续接,将通过阅读 Woodpecker 和 Gitea 的源代码,解决前一篇文章最后遗留的问题,并最终实现本地部署 Woodpecker 和 Gitea,实现持续集成(CI)全流程使用开源技术,极限降本。

遗留问题:

通过 docker-compose 部署 Woodpecker 并将 GitHub 作为 Forge 平台,模拟 CI 流程的时候,遇到了一个告警:提示创建 webhook 需要一个公共可访问的 Host 地址,本地部署的 Woodpecker 无法通过 webhook 监听 GitHub 中 repo 的变动,也就无法使用持续集成的能力了。

因此这里将架构图中的 Forge 部分的 GitHub 源换成 Gitea 源,全部使用开源项目,彻底拥抱开源,极限降本。

二、本地部署 Gitea

访问 Gitea 的官方文档,找到 Installation with Docker 部分的内容:

version: "3"

networks:
gitea:
external: false services:
server:
image: gitea/gitea:main-nightly
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"

通过 docker-compose 部署运行:

docker-compose up -d

访问 http://0.0.0.0:3000 后,点击安装,然后注册用户,便可以进入到 Gitea 的使用页面,到现在为止看似没有任何问题

三、OAuth 是什么

在 GitHub/Gitea 的上下文中,OAuth App 是一种允许开发者使用 GitHub/Gitea 用户帐户进行身份验证和访问的应用程序。开发者可以创建自己的 OAuth App,并通过 GitHub/Gitea 的 OAuth 流程获得对用户帐户的有限访问权限。

OAuth App 在 GitHub/Gitea 上注册后,会获得一个客户端 ID 和一个客户端密钥(Client Secret)。这些凭据用于在用户授权后获取访问令牌,以便应用程序可以代表用户执行某些操作。

在当前场景中,Woodpecker 为了获得访问 Gitea 的能力(监听仓库变动等),需要在 Gitea 的 Setting 注册一个 Oauth App。

这里的 Client IDClient Secret 将用于下一节 Woodpecker 的部署。并且 Redirect URI 设置为 Woodpecker 的授权地址。

这里涉及到一些配置均是与 OAuth2 授权流程相关的,包括下文部署 Woodpecker 的时候,也会涉及。

由于篇幅原因,下一篇文章我将讲解在本地部署成功后,使用 Gitea 用户登录 Woodpecker 平台时,OAuth2 认证的流程,以解释这些配置的作用。这里按下不表,先照着操作即可。

四、本地部署 Woodpecker

由于《Woodpecker CI 设计分析》这篇文章已经讲解了如何通过 docker-compose 本地部署,这里不再赘述这种方式,但出于学习目的,这里我们通过项目源代码进行编译运行。

相比 docker,单步调试能帮助你快速理清楚开源项目的流程。

4.1 部署 & 运行

  • 克隆项目
git clone git@github.com:woodpecker-ci/woodpecker.git
  • 查看 Woodpecker 的文档,找到 Preparation for local development

很多同学学习或者参与开源项目的第一步就被拦住了,如何成功本地编译运行一个开源项目,是成功的一半,接下来跟着白泽一步一步阅读文档,希望你今后也能独立完成启动其他项目的流程。

  1. 要求 Golang >= 1.20 版本。
  2. Install make:make 是一个构建工具,用于自动化项目的编译和构建过程。它通常使用名为 Makefile 的文件来定义一系列规则和依赖关系,以描述如何生成目标文件(通常是可执行文件或库)。
  3. Install Node.js & pnpm:需要 Node 环境,以及 Node 的包管理工具 pnpm,也是按照文档要求安装即可。
  4. 最重要的:在项目根目录创建 .env 文件,存放配置变量,下面是白泽创建的配置列表,照着官方文档的改,除了要修改 HOST 相关变量,还要注意将 GitHub 源切换成 Gitea 源。
WOODPECKER_OPEN=true
WOODPECKER_ADMIN=baize # if you want to test webhooks with an online forge like GitHub this address needs to be accessible from public server
WOODPECKER_HOST=http://0.0.0.0:8000 # github (sample for a forge config - see /docs/administration/forge/overview for other forges)
-WOODPECKER_GITHUB=true
-WOODPECKER_GITHUB_CLIENT=<redacted>
-WOODPECKER_GITHUB_SECRET=<redacted>
+WOODPECKER_GITEA=true
+WOODPECKER_GITEA_URL=http://0.0.0.0:3000
+WOODPECKER_GITEA_CLIENT=<redacted>
+WOODPECKER_GITEA_SECRET=<redacted> # agent
WOODPECKER_SERVER=0.0.0.0:9000
WOODPECKER_AGENT_SECRET=a-long-and-secure-password-used-for-the-local-development-system
WOODPECKER_MAX_WORKFLOWS=1 # enable if you want to develop the UI
# WOODPECKER_DEV_WWW_PROXY=http://0.0.0.0:8010 # used so you can login without using a public address
WOODPECKER_DEV_OAUTH_HOST=http://0.0.0.0:8000 # disable health-checks while debugging (normally not needed while developing)
WOODPECKER_HEALTHCHECK=false # WOODPECKER_LOG_LEVEL=debug
# WOODPECKER_LOG_LEVEL=trace
  1. 编译启动项目(前一篇文章已经讲过 Woodpecker 的架构图了,server & agent 的概念不再赘述),当然这篇文章的第二张图片是帮助大家回忆的 Woodpecker 架构图。
# 启动server服务
go run ./cmd/server/main.go
# 启动agent服务
go run ./cmd/agent/main.go

4.2 使用

  • 访问 http://0.0.0.0:8000 进入 Woodpecker 登录页面,点击 Login 图标。 但是再次返回到这个页面,无法跳转至 Gitea 授权认证页面!

4.2.1 docker 运行的弊端

还记得这篇文章在通过 docker-compose 部署 Gitea 成功后,白泽提了一句看似没有任何问题

由于白泽已经踩过坑了,因此上文 Woodpecker 已经是本地编译运行的,也是方便你接下来跟着我单步调试。要是 Woodpecker 也用 docker 部署,一旦遇到问题,看 docker 日志排错效率太低了!

# 在点击Login未果后,我们在server端的控制台看到了包含这条信息的日志,全局搜索到它的位置,定位到错误日志的打印函数,从而定位到断点应该打在哪里
cannot authenticate user

接下来需要你以 debug 的形式启动 Woodpecker Server 以及 Agent,在 ./server/router/router.go#64 行打下断点。

重新访问 http://0.0.0.0:8000 点击 Login,然后跟踪 Woodpecker Server 的断点。

我们发现是 froge.Login() 这个方法运行的到了 err,所以去查看针对 Gitea 的方法实现: server/forge/gitea/gitea.go:119

由于 Woodpecker Server 错误日志提示当前 Gitea 的版本是 dev,不由得让白泽联想,莫非是两个开源项目之间有版本依赖的联系!

带着一些信息,我们打断点到这个函数。

// code.gitea.io/sdk/gitea@v0.17.1/version.go:91
func (c *Client) checkServerVersionGreaterThanOrEqual(v *version.Version) error {
if c.ignoreVersion {
return nil
}
// 向 Gitea 发送 Http 请求,获取 version
if err := c.loadServerVersion(); err != nil {
return err
}
// 对比是否大于等于1.11.0(development)无法比较
if !c.serverVersion.GreaterThanOrEqual(v) {
c.mutex.RLock()
url := c.url
c.mutex.RUnlock()
return fmt.Errorf("gitea server at %s is older than %s", url, v.Original())
}
return nil
}

然后就有了日志中的 ErrUnknownVersion development 这个错误。

由于通过 docker-compose 部署 Gitea 的时候用的是 main 分支的最新内容,在获取 version 的时候,得到了字符串 development 而非一个具体的发布版本号。这里我们查看一下 Gitea 的 main 分支的 version,信息对称。

程序员的幸福时刻:这程序如我所愿!

解决方案:

  • 本地运行 Gitea,将这个配置改成一个数值型的。
  • 还是通过 docker-compose 部署 Gitea,但是将镜像版本设定为 >= 1.11.0 的发布版,而非开发版即可,比如 image: gitea/gitea:1.21.4 即可。

4.2.2 用 Gitea 账户登录 Woodpecker

  • 输入 Gitea 用户名密码(需要提前在 Gitea 中注册,当然你能创建 OAuth App 自然已经有了账户)。

  • 授权 woodpecker-test-app 应用访问 Gitea。

  • 登录成功,进入 Woodpecker 管理页面,此时显示 Gitea 登录账号的 Repo 列表,空空如也(毕竟 Gitea 都是刚部署的,Repo 还没有创建过)。

  • Gitea 创建 test-repo

官方文档:When you activate your repository, Woodpecker automatically adds webhooks to your forge (e.g. GitHub, Gitea, ...).

所以可以编写 pipeline 配置文件,去触发 webhook 了。

4.2.3 Woodpecker + Gitea 实现 CI

  • test-repo 写了一个 hello world 打印函数和一个单元测试。

  • test-repo 的根目录创建 .woodpecker/build.yaml:内容就打印一句日志。
steps:
build:
image: debian:stable-slim
commands:
- echo building
- sleep 5
  • 将代码推送到 Gitea,在 Woodpecker 页面点击 Run pipeline

  • 提示无法连接到 http://localhost:3000/baize/test-repo.git/ 这个仓库,当然现在我们已经确保的是:Woodpecker 是可以访问到 Gitea 的,毕竟都拉取到了 baize 这个账号创建的 test-repo

此时 Woodpecker Server 的日志:

此时 Woodpecker Agent 的日志:

  • 为了解决问题:必须要探究 pipeline 运行函数的实现!毕竟直接看这日志太过抽象,还是得打断点。

有了上面打断点调试的经验,这里发生问题我们不用慌乱,休息一下,下篇文章白泽带你解析 Woodpecker 的核心机制:Pipeline 运行逻辑。

五、小结

未完待续,欢迎追更。

公众号 「白泽talk」,我也开源了一个 Go 学习仓库:包含 Go 各阶段学习文章、读书笔记、电子书、简历模板等,欢迎 star。

最近开源了一个挂机冒险游戏《模拟龙生》,还有热心同学不仅帮忙做优化,还连夜在给游戏加页面,泪目。

现在游戏体量只有500-600行代码,感兴趣的同学可以一起来维护。游戏的大致玩法在这篇文章中。后续游戏有阶段性变化功能合入主分支,则会继续通过文章向各位介绍使用的技术和玩法。(学习娱乐两不误)

下一步的计划是添加本地存档功能,预计今天完成。

白泽目前正在打造一个氛围良好的行业交流群(游戏交流群),文章的更新也会提前预告,欢迎加入:622383022。

使用 Woodpecker 与 Gitea 搭建纯开源的 CI 流程|极限降本的更多相关文章

  1. 【转】使用Apache Kylin搭建企业级开源大数据分析平台

    http://www.thebigdata.cn/JieJueFangAn/30143.html 本篇文章整理自史少锋4月23日在『1024大数据技术峰会』上的分享实录:使用Apache Kylin搭 ...

  2. OpenWrt上搭建纯L2TP服务器[ZT]

    转自:http://www.openwrt.pro/post-389.html 纯L2TP(l2tp + ppp,无IPSec) 首先安装xl2tpd软件包 opkg update opkg inst ...

  3. 基于Gitea搭建属于自己的Git服务

    作者:IT王小二 博客:https://itwxe.com 一.搭建环境和前提 搭建环境: 操作系统:CentOS7.6 Docker版本:docker-ce-18.09.9 Lsky Pro版本:1 ...

  4. 使用Jenkins搭建iOS开发的CI服务器

    目录 简介     下载并运行     Jenkins配置         安装git插件         E-mail设置     自动化构建         远程仓库设置         触发条件 ...

  5. [GitHub]第六讲:开源项目贡献流程

    Github 是目前世界上最大的开源项目的托管交流平台.贡献开源项目的流程也是 Github 全力支持的,也一样是遵循 Github Flow,虽然跟前面团队合作流程会有一点差别.在团队内部,大家都是 ...

  6. 利用vue-cli配合vue-router搭建一个完整的spa流程

    好文章备忘录: 转自:https://segmentfault.com/a/1190000009160934?_ea=1849098 demo源码:https://github.com/1590123 ...

  7. 纯PHP Codeigniter(CI) ThinkPHP效率测试

    最近一直想做一个技术类的新闻站点,想做的执行效率高些,想用PHP做,一直纠结于用纯PHP做还是用CI或者THINKPHP.用纯PHP效率高,缺点 n多,比如安全方面.构架方面等等等等:用CI.thin ...

  8. CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址、服务启动等)

    CentOS Linux搭建独立SVN Server全套流程(修改svn仓库地址.服务启动等) 原 一事能狂便少年 发布于 2016/12/27 11:16 字数 1113 阅读 1.3K  收藏 0 ...

  9. Docker搭建自己的Gitlab CI Runner

    转载自:https://cloud.tencent.com/developer/article/1010595 1.Gitlab CI介绍 CI:持续集成,我们通常使用CI来做一些自动化工作,比如程序 ...

  10. EazyUI主页框架搭建纯JS样例

    採用Jfinal+EazyUI  执行起来就好能够了 眼下还未增加后台代码  纯JS代码搭建的一个二级菜单+主页 客户换肤, 给使用EazyUI的新人一个高速可用的JS 搭建界面 也给自己保存下 界面 ...

随机推荐

  1. Python subprocess 使用(一)

    Python subprocess 使用(一) 本文主要讲下 subprocess 的简单使用. 1: 通过subprocess 获取设备信息 import subprocess def get_an ...

  2. 前端 Git 使用约定

    前端 Git 使用约定 背景 开发前端项目,有以下困惑: 使用哪个分支开发,哪个分支发布 修复线上bug的流程是什么,如何避免修复完了下次却又出现了 cms分支有十多个,是否都有用 如何快速找到之前某 ...

  3. 【scikit-learn基础】--『监督学习』之 随机森林回归

    随机森林回归(Random Forest Regression)是一种在机器学习领域广泛应用的算法,由美国科学家 Leo Breiman 在2001年提出.它是一种集成学习方法,通过整合多个决策树的预 ...

  4. MySQL的事务(看看也许有帮助呢)

    MySQL的事务 一.事务的概念 在MySQL中,只有InnoDB存储引擎才支持事务. 事务的处理用来维护数据库数据的完整性,保证同一个事务里的一批SQL语句,要么全部执行,要么全部不执行. 事务用来 ...

  5. 关于向上转型以及向下转型、instanceof的一些应用。

    一.前言 在Java编程中,我们常常遇到各种类型转换的情况,尤其是在处理继承关系的类时.本文将深入探讨Java中的向上转型(upcasting).向下转型(downcasting)以及instance ...

  6. 21、Scaffold属性 FloatingActionButton实现类似闲鱼App底 部导航凸起按钮

    FloatingActionButton详解 FloatingActionButton简称FAB ,可以实现浮动按钮,也可以实现类似闲鱼app的底部凸起导航   实现类似闲鱼App底部导航凸起按钮 c ...

  7. ChatGPT 同类工具推荐

    原文: https://openaigptguide.com/chatgpt-similar%20software/ ChatGPT是一款由美国OpenAI公司开发的人工智能语言模型,类似的软件有: ...

  8. 带你了解TensorFlow pb模型常用处理方法

    摘要:TensorFlow 模型训练完成后,通常会通过frozen过程保存一个最终的pb模型. 本文分享自华为云社区<TensorFlow pb模型修改和优化>,作者:luchangli. ...

  9. 实践丨手把手教你用STM32设计WiFi语音播报日程表

    摘要:随着电子产品的发展,数字日程表这项应用在人们工作和生活中起到越来越重要的作用.本文带领大家基于STM32自己动手制作一个WiFi语音播报日程表. 本文分享自华为云社区<基于STM32设计的 ...

  10. openGauss内核:简单查询的执行

    摘要:本文主要分析简单查询语句在业务处理线程Postgres上的执行流程,并介绍如何利用gdb梳理代码逻辑. 本文分享自华为云社区<openGauss内核分析(二):简单查询的执行>,作者 ...