drone ci 是独立轻量级 ci/cd 平台,通过 drone-runner-docker 执行隔离构建,需正确配置 workspace、gopath、多阶段 dockerfile 及 gogs webhook 鉴权,确保 go 微服务安全可靠构建部署。

Drone CI 本身不“部署在 Golang 微服务中”,而是作为独立的、基于 Docker 的构建引擎,为 Golang 微服务提供 CI/CD 流水线。你真正要做的,是让 Drone 能正确构建、测试、打包你的 Go 微服务,并推送到镜像仓库或部署到目标环境。
Drone Runner 必须用 docker 类型,不能用 exec
Drone v2 默认使用 drone-runner-docker,这是唯一能保证 Go 构建环境隔离和多阶段构建支持的方式。用 exec runner 会直接在宿主机执行命令,既破坏 Go 的 GOPATH/GOROOT 隔离,又无法运行 FROM golang:alpine AS builder 这类多阶段 Dockerfile —— 而这恰恰是 Go 微服务轻量镜像的核心。
- 确认
docker-compose.yml中 runner service 的 image 是drone/drone-runner-docker:1.12(v2.6+ 推荐) - Runner 容器必须挂载宿主机的
/var/run/docker.sock,否则无法启动构建容器 - 不要手动改
DRONE_RUNNER_PLUGIN_DRIVER=exec,它会让plugins/docker插件彻底失效
.drone.yml 里必须显式声明 workspace 和 GOPATH
Go 模块依赖解析和 go build 命令对路径极其敏感。Drone 默认工作目录不是 $GOPATH/src,不设 workspace 就会报 no Go files in current directory 或 cannot find module providing package。
- 在
.drone.yml顶层加:workspace: { base: /go, path: src/github.com/your-org/your-service } - 所有
steps中的image: golang:1.22-alpine容器会自动继承该 GOPATH - 若用 Go 1.16+ 的 module 模式,仍需确保
go mod download在go build前执行,否则私有模块拉不到
部署阶段慎用 appleboy/drone-ssh 直接执行 docker run
在生产环境用 appleboy/drone-ssh 执行 docker pull && docker stop && docker rm && docker run 看似简单,但极易引发服务中断或端口冲突——特别是没有健康检查或滚动更新逻辑时。
- 更稳妥的做法是:用
plugins/docker构建并推送镜像后,在目标机上用 systemd 或 supervisor 管理容器,只用 SSH 触发systemctl restart your-service - 如果坚持用
docker run -d,务必加上--restart=always和--health-cmd="curl -f http://localhost:8080/health" - 避免在
script:里写docker stop app || true这类弱容错命令;应先检查容器是否存在再操作,否则并发构建可能误杀其他服务
Gogs Webhook 配置失败时先查 DRONE_SECRET 和 Gogs token 权限
常见现象是 Gogs 提交代码后 Drone 完全没反应,或报 401 Unauthorized。这不是网络问题,而是鉴权链断裂。
-
DRONE_SECRET必须在drone-server和drone-runner-docker两个容器中完全一致,且长度建议 ≥32 字符 - Gogs 中创建的 OAuth2 应用,Callback URL 必须是
http://your-drone-domain/login(注意协议和路径),且勾选repo和user:email权限 - Drone UI 中绑定 Gogs 账号后,检查
Settings → Repositories → your-repo → Activate是否开启,否则 webhook 不生效
最易被忽略的一点:Go 微服务的 Dockerfile 多阶段构建中,第二阶段若用 FROM scratch,就必须确保二进制文件是静态编译的(CGO_ENABLED=0),否则容器启动直接报 no such file or directory —— 这个错误不会出现在 Drone 构建日志里,而是在部署后 docker logs 中才暴露。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











