drone + docker 是小团队和微服务场景下最清爽的 ci/cd 组合,核心逻辑为:代码推送触发 webhook → drone server 调度 → runner 启容器执行 .drone.yml 步骤(拉码、测试、打包、推镜像、滚动更新),依赖声明式配置、容器隔离与轻量架构实现极速稳定交付。

Drone + Docker 是小团队和微服务场景下最清爽的 CI/CD 组合:不重、不卡、不绕弯。它不靠复杂界面,靠声明式 .drone.yml 驱动;不依赖整套平台,靠容器隔离保证每次构建干净可靠;不堆资源,单台 2 核 4G 服务器就能稳跑多个微服务的自动化测试与镜像发布。
核心逻辑就三点:
代码推送到 Gitea/GitHub → 触发 Webhook 到 Drone Server → Server 分发任务给 Runner → Runner 启一个新容器执行 .drone.yml 里定义的步骤(拉代码、装依赖、跑单元测试、构建成 Docker 镜像、推到私有 Registry、甚至滚动更新 K8s)。
用 Docker 快速起手 Drone Server 和 Runner
你不需要编译、不用配 Java 环境,一条 docker-compose up -d 就能拉起整套服务:
- Server 负责调度和页面,轻量(1核 / 512MB 起步)
- Runner 负责干活,需要能跑 Docker(必须挂载
/var/run/docker.sock) - 两者通过共享密钥
DRONE_RPC_SECRET认证通信
示例 docker-compose.yml(适配 Gitea):
version: "3.8"
services:
drone-server:
image: drone/drone:2
ports: ["3080:80"]
volumes: ["./drone_data:/data"]
environment:
- DRONE_GITEA_SERVER=https://git.example.com
- DRONE_GITEA_CLIENT_ID=xxx
- DRONE_GITEA_CLIENT_SECRET=yyy
- DRONE_RPC_SECRET=shared-secret-2026
- DRONE_SERVER_HOST=ci.example.com
- DRONE_SERVER_PROTO=https
- DRONE_USER_CREATE=username:admin,admin:true
drone-runner:
image: drone/drone-runner-docker:1
volumes: ["/var/run/docker.sock:/var/run/docker.sock"]
environment:
- DRONE_RPC_HOST=ci.example.com
- DRONE_RPC_PROTO=https
- DRONE_RPC_SECRET=shared-secret-2026
- DRONE_RUNNER_CAPACITY=3
✅ 提示:
DRONE_RPC_SECRET必须完全一致;Runner 挂载 sock 是为了能启动子容器——这是 Drone 实现“每步一容器”的关键。
为微服务写一个真实可用的 .drone.yml
以 Spring Boot 微服务为例(Maven 构建 + 打包成镜像 + 推送私有 Registry):
kind: pipeline
type: docker
name: build-and-deploy
steps:
- name: test
image: maven:3.9-openjdk-17
commands:
- mvn clean test -DskipTests=false
- name: build-jar
image: maven:3.9-openjdk-17
commands:
- mvn clean package -DskipTests
- name: build-image
image: plugins/docker
settings:
registry: registry.example.com
repo: registry.example.com/myapp/auth-service
tags: ${DRONE_COMMIT_SHA:0:7}
dockerfile: Dockerfile
username: ${DOCKER_USERNAME}
password: ${DOCKER_PASSWORD}
- name: deploy-to-k8s
image: lachlanevenson/k8s-kubectl
environment:
KUBECONFIG: /root/kubeconfig
secrets: [ kubeconfig ]
commands:
- kubectl set image deployment/auth-service auth-service=registry.example.com/myapp/auth-service:${DRONE_COMMIT_SHA:0:7} -n prod
- kubectl rollout status deployment/auth-service -n prod --timeout=120s
? 关键点:
- 每个
step在独立容器中运行,环境零污染- 敏感信息(如
DOCKER_PASSWORD、kubeconfig)走 Drone 内置 secret,不硬编码${DRONE_COMMIT_SHA:0:7}是 Drone 自带变量,直接可用plugins/docker是官方插件,一行配置完成镜像构建+推送
让微服务流水线真正“极速”的三个实操建议
-
跳过全量 Maven 下载:在 Runner 容器里挂载 Maven 本地仓库卷,复用依赖缓存
volumes: - /mnt/m2:/root/.m2
-
启用并发构建:微服务多模块时,把不同服务拆成多个
.drone.yml,或用trigger+matrix并行触发trigger: branch: - main event: - push -
跳过非关键分支测试:开发分支只做 lint + 编译,
main和release/*才跑全量测试 + 部署when: branch: [main, release/*] event: [push, tag]
Drone 不是功能最多的选择,但它是“改一行 YAML 就生效”、“看一眼就知道流程在哪出错”、“半夜修 bug 发版不担心环境差异”的那一类工具。对微服务而言,轻就是快,快就是稳。











