Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统
Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模。开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目录下的描述文件 .drone.yml 就可以完成 CI/CD 配置。
下面,我们以 gitea.com 服务器为例,搭建一套使用 Gitea 与 Drone 的 CI/CD 系统。
系统结构
Drone 由两部分构成:
- Server
- 负责任务调度
- Runner
- 执行 Pipeline 的具体任务
用户将代码推送到 Gitea 时触发 Webhook,调动 Drone 从 Gitea 拉取最新的代码并根据 .drone.yml 描述文件执行 CI/CD 流水线。

网络结构
由于 CI/CD 任务的特殊性,工作繁忙时会占用较多的系统资源,因此为了提高系统整体可靠性,不建议将 Gitea、Drone Server、Drone Runner 安装在同一台服务器上。
- 在本地局域网搭建时应该确保以上服务可以通过域名、IP互相访问。例如:
gitea.example.com -> 192.168.3.10
drone.example.com -> 192.168.3.20
runner.example.com -> 192.168.3.30
- 如需使用
docker compose在本地开发环境搭建高可用结构系统,请参考官方文档: - https://docs.drone.io/server/ha/developer-setup/
- 如需使用
准备工作
在 Gitea 上创建 OAuth2 应用程序
在本例中,Drone 基于 OAuth2 认证授权访问您的 Gitea API。您可以创建一个专用于 CI/CD 的账号,并将该账号添加为代码仓库协作者或者组织管理员。
首先,登录一个您要用于集成 Drone 的 Gitea 账号,进入 设置 - 应用,创建一个 Gitea OAuth2 应用程序。
- 应用名称
- 您可以任取一个名字,此案例中我们填写 Drone
- 重定向 URL
- 授权回调 URL 形如
http(s)://<YOUR_DRONE_SERVER>:<PORT>/login,必须使用您设定的 Drone 服务器协议和主机地址。如果使用非标准的HTTP(S)端口,还应该指定准确的端口。 - 例如
https://drone.gitea.io/login


修改 Gitea 服务器的 Webhook 白名单
出于安全考虑,Gitea 默认禁止触发外部主机的 Webhook。您可以将外部主机添加到 webhook.ALLOWED_HOST_LIST 白名单来解除这一限制。具体信息参考文档 Webhook。
修改配置时,打开 conf/app.ini,添加 ALLOWED_HOST_LIST = * 到 [webhook] 栏目中,并重启 Gitea 服务器。例如:
[webhook]
ALLOWED_HOST_LIST = *
创建共享密钥
共享密钥用于 Drone Server 和 Drone Runner 之间的通信认证。记录下您创建的共享密钥,稍后在安装 Drone Server 和 Drone Runner 时将使用此密钥填充环境变量 DRONE_RPC_SECRET。
您可以使用 OpenSSL 生成随机的十六进制共享密钥:
$ openssl rand -hex 16
c5704bc389f1e3d47f1c4751d1295c86
使用 Docker 安装 Drone 服务器
Drone 服务器是一个轻量级的 Docker 容器,使用 SQLite 作为默认数据库,支持通过环境变量动态设定运行参数。有关配置参数的完整列表,请参阅 Drone Server 文档。
环境变量
- DRONE_GITEA_CLIENT_ID
- (必填)您的 Gitea OAuth 客户端ID
- DRONE_GITEA_CLIENT_SECRET
- (必填)您的 Gitea OAuth 客户端密钥
- DRONE_GITEA_SERVER
- (必填)您的 Gitea 服务器地址,例如
https://gitea.com。注意填写准确的http(s)协议,否则您会看到来自 Gitea 的错误报告:unsupported protocol scheme。
- DRONE_RPC_SECRET
- (必填)在准备工作中使用
openssl rand -hex 16生成的共享密钥。这个密钥用于验证 Drone Server 和 Runner 之间的 RPC 连接。因此,在 Server 和 Runner 上都必须使用相同的密钥。
- DRONE_SERVER_HOST
- (必填)您访问 Drone 时所用的域名或 IP 地址。如果使用 IP 地址,还应该包含端口。 例如
drone.gitea.io。
- DRONE_SERVER_PROTO
- (必填)设置服务器的协议,使用:
http或https。 如果您已经配置 ssl 或 acme,此字段默认为https。
启动服务器
为了便于修改容器参数,我们创建一个 docker-compose.yml 模板来配置 Drone 服务器容器。
根据下面的 Docker Compose 模板,使用命令 docker compose up -d 启动 Drone 服务器。
# docker-compose.yml
version: "3"
services:
drone:
image: drone/drone:2
container_name: drone
environment:
- DRONE_GITEA_SERVER=https://gitea.com
- DRONE_GITEA_CLIENT_ID=change-to-your-gitea-client-id
- DRONE_GITEA_CLIENT_SECRET=change-to-your-gitea-client-secret
- DRONE_RPC_SECRET=change-to-your-shared-secret
- DRONE_SERVER_HOST=drone.gitea.io
- DRONE_SERVER_PROTO=https
restart: always
volumes:
- ./drone:/data
ports:
- 80:80
- 443:443
使用 Docker 安装 Drone Runner
Drone 服务器管理 CI/CD 系统的调度,而 Drone Runner 则是 CI/CD 流水线的执行者。
环境准备
Drone Runner 支持多种运行环境:Doceker、K8s、Windows/Linux/MacOS客户端、SSH 等。
使用 Docker 作为 Drone Runner 的好处是可以将流水线执行过程完全以容器化的方式执行,不对容器的宿主服务器环境造成破坏。在本实践中,我们依然使用 Docker 在 Linux 服务器上安装 Drone Runner。Docker 容器支持的架构包括:
- amd64
- arm
- arm64
环境变量
Docker Runner 使用环境变量动态设定运行参数。有关参数的完整列表,请参阅 Drone Runner 文档。
- DRONE_RPC_HOST
- 填写 Drone Server 的主机名(以及可选填的端口号)。基于 PRC 协议连接 Runner 与 Server,接收流水线任务
- DRONE_RPC_PROTO
- 传输协议:
http或https
- DRONE_RPC_SECRET
- 与 Drone Server 共享的密钥
- DRONE_RUNNER_CAPACITY
- Runner 可以并发执行的流水线数量,默认:
2
- DRONE_RUNNER_NAME
- 自定义 Runner 名称
启动 Runner
根据下面的 Docker Compose 模板,使用命令 docker compose up -d 启动 Drone Runner。
version: "3"
services:
runner:
image: drone/drone-runner-docker:1
container_name: runner
environment:
- DRONE_RPC_PROTO=https
- DRONE_RPC_HOST=drone.gitea.io
- DRONE_RPC_SECRET=change-to-your-shared-secret
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=my-first-runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 3000:3000
验证安装
使用 docker logs 命令查看日志,并验证 Runner 程序是否与 Drone Server 建立连接。
$ docker logs runner
INFO[0000] starting the server
INFO[0000] successfully pinged the remote server
初始化 Drone
登录 Drone 网页面板,例如 https://drone.gitea.io,点击 continue 跳转到 Gitea 授权页面,点击应用授权。
如果出现 Unregistered Redirect URI,表示您设置的重定向 URI与 Drone 不匹配,请重新检查。


CI/CD 实操:创建 .drone.yml 验证 Pipeline
Drone 文档为各种编程语言和包管理工具提供了流水线模板。
这里我们以 Go 语言为例,在 Gitea 仓库根目录创建一个 .drone.yml 作为我们自定义的流水线。

示范:
# .drone.yml
kind: pipeline
name: default
steps:
- name: test
image: golang
commands:
- go test
- name: build
image: golang
commands:
- go build
在 Drone 面板上激活仓库后提交代码到 Gitea 仓库,随即触发 Pipeline 任务。

回到 Gitea 可以看到构建完成后显示的消息:
continuous-integration/drone/push Build is passing

Ok,这样我们就为 Gitea 搭建好了一个 Drone CI/CD 系统。
Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统的更多相关文章
- DevOps实践之一:基于Docker构建企业Jenkins CI平台
基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- Gitea 与 Jenkins 的集成实践,打造你的专属 CI/CD 系统
前言 Gitea 是一个用于代码托管的轻量级单体程序,它能与现有的经典应用集成,诸如代码分析工具 SonarQube.持续集成工具 Drone.Jenkins 以及用于工单管理的客户端插件(VSCod ...
- [转帖]基于docker 搭建Prometheus+Grafana
基于docker 搭建Prometheus+Grafana https://www.cnblogs.com/xiao987334176/p/9930517.html need good study 一 ...
- 基于 Kubernetes 实践弹性的 CI/CD 系统
大家好,我是来自阿里云容器服务团队的华相.首先简单解释一下何为 Kubernetes 来帮助大家理解.Kuberentes 是一个生产可用的容器编排系统.Kuberentes 一方面在集群中把所有 N ...
- 基于docker搭建开源扫描器——伏羲
基于docker搭建开源扫描器——伏羲 1.简介 项目地址 伏羲是一款开源的安全检测工具,适用于中小型企业对企业内部进行安全检测和资产统计. 功能一览: 基于插件的漏洞扫描功能(类似于巡风) 漏洞管理 ...
- 基于Gogs+Drone搭建的私有CI/CD平台
请移步 基于Gogs+Drone搭建的私有CI/CD平台
- 基于Docker搭建大数据集群(六)Hive搭建
基于Docker搭建大数据集群(六)Hive搭建 前言 之前搭建的都是1.x版本,这次搭建的是hive3.1.2版本的..还是有一点细节不一样的 Hive现在解析引擎可以选择spark,我是用spar ...
- 基于Docker搭建大数据集群(七)Hbase部署
基于Docker搭建大数据集群(七)Hbase搭建 一.安装包准备 Hbase官网下载 微云下载 | 在 tar 目录下 二.版本兼容 三.角色分配 节点 Master Regionserver cl ...
- 基于Docker搭建大数据集群(一)Docker环境部署
本篇文章是基于Docker搭建大数据集群系列的开篇之作 主要内容 docker搭建 docker部署CentOS 容器免密钥通信 容器保存成镜像 docker镜像发布 环境 Linux 7.6 一.D ...
随机推荐
- NC50999 表达式计算4
NC50999 表达式计算4 题目 题目描述 给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值 数据可能会出现括号情况,还有可能出现多余括号情况 数据 ...
- Tapdata 肖贝贝:实时数据引擎系列(四)-关于 Oracle 与 Oracle CDC
摘要:想实现 Oracle 的 CDC,排除掉一些通用的比如全量比对, 标记字段获取之外, 真正的增量形式获取变更, 有三种办法: Logminer .XStream .裸日志解析,但不管哪种方法 ...
- 聊聊 C++ 大一统的初始化运算符 {}
一:背景 最近发现 C++ 中的类型初始化操作,没有 {} 运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为 值类型 和 引用类型 两大块,但发现在 C++ 中没这种 ...
- 最强人工智能 OpenAI 极简教程
大家好哇,新同学都叫我张北海,老同学都叫我老胡,其实是一个人,只是我特别喜欢章北海这个<三体>中的人物,张是错别字. 上个月安利了一波:机器学习自动补全代(hán)码(shù)神器,然后就 ...
- docker容器管理操作
Docker容器的四种状态: 运行 已暂停 重新启动 已退出 1.容器的创建 容器创建:就是将镜像加载到容器的过程. 创建容器时如果没有指定容器名称,系统会自动创建一个名称. 新创建的容器默认处于停止 ...
- filebeat + logstash 日志采集链路配置
1. 概述 一个完整的采集链路的流程如下: 所以要进行采集链路的部署需要以下几个步聚: nginx的配置 filebeat部署 logstash部署 kafka部署 kudu部署 下面将详细说明各个部 ...
- 【跟着大佬学JavaScript】之数组去重(结果对比)
前言 数组去重在面试和工作中都是比较容易见到的问题. 这篇文章主要是来测试多个方法,对下面这个数组的去重结果进行分析讨论.如果有不对的地方,还请大家指出. const arr = [ 1, 1, &q ...
- 第十五天python3 文件IO(一)
一.文件打开 open(path,flag[,encoding][,errors]) 参数说明: path:要打开文件的路径 flag:打开方式( r:以只读的方式打开文件,文件的描述符放在文件开头 ...
- 定时脚本删除docker容器中内容
今天在我同步mongo数据库的时候,服务器的磁盘突然就被占满了导致同步中断,mongo容器也停止工作了.然后就想要弄一个能够定时清理同步过程中留存在docker容器中的mongo数据的脚本.话不多说, ...
- && 和 ||粗解
可以这么理解 &&是来找假的,如果找到假就返回假,如果找不到,就返回最后一个真 ||是来找真的,如果找到真就返回真,如果找不到,就返回最后一个假 var speed = 12; var ...