当前位置: 首页 > news >正文

自托管代码仓库与 CI/CD 流水线搭建:Gitea + Drone 整合实践

  1. 需求场景
    平时写一些小项目和脚本,放在 GitHub 上虽然方便,但私有仓库在免费版有一些限制,而且 Actions 的构建时长对个人项目来说有时会超限。一直想在自己拥有的服务器上搭一套轻量级的 Git 托管服务,顺便接上 CI/CD,实现 push 代码后自动构建镜像或执行测试。

我使用了手头的一台阿贝云的云服务器已安装 Docker 和 Docker Compose已绑定域名 git.example.com 用于 Gitea 访问

  1. 安装 Gitea(轻量级 Git 服务)
    Gitea 是用 Go 编写的 Git 托管平台,资源占用极低,非常适合 1GB 内存的小型服务器。

首先创建数据存放目录:

bash
mkdir -p /opt/gitea/{data,config}
chown -R 1000:1000 /opt/gitea
编写 docker-compose.yml:

yaml
version: ‘3’

services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: always
ports:
- “3000:3000”
- “2222:22”
volumes:
- /opt/gitea/data:/data
- /opt/gitea/config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3
启动服务:

bash
docker-compose up -d
访问 http://服务器IP:3000,进入 Gitea 安装页面。首次访问会提示配置,数据库选择 SQLite(够用),然后设置管理员账号和站点名称。安装完成后,就可以在页面上创建仓库了。

  1. 配置 Nginx 反向代理与 HTTPS
    为了更正式地使用,用域名访问并加上 SSL。安装 Nginx:

bash
apt install nginx certbot python3-certbot-nginx -y
配置 Nginx 站点 /etc/nginx/sites-available/gitea:

nginx
server {
listen 80;
server_name git.example.com;

location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }

}
启用配置并申请 SSL 证书:

bash
ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
systemctl restart nginx
certbot --nginx -d git.example.com
完成后即可通过 https://git.example.com 安全访问 Gitea。

  1. 部署 Drone CI/CD
    Drone 是一个基于容器构建的 CI/CD 工具,与 Gitea 集成度很好。

4.1 创建 OAuth 应用
在 Gitea 中,进入用户设置 → 应用 → 创建 OAuth2 应用,填入以下信息:

应用名称:Drone

回调地址:https://git.example.com/login/authorize(替换为你的 Drone 域名)

记下生成的 Client ID 和 Client Secret。

4.2 编写 Drone 服务配置
创建 /opt/drone/docker-compose.yml:

yaml
version: ‘3’

services:
drone-server:
image: drone/drone:latest
container_name: drone-server
restart: always
ports:
- “8080:80”
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/drone/data:/data
environment:
- DRONE_GITEA_SERVER=https://git.example.com
- DRONE_GITEA_CLIENT_ID=你的ClientID
- DRONE_GITEA_CLIENT_SECRET=你的ClientSecret
- DRONE_RPC_SECRET=自定义随机字符串
- DRONE_SERVER_HOST=drone.example.com
- DRONE_SERVER_PROTO=https
- DRONE_DATABASE_DRIVER=sqlite3
- DRONE_DATABASE_DATASOURCE=/data/drone.sqlite

drone-runner:
image: drone/drone-runner-docker:latest
container_name: drone-runner
restart: always
ports:
- “8081:3000”
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=https
- DRONE_RPC_HOST=drone.example.com
- DRONE_RPC_SECRET=与上面相同的随机字符串
- DRONE_RUNNER_NAME=runner-1
- DRONE_LOGS_DEBUG=true
启动 Drone 服务:

bash
docker-compose up -d
同样配置 Nginx 反向代理将 drone.example.com 指向 8080 端口,并申请 SSL 证书。

  1. 配置流水线示例
    在 Gitea 仓库根目录创建 .drone.yml,Drone 会自动执行流水线。下面是一个简单的示例,用于检测代码语法并输出构建信息:

yaml
kind: pipeline
type: docker
name: default

steps:

  • name: 打印构建信息
    image: alpine
    commands:

    • echo “开始构建…”
    • echo “仓库名称: ${DRONE_REPO_NAME}”
    • echo “提交哈希: ${DRONE_COMMIT_SHA}”
    • echo “构建完成!”
  • name: 检查 Shell 语法(仅示例)
    image: alpine
    commands:

    • apk add bash
    • echo “语法检查通过(示例步骤)”
      推送到仓库后,Drone 会自动触发流水线,并在界面上显示执行日志。
  1. 资源占用与使用感受
    Gitea 和 Drone 服务同时运行,内存占用大约在 500MB 左右(含 Docker 后台进程),CPU 基本空闲。阿贝云这台免费云服务器的 1GB 内存完全可以支撑这套组合,磁盘 I/O 也满足日常 Git 操作。

对于开发者来说,有了一台自己的代码托管服务器,可以省去 GitHub 私有仓库的数量限制,同时也体验了企业级 CI/CD 流程的搭建过程。相比免费虚拟主机,云服务器的可扩展性确实高很多。

  1. 踩坑记录
    端口冲突:如果服务器已有其他服务占用 3000 或 8080,记得修改映射端口。

OAuth 回调地址:必须使用 HTTPS 协议,否则 Gitea 不会正常跳转,Drone 登录会失败。

Drone RPC_SECRET:server 和 runner 必须保持一致,否则 runner 无法连接到 server。

SELinux/AppArmor:Debian 默认未开启,无需额外处理。如果使用 CentOS,需要注意关闭 SELinux 或配置相关规则。

  1. 结语
    以上是一个完整的自托管代码仓库 + CI/CD 解决方案。所有组件均运行在阿贝云云服务器实例上,实测稳定可用。如果你也对自建开发工具链感兴趣,可以参考本教程动手实践。
http://www.jsqmd.com/news/1157889/

相关文章:

  • pip 23.0+ 版本升级失败后修复:从 ModuleNotFoundError 到完整恢复的 5 个步骤
  • 位置式 vs 增量式 PID:3 大核心差异与电机控制场景选择指南
  • 189、最小可复现用例:高质量的 bug report 怎么写,让 AI 和同事都能秒懂
  • 2026年下半年量化工具选择,先看能力基础和验证阶段
  • LaTeX-PPT终极指南:5分钟在PowerPoint中插入专业数学公式
  • 原子层沉积 (ALD) 工艺窗口解析:3种前驱体与温度对Al2O3膜厚的影响
  • 高电压测量分压器选型指南:电阻/电容/阻容混合3类方案对比与误差分析
  • 深度强化学习训练新突破:单Transformer层实现高效优化
  • HCIP-PPPoE实验
  • RV1126 双光融合方案 3 大选型对比:384x288 vs 256x192 红外分辨率实测
  • 运算放大器测温电路Multisim仿真问题解析与工程实践
  • 2026年郑州口碑好的大专院校大揭秘 - 品牌排行榜
  • MyBatis-Plus 日志输出优化:3种方案实现SQL与结果集分离打印
  • 人耳等响度曲线与音频均衡:3 个关键频段补偿策略与听感实测
  • SLAM 将PCL点云转换成八叉树地图
  • 2026年湖南诚信美术高考学校发布:壹品培训学校实力解析与选型指南 - 品牌鉴赏官2026
  • Java开发者怎么选开源商城?技术选型的四个关键维度
  • 本地部署Codex与DeepSeek集成:离线AI代码助手实战指南
  • 前端转AI产品经理?收藏这份提效指南,小白也能轻松入门!
  • Compose 1.6+ 混合开发:XML布局与ViewBinding的2种集成模式与性能实测
  • 基于Playwright与AI的新闻聚合与智能摘要系统实战
  • STM32与TB6593FNG实现直流电机PID控制方案
  • 通信工程毕设避坑指南:STM32项目常见的5类硬件选型与软件架构误区
  • 武汉潮酒派科技有限公司云值守酒水店
  • 爬虫数据存储到数据库——MySQL + MongoDB 实战
  • ZEMAX 光学仿真:对比3种透镜聚焦光斑直径计算公式的适用场景与误差
  • 《冰雪传奇点卡版》最新正版官网下载全攻略,游昕直营正规渠道
  • 2026年江苏衬塑反应釜信誉厂家深度解析与选型推荐 - 品牌鉴赏官2026
  • 北京合同纠纷找律师,这些实务要点你需要了解 - 品牌排行榜
  • 雅阁固五金文化与未来战略是什么?