云主机搭建代码仓库和CI流水线,完全可行,而且对中小团队来说,比自建物理服务器或全托管SaaS更划算。核心答案是:用一台2核4G的云主机,装好Docker,跑一个Gitea(或轻量版GitLab),再配一个Drone或Woodpecker,就能拥有属于自己的代码托管和自动构建环境,月成本通常控制在几十到一百元内。
云主机搭建代码仓库和CI流水线:选型与成本
很多团队问,云主机搭建代码仓库和CI流水线,是不是非要高配置?其实不然,代码仓库本身对资源消耗很低,真正吃资源的是CI构建过程,所以选型的关键在于明确你的构建任务有多重。
代码仓库选型:Gitea vs GitLab CE
主流自托管代码仓库就两个方向:Gitea和GitLab CE,Gitea用Go语言编写,单二进制文件,内存占用极小,2G内存的云主机跑Gitea毫无压力,GitLab CE功能更全,自带CI/CD,但依赖重,官方推荐至少4G内存,行业共识认为,如果团队规模在50人以内,且没有重度代码审查需求,Gitea是更轻的选择。
这里有个实用的对比表格:
| 特性 | Gitea | GitLab CE |
|---|---|---|
| 内存占用(空闲) | 约200-400MB | 约1-2GB |
| 安装复杂度 | 极低,一个二进制或Docker容器 | 较高,依赖PostgreSQL、Redis等 |
| 自带CI | 需要外接(Drone/Woodpecker) | 内置,但配置复杂 |
| 适合场景 | 中小团队、个人项目 | 需要完整DevOps流程的团队 |
我的建议是,如果你已经在用Gitea,那么CI流水线千万别选GitLab自带的,因为那等于又背了一个重包袱,更顺手的做法是给Gitea配一个轻量级CI工具。
轻量级CI/CD工具推荐:Drone与Woodpecker
Drone是较早流行的云原生CI工具,跟Docker结合紧密,每个构建步骤都是一个容器,Woodpecker则是Gitea社区孵化的项目,原生支持Gitea,配置语法更简单,行业共识认为,这两者都是轻量级CI/CD工具的典型代表,比Jenkins轻太多,启动速度以秒计。
具体选哪个?如果你的构建环境以Docker为主,选Drone很顺滑,如果你想跟Gitea深度绑定,减少额外认证配置,Woodpecker更省心,我个人倾向Woodpecker,因为它的流水线配置是纯YAML,没有Drone那种依赖Docker in Docker的坑。

云主机搭建代码仓库和CI流水线实操:从零到能跑
下面给出一套经过验证的步骤,假设你的云主机是Ubuntu 22.04,已经装好Docker和docker-compose,全程不需要安装Git,因为运行在容器里。
第一步:部署Gitea容器
创建目录 mkdir -p /opt/gitea,然后写一个 docker-compose.yml:
services:
gitea:
image: gitea/gitea:1.21
container_name: gitea
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__server__ROOT_URL=http://你的云主机IP:3000
volumes:
- /opt/gitea/data:/data
ports:
- "3000:3000"
执行 docker-compose up -d,然后访问 http://IP:3000,填写初始配置,注意把ROOT_URL改成你的实际域名或IP,不然SSH克隆会出错。
第二步:部署Woodpecker CI
Woodpecker需要两个服务:server(管理界面)和agent(执行构建),同样用docker-compose文件:
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:2.5
environment:
- WOODPECKER_OPEN=true
- WOODPECKER_GITEA=true
- WOODPECKER_GITEA_URL=http://gitea:3000
- WOODPECKER_GITEA_CLIENT_ID=你的ID
- WOODPECKER_GITEA_CLIENT_SECRET=你的密钥
- WOODPECKER_HOST=http://你的云主机IP:8000
volumes:
- /opt/woodpecker/server:/var/lib/woodpecker
ports:
- "8000:8000"
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:2.5
command: agent
environment:
- WOODPECKER_SERVER=woodpecker-server:9000
- WOODPECKER_AGENT_SECRET=你的共享密钥
volumes:
- /var/run/docker.sock:/var/run/docker.sock
这里的关键是去Gitea后台创建一个OAuth应用,拿到client_id和secret,具体路径:管理员设置 -> 应用 -> 创建新OAuth2应用,回调地址填 http://你的云主机IP:8000/authorize。
第三步:写第一个流水线文件
在项目的根目录创建 .woodpecker.yml:
when:
- event: push
steps:
build:
image: node:18-alpine
commands:
- npm install
- npm run build
deploy:
image: alpine:3.18
commands:
- apk add rsync
- rsync -avz --delete dist/ user@部署服务器:/var/www/html/
secrets: [DEPLOY_KEY]

推送代码到Gitea仓库,Woodpecker会自动触发流水线,这里有个技巧:部署步骤需要SSH密钥,把密钥配置为Woodpecker的secret变量,不要在YAML里写明文。
云服务器配置要求高吗?低配云主机的优化技巧
这是大家问得最多的问题:云服务器配置要求高吗?答案是,对于纯代码仓库和CI流水线,2核4G的入门型云主机绰绰有余,但前提是要做点优化。
限制CI构建的并发度
Woodpecker默认允许并发执行多个流水线,如果团队多人同时推送,4G内存很容易被多个Node或Java构建任务挤爆,在agent的环境变量中设置 WOODPECKER_MAX_WORKFLOWS=1,让每次只跑一个构建,虽然会排队,但保证了稳定性,业内专家指出,很多低配云主机崩溃不是资源不够,而是并发没控制好。
给Docker设置内存限制
在Docker的daemon配置 /etc/docker/daemon.json 里加上:
{
"max-concurrent-downloads": 3,
"max-download-attempts": 3
}
再在agent启动时加上 --memory=1g --memory-swap=1g,让构建容器最多使用1G内存,这样就算某个构建脚本有内存泄漏,也不会拖垮整个云主机。
数据备份是重中之重
云主机上跑的代码是团队资产,建议每天做一次卷备份,最简单的方式是写个cron任务,把 /opt/gitea/data 和 /opt/woodpecker/server 压缩后copy到对象存储或另一台机器,具体命令:
tar -zcf /backup/code_$(date +%Y%m%d).tar.gz /opt/gitea/data /opt/woodpecker/server
保留最近7天的备份,用 find /backup -type f -mtime +7 -delete 自动清理。
代码仓库和CI流水线的安全加固与日常维护
自托管服务最怕安全问题,云主机暴露公网,每天都有扫描程序在尝试弱口令和漏洞。
必须做的三项安全措施
- 开启SSH密钥认证,关闭密码登录,在云主机上修改
/etc/ssh/sshd_config,设置PasswordAuthentication no。 - Gitea和Woodpecker都启用HTTPS,用Let's Encrypt免费证书,在Gitea的配置文件里添加
、
PROTOCOL=https
CERT_FILE=/data/cert.pem、KEY_FILE=/data/key.pem。 - 限制Gitea的管理员IP,如果只有你一个人管理,只在安全组规则里放行你的办公网IP访问3000和8000端口。
常见故障排查
遇到CI不触发,先检查Gitea的Webhook设置是否正确,Woodpecker注册的时候会自动创建webhook,但如果改了Gitea的域名,webhook地址还是旧的,需要去Gitea仓库的Webhook管理页面手动更新。
构建日志提示权限不足时,多半是容器内的用户ID和宿主机不一致,在Woodpecker的agent配置里添加 WOODPECKER_AGENT_VOLUMES=/var/run/docker.sock:/var/run/docker.sock,并确认宿主机Docker socket权限组包含agent的GID,否则报 permission denied。
尾声
用云主机搭建代码仓库和CI流水线,轻量组合的核心就是Gitea加Woodpecker,它们能跑在最低配的云主机上,维护成本低,还拥有完整的推送、构建、部署闭环,如果你已经有了一台闲置的云主机,按上述步骤操作,一个小时内就能跑通第一条流水线,这套方案不求大而全,但胜在轻巧、够用、可控。
关于云主机搭建代码仓库和CI流水线的常见问题
云主机搭建代码仓库和CI流水线,需要多大内存?
2GB内存可以跑通Gitea和Woodpecker,但构建任务多的时候建议4GB,如果条件允许,2核4G是入门标准,可以同时跑8-10个轻量构建任务,低于2G内存的话,建议把并发数限制为1,否则容易卡死。
轻量级CI/CD工具可以取代Jenkins吗?
可以,但要看场景,Jenkins的插件生态丰富,适合大型企业复杂流水线,而轻量级工具如Woodpecker和Drone更适合个人开发者、初创团队和中小型项目,它们配置简单、资源占用低,学习成本小,如果团队没得专门运维人员,用轻量级工具更省心。
云主机搭建代码仓库和CI流水线,怎么控制成本?
选择按量付费的云主机,平时关机只保留磁盘,可以大幅降低成本,利用云厂商的闲置资源,比如很多云厂商提供的低配“开发机”实例,价格比独立主机便宜一半以上,把构建任务集中在非高峰时段执行,也能配合云厂商的折扣策略节约支出。