用 Drone CI 搭建轻量持续集成,代码推送自动测试部署
用 Drone CI 搭建轻量持续集成,代码推送自动测试部署
Jenkins 太重、GitHub Actions 要花钱、GitLab CI 依赖整套 GitLab——Drone CI 是一个轻量级的开源持续集成平台,Docker 镜像很小,配置用 YAML 文件写在仓库里(和 GitHub Actions 类似),每个 Pipeline 步骤都在独立容器里运行,非常干净。对接 Gitea、Gogs、GitHub、GitLab 都很方便。
工作原理
Drone 由两个部分组成:
- Drone Server:管理 Web 界面、OAuth 认证、构建任务调度,连接你的 Git 服务
- Drone Runner:实际执行构建任务的 Agent,监听 Server 分发的任务
两者可以部署在同一台机器,也可以分开部署(一个 Server 管多个 Runner)。
服务器配置
| 部分 | CPU | 内存 |
|---|---|---|
| Server | 1 核 | 512MB |
| Runner | 2 核(执行构建任务时) | 2G |
我在 雨云 rainyun-com的 2 核 4G 服务器上同时跑 Server 和 Runner,日常用来跑 Node.js 和 Python 项目的测试 + 构建,没有什么压力。新用户注册5 折优惠码: 2026off
前提:对接 Gitea(以 Gitea 为例)
先在 Gitea 里创建 OAuth 应用:
- 进入 Gitea → 设置 → 应用 → 管理 OAuth2 应用
- 创建应用,回调 URL 填:
https://ci.你的域名.com/login - 记录 Client ID 和 Client Secret
部署 Drone Server + Runner
mkdir -p /opt/drone
cat > /opt/drone/docker-compose.yml << 'EOF'
version: "3.8"
services:
drone-server:
image: drone/drone:2
container_name: drone-server
ports:
- "3080:80"
environment:
- DRONE_GITEA_SERVER=https://git.你的域名.com
- DRONE_GITEA_CLIENT_ID=Gitea的ClientID
- DRONE_GITEA_CLIENT_SECRET=Gitea的ClientSecret
- DRONE_RPC_SECRET=随机生成的共享密钥
- DRONE_SERVER_HOST=ci.你的域名.com
- DRONE_SERVER_PROTO=https
- DRONE_USER_CREATE=username:你的Gitea用户名,admin:true
volumes:
- ./drone_data:/data
restart: unless-stopped
drone-runner:
image: drone/drone-runner-docker:1
container_name: drone-runner
environment:
- DRONE_RPC_PROTO=https
- DRONE_RPC_HOST=ci.你的域名.com
- DRONE_RPC_SECRET=同上面的共享密钥
- DRONE_RUNNER_CAPACITY=2 # 最大并发构建数
- DRONE_RUNNER_NAME=my-runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- drone-server
restart: unless-stopped
EOF
docker compose up -d
生成 RPC Secret:
openssl rand -hex 16
配置 HTTPS
sudo apt install -y caddy
sudo tee /etc/caddy/Caddyfile << 'EOF'
ci.你的域名.com {
reverse_proxy localhost:3080
}
EOF
sudo systemctl restart caddy
激活仓库
- 访问
https://ci.你的域名.com,用 Gitea 账号登录 - 在 Drone 界面找到你的仓库,点「Activate」
- Drone 会自动在 Gitea 仓库里添加 Webhook
编写 Pipeline(.drone.yml)
在仓库根目录创建 .drone.yml:
kind: pipeline
type: docker
name: default
steps:
# 第一步:运行测试
- name: test
image: node:18-alpine
commands:
- npm ci
- npm test
# 第二步:构建镜像
- name: build-image
image: plugins/docker
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: 你的镜像仓库/项目名
tags:
- latest
- ${DRONE_COMMIT_SHA:0:8}
when:
branch:
- main
# 第三步:SSH 部署到服务器
- name: deploy
image: appleboy/drone-ssh
settings:
host:
from_secret: deploy_host
username: deploy
key:
from_secret: deploy_key
script:
- docker pull 你的镜像仓库/项目名:latest
- docker compose -f /opt/myapp/docker-compose.yml up -d
when:
branch:
- main
trigger:
event:
- push
- pull_request
添加 Secrets
Pipeline 里用 from_secret 引用的变量,在 Drone Web 界面配置:
仓库设置 → Secrets → 添加:
docker_username:Docker Hub 用户名docker_password:Docker Hub 密码deploy_host:部署服务器 IPdeploy_key:部署服务器的 SSH 私钥
Secrets 不会在日志里暴露,安全存储。
常用 Pipeline 模式
Python 项目测试:
steps:
- name: test
image: python:3.11-slim
commands:
- pip install -r requirements.txt
- pytest tests/ -v
Go 项目构建:
steps:
- name: build
image: golang:1.22-alpine
commands:
- go build ./...
- go test ./...
定时任务(夜间构建):
trigger:
cron:
- nightly
steps:
- name: nightly-tests
image: python:3.11
commands:
- pytest tests/ --cov=.
与 GitHub Actions 的对比
| 方面 | Drone CI | GitHub Actions |
|---|---|---|
| 成本 | 自建免费 | 公有仓库免费,私有仓库有限额 |
| 配置语法 | 类似,YAML | YAML |
| 执行环境 | 自建服务器 | GitHub 托管 |
| 数据 | 在自己服务器 | GitHub |
| 私有网络访问 | 方便(Runner 在同网络) | 需要额外配置 |
Drone CI 的最大优势是轻量和私有网络友好——Runner 和部署目标在同一个内网里,直接 SSH 部署不需要任何额外配置,也不需要把 SSH 密钥暴露到公共 CI 平台。对于自建 Gitea 的团队来说,搭配 Drone 是很自然的选择。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)