Drone 轻量级 CI/CD 系统搭建

Drone 是一款基于容器的轻量级持续集成与持续部署(CI/CD)平台。相比 Jenkins 等传统 CI 工具,Drone 资源占用极低、配置简洁,非常适合在搬瓦工 VPS 这类资源有限的环境中运行。每个构建步骤都在独立的 Docker 容器中执行,保证了环境隔离和可重复性。

一、环境要求

  • 操作系统:Ubuntu 20.04+ 或 Debian 11+。
  • Docker:需要先安装 Docker
  • 内存:Drone Server 仅需 256MB,Runner 根据构建任务而定。
  • 代码仓库:支持 GitHub、GitLab、Gitea、Bitbucket 等。

二、创建 OAuth 应用

以 GitHub 为例,在 GitHub Settings → Developer settings → OAuth Apps 中创建新应用:

  • Application name:Drone CI。
  • Homepage URLhttps://drone.yourdomain.com
  • Authorization callback URLhttps://drone.yourdomain.com/login

记录下 Client ID 和 Client Secret。

三、使用 Docker Compose 部署

创建 docker-compose.yml

version: '3.8'

services:
  drone-server:
    image: drone/drone:2
    container_name: drone-server
    restart: always
    ports:
      - "3080:80"
      - "3443:443"
    environment:
      - DRONE_GITHUB_CLIENT_ID=your_client_id
      - DRONE_GITHUB_CLIENT_SECRET=your_client_secret
      - DRONE_RPC_SECRET=your_rpc_secret_here
      - DRONE_SERVER_HOST=drone.yourdomain.com
      - DRONE_SERVER_PROTO=https
      - DRONE_DATABASE_DRIVER=sqlite3
      - DRONE_DATABASE_DATASOURCE=/data/database.sqlite
      - DRONE_USER_CREATE=username:yourgithubname,admin:true
    volumes:
      - drone_data:/data

  drone-runner:
    image: drone/drone-runner-docker:1
    container_name: drone-runner
    restart: always
    depends_on:
      - drone-server
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET=your_rpc_secret_here
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=bwg-runner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  drone_data:

生成 RPC Secret:

openssl rand -hex 16

将生成的值填入两个服务的 DRONE_RPC_SECRET 环境变量。

3.1 启动服务

docker compose up -d

3.2 查看服务状态

docker compose ps
docker compose logs drone-server
docker compose logs drone-runner

四、集成 Gitea(自建 Git)

如果你使用 Gitea 作为代码仓库,配置如下:

environment:
  - DRONE_GITEA_SERVER=https://gitea.yourdomain.com
  - DRONE_GITEA_CLIENT_ID=your_gitea_oauth_id
  - DRONE_GITEA_CLIENT_SECRET=your_gitea_oauth_secret
  - DRONE_RPC_SECRET=your_rpc_secret
  - DRONE_SERVER_HOST=drone.yourdomain.com
  - DRONE_SERVER_PROTO=https

在 Gitea 的 Site Administration → Applications 中创建 OAuth2 应用,回调地址为 https://drone.yourdomain.com/login

五、编写 .drone.yml

在项目根目录创建 .drone.yml 定义构建流水线:

5.1 基础构建流水线

kind: pipeline
type: docker
name: default

steps:
  - name: install
    image: node:18-alpine
    commands:
      - npm ci

  - name: test
    image: node:18-alpine
    commands:
      - npm run test

  - name: build
    image: node:18-alpine
    commands:
      - npm run build

  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host:
        from_secret: deploy_host
      username:
        from_secret: deploy_user
      key:
        from_secret: deploy_key
      script:
        - cd /opt/app
        - git pull origin main
        - npm ci --production
        - pm2 restart all

trigger:
  branch:
    - main
  event:
    - push

5.2 Docker 镜像构建

kind: pipeline
type: docker
name: docker-build

steps:
  - name: build-push
    image: plugins/docker
    settings:
      repo: yourname/myapp
      username:
        from_secret: docker_username
      password:
        from_secret: docker_password
      tags:
        - latest
        - ${DRONE_COMMIT_SHA:0:8}
    when:
      branch:
        - main

六、管理 Secrets

通过 Drone UI 或 CLI 添加构建密钥:

# 安装 Drone CLI
curl -L https://github.com/harness/drone-cli/releases/latest/download/drone_linux_amd64.tar.gz | tar zx
install -t /usr/local/bin drone

# 配置 CLI
export DRONE_SERVER=https://drone.yourdomain.com
export DRONE_TOKEN=your_personal_token

# 添加 Secret
drone secret add --repository yourname/myapp --name deploy_host --data "192.168.1.10"
drone secret add --repository yourname/myapp --name deploy_key --data @~/.ssh/id_rsa

七、多流水线配置

Drone 支持在同一文件中定义多个流水线,用 --- 分隔:

kind: pipeline
type: docker
name: test

steps:
  - name: test
    image: node:18-alpine
    commands:
      - npm ci
      - npm test

---
kind: pipeline
type: docker
name: deploy

steps:
  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host:
        from_secret: deploy_host
      username: root
      key:
        from_secret: deploy_key
      script:
        - cd /opt/app && git pull && npm ci --production

depends_on:
  - test

trigger:
  branch:
    - main

八、配置 Nginx 反向代理

server {
    listen 80;
    server_name drone.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name drone.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/drone.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/drone.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3080;
        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;
        proxy_buffering off;
        chunked_transfer_encoding off;
    }
}

九、常见问题

Runner 无法连接 Server

检查 RPC Secret 是否一致,以及两个容器是否在同一 Docker 网络中:

docker compose logs drone-runner | grep -i "error\|connect"

构建步骤卡住

检查 Runner 的并发能力和可用资源:

docker stats

Webhook 未触发

在代码仓库中检查 Webhook 的投递日志,确认 Drone Server 的地址可以被仓库服务器访问。

总结

Drone 是搬瓦工 VPS 上搭建 CI/CD 的绝佳选择,资源占用低、配置简洁、原生支持容器化构建。搭配 DockerGitea 可以构建完整的自托管开发平台。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。