在日常的前端或后端项目开发中,我们越来越依赖自动化流程来提高开发效率与代码质量。持续集成(CI)与持续部署(CD)已成为现代开发流程中的重要环节。本文将介绍如何使用 Gitea 搭建一个轻量级的 Git 仓库服务,并结合 Drone 实现自动化的 CI/CD 流程。
相比 GitHub、GitLab 等平台,Gitea 更加轻量、开源且易于部署,非常适合中小型团队或私有化部署需求。而 Drone 则作为一款现代化的 CI/CD 工具,与 Gitea 有着良好的集成支持,支持基于容器的构建流水线,配置简单、灵活高效。
接下来,我将通过一套完整的部署与配置流程,一步步实现:
- 使用 Docker 快速部署 Gitea 和 Drone;
- 配置 Webhook 实现 Git 提交后自动触发流水线;
- 编写
.drone.yml
流水线,实现自动构建、测试与部署。
1 . 使用Docker快速部署Gitea和Drone
- 需要在腾讯云安装docker环境
- 在opt文件夹下创建两个文件夹 gitea和 drone
![图片[1]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/20250624135628PixPin_2025-06-24_13-30-08501-1024x581.png)
3. 在gitea文件夹下创建 docker-compose 文件,内容如下:
services:
gitea: # 修改了这里的服务名称
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- DB_TYPE=mysql
- DB_HOST=db:3306
- DB_NAME=gitea
- DB_USER=gitea
- DB_PASSWD=shuangxi521
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:22" # 修改为 2222 端口
restart: unless-stopped
depends_on:
- db
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=xxxxxx
- MYSQL_DATABASE=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=xxxxxx
volumes:
- ./mysql:/var/lib/mysql
restart: unless-stopped
4. 创建完之后打开终端运行命令
docker-compose up -d
5. 打开域名到登录界面,直接点击下一步即可,到了如下界面
![图片[2]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/20250624141016PixPin_2025-06-24_14-10-08541-1024x549.png)
6. 打开头像->设置->应用->创建应用程序 ,名字随便写,url是你的drone域名/login,也就是重定向到/login
要把生成的这id和key记录下来 后面会在创建drone的时候用到
![图片[3]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/20250624141413PixPin_2025-06-24_14-12-19172-1024x556.png)
7. 在drone文件夹下创建 docker-compose 文件,内容如下:
services:
# 容器名称
fan-drone-server:
# 构建所使用的镜像
image: drone/drone:latest
# 映射容器内80端口到宿主机的7079端口
ports:
- 30000:80
# 映射容器内/data目录到宿主机的/data/drone目录
volumes:
- /data/drone:/data
# 容器随docker自动启动
restart: always
environment:
# Gitea 服务器地址
- DRONE_GITEA_SERVER=https://git.xxxx.com
# Gitea OAuth2客户端ID
- DRONE_GITEA_CLIENT_ID= 上面生成的id
# Gitea OAuth2客户端密钥
- DRONE_GITEA_CLIENT_SECRET=上面生成的key
# drone的共享密钥
- DRONE_RPC_SECRET=941971c6c5fb35b63d054012e453f02a
# drone的主机名
- DRONE_SERVER_HOST=drone.xxxx.com
# 外部协议方案
- DRONE_SERVER_PROTO=https
# 创建管理员账户,这里对应为gitea的用户名
- DRONE_USER_CREATE=username:xxxx,admin:true
fan-docker-runner:
image: drone/drone-runner-docker:1
ports:
- 30001:3000
restart: always
depends_on:
- fan-drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
# 用于连接到Drone服务器的协议。该值必须是http或https。
- DRONE_RPC_PROTO=https
# 用于连接到Drone服务器的主机名
- DRONE_RPC_HOST=drone.xxxx.com
# Drone服务器进行身份验证的共享密钥,和上面设置一样
- DRONE_RPC_SECRET=941971c6c5fb35b63d054012e453f02a
# 限制运行程序可以执行的并发管道数。运行程序默认情况下执行2个并发管道。
- DRONE_RUNNER_CAPACITY=2
# docker runner 名称
- DRONE_RUNNER_NAME=fan-docker-runner-1
8. 同级目录运行命令
docker-compose up -d
9. 浏览器输入域名出现下面这个就代表部署好了
![图片[4]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/202506241424152956540-20220920115519753-1146614566448-1024x609.png)
![图片[5]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/202506241424172956540-20220920115532205-1539030682768.png)
2. 配置 Webhook 实现 Git 提交后自动触发流水线
- 回到gitea 点击迁移外部仓库,我这里提供了一个demo zguiy / drone-demo · GitLab
![图片[6]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/20250624142609image189-1024x543.png)
2. 迁移过来后他会触发事件,打开 drone 会发现已经成功了
![图片[7]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/20250624142832image144-1024x574.png)
3. gitea 中的webhook 也成功了
![图片[8]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/20250624142906image718-1024x507.png)
3. 编写 .drone.yml
流水线,实现自动构建、测试与部署
1. 在项目下创建 .drone.yml
文件 可根据实际情况修改
kind: pipeline # 定义一个管道
type: docker # 当前管道的类型
name: test # 当前管道的名称
steps:
# 第一步:构建项目
- name: 构建
image: node:18-alpine
commands:
- npm install
- npm run build
volumes:
- name: node_modules_cache
path: /drone/src/node_modules
# 第二步:上传静态资源到腾讯云COS (使用另一个插件)
- name: 上传到腾讯云
image: ccr.ccs.tencentyun.com/xiaoqidun/gocos
settings:
secret_id:
from_secret: cos_secret_id
secret_key:
from_secret: cos_secret_key
bucket_url: https://files-1302416092.cos.ap-shanghai.myqcloud.com
source: dist
target: /
strip_prefix: dist
# 第三步:部署到服务器
- name: deploy
image: appleboy/drone-ssh
settings:
host:
from_secret: server_host
username:
from_secret: server_username
password:
from_secret: server_password
# 或者使用SSH密钥
# key:
# from_secret: server_ssh_key
port: 22
script:
- rm -rf /www/wwwroot/show.zguiy.com/*
- mkdir -p /www/wwwroot/show.zguiy.com/
- chmod 755 /www/wwwroot/show.zguiy.com/
when:
branch:
- main
- master
- dev
# 第四步:上传构建文件
- name: upload
image: appleboy/drone-scp
settings:
host:
from_secret: server_host
username:
from_secret: server_username
password:
from_secret: server_password
# 或者使用SSH密钥
# key:
# from_secret: server_ssh_key
port: 22
source: dist/*
target: /www/wwwroot/show.zguiy.com/
strip_components: 1
when:
branch:
- main
- master
- dev
# 定义数据卷用于缓存node_modules
volumes:
- name: node_modules_cache
host:
path: /tmp/drone_cache/node_modules
# 触发条件
trigger:
branch:
- main
- master
- dev
event:
- push
- pull_request
注意事项
- 提示:
当前 url (https://git.zguiy.com/) 与 gitea 的 url (https://localhost/) 不匹配 。 如果您正在使用反向代理,请确保设置正确的“主机”和“x-转发-原始”标题。
答:需要在反向代理的发送域名改成你的实际域名
![图片[9]|Gitea + Drone CI/CD 部署|子归云](https://cdn.wp.zguiy.com/2025/06/20250624143421image557-1024x744.png)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
请登录后查看评论内容