在 k3s 集群内部署 Gitea 和 Woodpecker CI,实现代码推送后自动构建镜像并部署到 k3s。
架构
1 | 开发者 → Gitea (代码托管) |
组件端口
| 组件 | HTTP 端口 | SSH 端口 | 命名空间 | 数据库 |
|---|---|---|---|---|
| Gitea | 30080 | 30022 | gitea | MySQL |
| Woodpecker Server | 30800 | - | woodpecker | SQLite |
| Woodpecker Agent | - | - | woodpecker | - |
| MySQL | - | - | mysql | - |
| Zot | 30500 | - | zot-registry | - |
当前状态
所有组件已部署并运行正常:
1 | gitea gitea-85857cdbb6-sszxv 1/1 Running (已连接 MySQL) |
快速开始
1. 访问 Gitea
直接访问 http://192.168.2.40:30080,Gitea 已自动完成初始化配置。
已自动配置的内容:
- ✅ 数据库:MySQL (mysql.mysql.svc.cluster.local:3306)
- ✅ 数据库名:gitea
- ✅ 数据库用户:gitea
- ✅ 仓库根路径:
/var/lib/gitea/git/repositories(存储在 Longhorn) - ✅ Git LFS 路径:
/var/lib/gitea/git/lfs(存储在 Longhorn) - ✅ 日志路径:
/var/lib/gitea/log(存储在 Longhorn) - ✅ 安装锁:已锁定(跳过安装向导)
首次登录:
- 访问
http://192.168.2.40:30080 - 点击 登录,然后点击 注册 创建第一个管理员账户
- 第一个注册的账户自动成为管理员
2. 配置 Gitea OAuth 应用
- 登录 Gitea 后,点击右上角头像 → 设置 → 应用 → 管理 OAuth2 应用
- 点击 创建新的 OAuth2 应用,填写:
- 应用名称:
Woodpecker CI - 重定向 URI:
http://192.168.2.40:30800/authorize - 保密性:保密(勾选)
- 应用名称:
- 创建后记录生成的 客户端 ID 和 客户端密钥
3. 更新 Woodpecker OAuth 配置
1 | cd /root/projects/woodpecker-deploy |
注意:
AGENT_SECRET_TOKEN是当前 Server 和 Agent 共享的密钥,如需更换需同时更新 Server 和 Agent 配置。
4. 配置 Zot 镜像仓库认证
如果 Zot 设置了用户名密码认证,需要创建 Kubernetes Secret:
1 | cd /root/projects/woodpecker-deploy |
如果 Zot 是公开访问(无认证),可以跳过此步骤。
5. 验证 Woodpecker 连接
访问 http://192.168.2.40:30800,使用 Gitea 账户登录。
- 首次登录会自动通过 OAuth 同步 Gitea 仓库
- 在 Repositories 页面可以看到已同步的仓库
- 点击仓库右侧的 启用 按钮激活 CI/CD
6. 部署示例应用
1 | cd /root/projects/sample-app |
推送后,在 Woodpecker UI 中启用该仓库,流水线会自动触发。
配置新应用
1. 创建流水线配置
在仓库根目录创建 .woodpecker.yml:
1 | steps: |
2. 在 Woodpecker 中启用仓库
- 访问
http://192.168.2.40:30800 - 点击 Sync 同步最新仓库
- 找到目标仓库,点击 Enable
3. 配置仓库 Secrets(可选)
在仓库设置 → Secrets 中添加:
| Secret 名称 | 值 | 说明 |
|---|---|---|
ZOT_HOST |
192.168.2.40:30500 |
Zot 仓库地址 |
REPO_NAME |
my-app |
镜像名称 |
APP_NAME |
my-app |
k8s Deployment 名称 |
4. 触发流水线
推送代码到 main 分支即可自动触发流水线。
目录结构
1 | ├── gitea-deploy/ # Gitea 部署文件 |
数据库信息
MySQL 配置
| 项目 | 值 |
|---|---|
| 服务地址 | mysql.mysql.svc.cluster.local:3306 |
| 数据库名 | gitea |
| 用户名 | gitea |
| 密码 | 默认密码 |
| Root 密码 | 默认密码 |
| 存储 | Longhorn (20Gi) |
安全提示:生产环境请修改默认密码,见
mysql-deploy/k8s/secret.yaml
Gitea 路径说明
所有数据路径都存储在 Longhorn 持久化卷中:
| 路径 | 用途 | 说明 |
|---|---|---|
/var/lib/gitea/git/repositories |
仓库根目录 | 存放所有 Git 仓库数据 |
/var/lib/gitea/git/lfs |
Git LFS 目录 | 存放大文件 (Git LFS 跟踪的文件) |
/var/lib/gitea/log |
日志目录 | Gitea 运行日志 |
/var/lib/gitea/data |
数据目录 | 附件、头像、Packages 等 |
Git LFS 是什么:Git Large File Storage,用于管理大文件(如图片、视频、二进制文件)的 Git 扩展。普通代码不需要 LFS,但如果仓库包含大文件,需要启用此功能。
常用命令
查看组件状态
1 | # 查看所有 Pod |
查看日志
1 | # Gitea 日志 |
重启组件
1 | # 重启 Gitea |
连接 MySQL
1 | # 进入 MySQL 命令行 |
技术说明
Woodpecker Agent 后端
当前使用 Kubernetes 后端,流水线步骤直接在 k3s 中创建 Pod 运行。
优点:
- 无需 Docker-in-Docker
- 更好的资源隔离
- 支持特权操作(通过配置)
配置:
- 任务命名空间:
woodpecker-jobs - 存储类:
longhorn - 存储大小:
5Gi
k3s 节点配置
由于 Zot 使用 HTTP 无 TLS,每个 k3s 节点需要配置 insecure 仓库:
1 | # 在每个节点上执行 |
故障排查
Gitea 无法连接数据库
-
检查 MySQL 是否运行:
1
kubectl get pods -n mysql
-
检查数据库凭据:
1
kubectl get secret -n mysql mysql-secret -o jsonpath='{.data}'
Woodpecker 无法连接 Gitea
-
检查 OAuth 配置是否正确:
1
kubectl get deployment woodpecker-server -n woodpecker -o jsonpath='{.spec.template.spec.containers[0].env}'
-
确认 Gitea 可访问:
1
curl http://192.168.2.40:30080
流水线失败:无法拉取镜像
-
检查 Zot 认证 Secret:
1
kubectl get secret zot-registry-secret -n woodpecker
-
确认 k3s 节点已配置 insecure 仓库
流水线失败:无法部署到 k8s
-
检查 RBAC 权限:
1
kubectl get role,rolebinding -n woodpecker
-
确认 ServiceAccount 正确配置
后续扩展
- 多环境部署:配置 dev/staging/prod 不同命名空间
- 镜像扫描:添加 Trivy 等安全扫描步骤
- 通知集成:配置钉钉/企业微信/邮件通知
- ArgoCD 集成:实现 GitOps 部署模式