
Drone环境搭建:从0到1的准备工作
其实Drone的核心优势就是”依赖简单”,它几乎全靠Docker跑起来,所以你第一步要做的就是确保服务器上有Docker环境。我之前在阿里云轻量应用服务器上搭的时候,踩过一个坑:用系统自带的apt-get装Docker,版本太旧(19.03),结果Drone Server启动时一直报”API版本不兼容”。后来查了官方文档才知道,Drone要求Docker版本至少20.10以上,所以你最好用Docker官方脚本安装:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
装完Docker,接下来就是Drone本身了。它分两个部分:Server和Runner。Server是”大脑”,负责管理项目和pipeline;Runner是”手脚”,负责执行具体任务。你可以理解为:没有Server,你没法在网页上看到任务状态;没有Runner,任务就没人干活。
安装Drone Server:连Git仓库是关键
Server的安装推荐用Docker Compose,配置文件简单清晰。我给你一个基础模板,你照着改就行:
version: '3'
services:
drone-server:
image: drone/drone:2.18.0
ports:
"80:80" # Web界面端口
volumes:
/var/lib/drone:/data # 数据持久化
environment:
DRONE_AGENT_SECRET=你的密钥 # 随便生成个32位字符串,比如用openssl rand -hex 16
DRONE_GITHUB_SERVER=https://github.com # 如果你用GitLab,改成https://gitlab.com
DRONE_GITHUB_CLIENT_ID=你的GitHub客户端ID
DRONE_GITHUB_CLIENT_SECRET=你的GitHub客户端密钥
DRONE_SERVER_HOST=你的服务器IP或域名 # 比如drone.yourdomain.com
DRONE_SERVER_PROTO=http # 本地测试用http,生产环境 配https
这里最容易卡壳的是GitHub/GitLab的OAuth配置。以GitHub为例,你需要在GitHub开发者设置里新建OAuth App, Homepage URL填http://你的服务器IP
,Authorization callback URL填http://你的服务器IP/login
。填错回调URL的话,登录时会一直报”404″,我第一次就因为多打了个斜杠,折腾了半小时才发现。
安装Runner:让任务跑起来
Server启动后,你打开网页会发现”没有可用的Runner”,这时候就需要装Runner了。Runner也用Docker启动,命令很简单:
docker run -d
-v /var/run/docker.sock:/var/run/docker.sock
-e DRONE_RUNNER_NAME=我的第一个Runner
-e DRONE_RUNNER_TOKEN=你的Runner令牌 # 在Drone网页的"Runner"页面能找到
-e DRONE_SERVER_HOST=你的服务器IP
-e DRONE_SERVER_PROTO=http
name drone-runner drone/drone-runner-docker:1.8.3
这里有个关键点:/var/run/docker.sock
这个挂载不能少,因为Runner需要通过它来启动其他Docker容器执行任务。我之前图省事没挂载,结果任务一直卡在”pending”状态,日志里全是”无法连接Docker”的错误,后来加上挂载才解决。
为了帮你选最适合的安装方式,我整理了一个对比表,你可以根据自己的情况选:
安装方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Docker Compose | 配置集中,启停方便 | 依赖Docker,占资源稍多 | 新手入门、个人项目 |
二进制安装 | 资源占用少,启动快 | 需手动配置systemd,麻烦 | 服务器资源紧张的场景 |
K8s部署 | 适合大规模集群 | 学习成本高,小题大做 | 企业级多团队协作 |
小提示
:如果你用的是国内服务器,Docker镜像拉取可能很慢,这时候可以给Docker配个国内镜像源,比如阿里云或网易的,具体方法网上一搜就有,我就不展开了。
核心配置详解:.drone.yml文件怎么写才实用
环境搭好后,真正让自动化跑起来的是项目根目录下的.drone.yml
文件。这个文件就像你的”任务清单”,告诉Drone要做什么、怎么做。我第一次写这个文件时,对着官方文档看了半天,结果还是因为缩进错了导致任务失败——YAML文件对缩进特别敏感, 你用2个空格缩进,别用Tab。
基础结构:pipeline和steps是骨架
一个最简化的.drone.yml
长这样:
kind: pipeline
type: docker
name: default # pipeline名称,随便起
steps: # 任务步骤,按顺序执行
name: test # 步骤名称
image: python:3.9 # 用Python镜像执行
commands: # 要执行的命令
pip install -r requirements.txt
pytest tests/
name: build # 第二个步骤:构建
image: docker:latest
volumes: # 挂载Docker sock,让这个步骤能调用Docker
name: docker_sock
path: /var/run/docker.sock
commands:
docker build -t myapp:${DRONE_COMMIT_SHA:0:8} . # 用提交哈希做镜像标签
volumes: # 定义上面用到的volume
name: docker_sock
host:
path: /var/run/docker.sock
你看,整个文件分三块:kind
和type
是固定写法(目前主流用docker类型);steps
是核心,每个step就是一个任务;volumes
是可选的,用来共享数据。
这里有个新手常犯的错:在build
步骤里没挂载docker_sock
,结果执行docker build
时提示”找不到Docker命令”。我之前就踩过这个坑,后来才明白:每个step其实是在独立的Docker容器里运行的,默认情况下容器里没有Docker环境,所以需要挂载宿主机的/var/run/docker.sock
才能调用宿主机的Docker。
常用插件:别重复造轮子
写命令虽然灵活,但很多常见操作(比如推送镜像到Docker Hub、发通知到Slack)已经有现成的插件,用插件比写commands更简单。比如推送Docker镜像,用官方的plugins/docker
插件:
name: push
image: plugins/docker
settings:
repo: username/myapp # 镜像仓库名
tags: latest # 镜像标签
username: 你的Docker Hub用户名
password: 你的Docker Hub密码 # 用Drone的secret存储,别明文写!
这里的password
千万别明文写在文件里!你可以在Drone网页的项目设置里添加”Secret”,然后在配置文件里用from_secret
引用:
password:
from_secret: docker_password # 对应你在网页上设置的secret名称
我整理了几个最常用的插件,你可以直接套用:
插件名称 | 作用 | 核心参数 | 适用场景 |
---|---|---|---|
plugins/git | 拉取代码(默认已集成) | branch: 指定分支 | 自定义代码拉取逻辑 |
plugins/docker | 构建并推送Docker镜像 | repo, tags, username, password | 容器化项目部署 |
plugins/slack | 发送通知到Slack | webhook, channel, message | 任务结果通知 |
plugins/ssh | 通过SSH执行命令 | host, user, password, script | 传统服务器部署 |
我的经验
:插件虽然方便,但也要看版本。比如plugins/docker
最新版要求Docker版本20以上,如果你服务器Docker版本低,可能需要指定旧版本插件,比如plugins/docker:20
。
进阶技巧:条件执行和缓存
有时候你可能不想每次提交都跑全流程,比如只改了文档就不用跑测试和构建。这时候可以用when
条件:
name: build
image: plugins/docker
when:
branch:
main # 只有main分支才执行
event:
push # 只有push事件才执行,忽略pull request
还有缓存功能,比如Python项目的venv
目录、Node.js的node_modules
,每次都重新安装很费时间。Drone可以用cache
插件缓存这些目录:
name: cache
image: meltwater/drone-cache
settings:
backend: filesystem
path:
./venv
mount:
./venv
restore: true # 恢复缓存
rebuild: true # 任务成功后更新缓存
我之前给一个Django项目加了缓存,测试步骤的时间从原来的4分钟缩短到1分钟,效果很明显。
注意
:Drone官方文档(点击查看)里有更详细的插件列表和配置说明,遇到不懂的可以去查。根据JetBrains 2023开发者调查,Drone在轻量级CI工具中使用率排名前三,就是因为它的插件生态足够丰富,又不会像Jenkins那样复杂。
最后再提醒你一个小细节:写完.drone.yml
后,最好先用Drone CLI工具本地验证一下语法,命令是drone lint .drone.yml
,避免提交后才发现错误。我之前就因为少写了一个-
符号,导致整个pipeline失败,后来养成了本地验证的习惯,省心多了。
如果你按照这些步骤配置遇到问题,或者有更好的技巧,欢迎在评论区告诉我,我们一起交流!
我之前任务失败的时候,第一反应就是去Drone的网页界面找线索,其实它的日志查看设计还挺直观的。你先打开Drone的项目详情页,里面会列出所有执行过的pipeline记录,失败的任务通常会标红,旁边还有个感叹号图标。点进去之后,每个步骤(比如test、build这些)的右侧都会有个“Logs”按钮,点一下就能看到这个步骤从开始到结束的完整输出,包括每一条命令的执行结果。
举个例子,有次我配置Python项目的测试步骤,日志里突然出现“pytest: command not found”,这时候就知道是没装pytest,赶紧在commands里加一行“pip install pytest”就解决了。如果是插件报错,比如docker插件提示“no basic auth credentials”,那十有八九是Docker Hub的用户名密码填错了,或者secret没配置对,这些细节日志里都会写得很清楚。
不过有时候任务压根没开始执行,网页上显示“pending”一直不动,这时候可能是Runner出了问题,就得去服务器上看Runner的日志了。你可以通过“docker logs 容器名”命令查看,默认的Runner容器名是drone-runner,但如果你装的时候改了名字,比如叫my-drone-runner,那命令就要对应改成“docker logs my-drone-runner”。日志里如果有“could not connect to server: dial tcp server-ip:port: connect: connection refused”这种信息,大概率是Runner没连上Server,可能是Server没启动,或者DRONE_SERVER_HOST配错了,这时候你可以先检查下Server的容器是不是在运行(docker ps看看有没有drone-server的容器),再确认下Runner配置里的Server地址和端口对不对。
Drone支持哪些代码托管平台?
Drone支持主流的代码托管平台,包括GitHub、GitLab、Gitea、Bitbucket等。配置时只需在Drone Server的环境变量中修改对应的平台参数,例如使用GitLab时,将DRONE_GITHUB_SERVER
改为https://gitlab.com
,并替换对应的Client ID和Secret即可。官方文档中提供了各平台的详细配置示例。
Drone任务执行失败时,如何查看详细日志?
在Drone网页界面的项目详情页,点击对应失败的pipeline任务,进入任务详情后,每个步骤右侧会有“Logs”按钮,点击即可查看该步骤的完整执行日志。日志中会显示具体的错误信息,例如命令执行失败的原因、插件配置错误等。如果是Runner连接问题,还可以在服务器上通过docker logs drone-runner
查看Runner的运行日志。
一个项目可以配置多个pipeline吗?
可以。通过在.drone.yml
中定义多个不同名称的pipeline,或使用条件执行(when
字段)区分不同场景。 可以创建名为“test”的pipeline专门执行测试任务,名为“deploy”的pipeline用于生产环境部署,通过分支(如branch: [main]
)或事件类型(如event: [tag]
)触发不同流程。
Drone Runner的数量有限制吗?可以添加多个Runner吗?
Drone对Runner数量没有限制,支持添加多个Runner以提高任务执行效率。多个Runner可以部署在同一台服务器或不同服务器上,安装方法与第一个Runner相同,只需确保所有Runner使用相同的DRONE_AGENT_SECRET
和正确的Server地址。多Runner场景下,任务会自动分配到空闲的Runner执行,适合任务量大或需要隔离执行环境的场景。
本地开发时如何验证.drone.yml配置是否正确?
推荐使用Drone CLI工具进行本地验证。安装CLI后(可从Drone官方文档获取安装方法),在项目根目录执行drone lint .drone.yml
,工具会检查配置文件的语法错误、插件参数是否完整等问题。 还可以使用drone exec
命令在本地模拟执行pipeline(需提前配置本地Docker环境),帮助排查任务逻辑问题。