在软件开发过程中,持续集成和持续部署(CI/CD)已经成为不可或缺的一部分。Drone 是一个轻量级、云原生的CI/CD平台。
Drone的优势在于:
- 简单易用,配置直观
- 支持多种Runner(Docker、SSH、Kubernetes等)
- 与Git平台深度集成
- 资源占用少,性能优秀
本文将详细介绍如何从零开始配置一个完整的Drone CI/CD系统,包括处理私有仓库认证等复杂场景。
Drone简介
Drone是一个基于容器的CI/CD平台,采用插件化架构,支持多种执行环境。
核心概念
- Pipeline: 定义构建流程的配置文件(.drone.yml)
- Runner: 执行Pipeline的代理程序
- Secret: 存储敏感信息的加密存储
- Stage: Pipeline中的执行步骤
支持的Runner类型
- Docker Runner: 在Docker容器中执行任务
- SSH Runner: 通过SSH连接到远程服务器执行
- Kubernetes Runner: 在K8s集群中执行
- Exec Runner: 在本地执行
环境准备
服务器架构
我们的部署架构如下:
Internet → Nginx (drone.trswnca.cc) → Drone Server (tank-190:9098)
→ SSH Runner (tank-190:3010)
→ Docker Runner (tank-190:3000)
Nginx配置
在公开服务器上配置Nginx反向代理:
server {
listen 80;
server_name drone.trswnca.cc;
location / {
proxy_pass http://192.168.1.190:9098;
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;
}
}
确保内部服务器可以通过OpenVPN或内网访问到公开服务器,这样Nginx才能正确转发请求。
GitHub OAuth应用配置
创建OAuth App
- 访问GitHub Settings → Developer settings → OAuth Apps
- 点击"New OAuth App"
- 填写应用信息:
- Application name: Drone CI
- Homepage URL: http://drone.trswnca.cc
- Authorization callback URL: http://drone.trswnca.cc/login
获取凭据
创建完成后,记录下:
- Client ID
- Client Secret
这些信息将用于Drone的环境变量配置。
Drone安装
使用Docker安装
创建docker-compose.yml文件:
version: '3'
services:
drone-server:
image: drone/drone:2.23.0
ports:
- "9098:80"
volumes:
- /data/drone:/data
environment:
- DRONE_SERVER_HOST=drone.trswnca.cc
- DRONE_SERVER_PROTO=http
- DRONE_GITHUB_CLIENT_ID=your_client_id
- DRONE_GITHUB_CLIENT_SECRET=your_client_secret
- DRONE_RPC_SECRET=your_rpc_secret
- DRONE_DATABASE_DRIVER=sqlite3
- DRONE_DATABASE_DATASOURCE=/data/database.sqlite
- DRONE_GIT_USERNAME=your_github_username
- DRONE_GIT_PASSWORD=your_github_token
- DRONE_GIT_ALWAYS_AUTH=false
restart: always
drone-runner-docker:
image: drone/drone-runner-docker:1
ports:
- "3000:3000"
- "8000:8000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_HOST=drone.trswnca.cc
- DRONE_RPC_SECRET=your_rpc_secret
- DRONE_PLATFORM_OS=linux
- DRONE_PLATFORM_ARCH=amd64
restart: always
drone-runner-ssh:
image: drone/drone-runner-ssh
ports:
- "3010:3000"
environment:
- DRONE_RPC_HOST=drone.trswnca.cc
- DRONE_RPC_SECRET=your_rpc_secret
restart: always
启动服务
docker-compose up -d
启动之后,访问 Web 界面注册账户,会自动通过 github 的认证信息访问仓库列表。
简单Pipeline测试
创建基础配置
首先创建一个简单的Docker Pipeline来测试基础功能:
kind: pipeline
type: docker
name: hello-world
steps:
- name: hello
image: alpine
commands:
- echo "Hello World from Drone!"
- echo "Pipeline is working!"
trigger:
branch: main
测试结果
如果配置正确,在 Web 界面可以看到:
- Pipeline成功创建
- 步骤正常执行
- 输出预期的Hello World消息
如果遇到"Step is pending"问题,检查Docker runner是否正确连接,以及是否有Docker socket权限。
远程 Pipeline 配置
对于需要部署到远程服务器的场景,我们使用 SSH Runner.
配置SSH密钥
在Drone web界面中:
- 进入仓库设置 → Secrets
- 添加名为
ssh_private_key
的secret - 值为你的SSH私钥内容
SSH Pipeline配置
在根目录创建:
kind: pipeline
type: ssh
name: hugo-build-and-deploy
server:
host: blog.trswnca.cc
user: trswnca
ssh_key:
from_secret: ssh_private_key
steps:
- name: build-and-deploy
commands:
- cd /home/trswnca/projects/obsidian-files
- git pull
- cd /home/trswnca/projects/hugo-site
- hugo --minify --cleanDestinationDir
trigger:
branch: main
问题排查过程
问题1: Step is pending
现象: Pipeline创建成功,但步骤一直显示"pending"状态
排查过程:
- 检查Runner连接状态
- 查看Drone服务器日志
- 检查Runner日志
发现的问题:
{"error":"这个请求缺少必要的参数,或者参数值、格式不正确","level":"warning","msg":"manager: cannot generate netrc"}
问题2: netrc生成失败
根本原因: Drone无法为私有仓库生成认证文件
错误信息:
"manager: cannot generate netrc"
解决方案: 添加Git认证环境变量
-e DRONE_GIT_USERNAME=your_github_username
-e DRONE_GIT_PASSWORD=your_github_token
-e DRONE_GIT_ALWAYS_AUTH=false
问题3: Runner连接问题
现象: Runner无法获取stage详细信息
排查过程:
- 检查RPC_HOST配置
- 验证网络连接
- 重启相关服务
解决方案: 确保所有Runner使用正确的RPC地址
-e DRONE_RPC_HOST=drone.trswnca.cc
核心问题分析
私有仓库认证问题
问题描述: Drone服务器可以通过OAuth看到私有仓库,但Pipeline执行时(Runner)需要clone代码,此时没有认证信息。
技术细节:
- Drone服务器使用GitHub OAuth token访问API
- Pipeline执行时,Runner需要执行
git clone
- 私有仓库的clone需要额外的认证信息
解决方案: 通过环境变量提供Git认证信息,让Drone能够为Runner生成正确的认证文件。
确保GitHub token有足够的权限访问私有仓库,包括repo权限。
最终配置
完整的Drone服务器配置
docker run -d --name drone \
-p 9098:80 \
-v /data/drone:/data \
-e DRONE_SERVER_HOST=drone.trswnca.cc \
-e DRONE_SERVER_PROTO=http \
-e DRONE_GITHUB_CLIENT_ID=your_client_id \
-e DRONE_GITHUB_CLIENT_SECRET=your_client_secret \
-e DRONE_RPC_SECRET=your_rpc_secret \
-e DRONE_DATABASE_DRIVER=sqlite3 \
-e DRONE_DATABASE_DATASOURCE=/data/database.sqlite \
-e DRONE_GIT_USERNAME=your_github_username \
-e DRONE_GIT_PASSWORD=your_github_token \
-e DRONE_GIT_ALWAYS_AUTH=false \
--restart=always \
drone/drone:2.23.0
验证配置
检查服务状态:
# 检查Drone服务器
docker logs drone
# 检查Runner连接
docker logs dreamy_mclaren
docker logs ssh_runner
Last modified on 2025-10-04