用 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 应用:

  1. 进入 Gitea → 设置 → 应用 → 管理 OAuth2 应用
  2. 创建应用,回调 URL 填:https://ci.你的域名.com/login
  3. 记录 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

激活仓库

  1. 访问 https://ci.你的域名.com,用 Gitea 账号登录
  2. 在 Drone 界面找到你的仓库,点「Activate」
  3. 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:部署服务器 IP
  • deploy_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 是很自然的选择。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐