Drone 简介

Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,由GO语言编写,可用于自动化测试与构建,甚至发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔。相对于常见的Jenkins,选中 Drone的原因在于它非常简洁,不像Jenkins那样复杂,同时它拥有可以满足基本需求的能力,并且提供了许多实用的插件,如GitHub,Email,微信,钉钉等。

Drone 官方地址:https://www.drone.io/

Drone 开源地址:https://github.com/harness/drone

由于本人是在公司内部服务器部署的,所以都是使用的HTTP部署。HTTPS部署详见另一位大佬的文章:https://www.cnblogs.com/yan7/p/15881087.html

Drone 版本 2.9.1

Gitea 版本 1.17.6

Docker 版本 20.10.12

Harbor 版本 1.10.10

仓库项目 .NET5

Drone CI-Gitea

Drone官方文档 中支持的Git仓库有很多种:

本文示例也选用相对Gitlab更轻量化的Gitea,演示Gitea版本为:1.17.6,Gitea部署不是本文重点,请移步其他文章。

创建OAuth2密钥

登录Gitea后,点击右上角头像选择设置(如果没设置选项,需要管理员权限):

然后选择 应用,在最下面创建OAuth2应用,填写名称和重定向URI:

点击创建后,会跳转到这个页面,记住 客户端ID和 客户端密钥,后面部署Drone会用到,客户端密钥在退出本页面时候就会显示为*,所以尤其需要记住 客户端密钥,然后点击保存。

Docker-Compose部署

Drone 数据存储默认使用 sqlite 数据库。并且提供支持 postgres 和 MySql

官方文档中强烈建议使用 postgres 而非 mysql。 某些操作在 mysql 未得到优化。 https://docs.drone.io/server/storage/database/

PS: 支持 postgres9.6 及更高版本 、 mysql:5.6 及更高版本

DockerCompose.yml:

# 在执行DockerCompose前,需要创建网络 docker network create drone
version: '3.9'
# 创建自定义网络
networks:
drone:
name: drone
driver: bridge
services:
# Drone的数据库服务
db:
# 拉取的镜像名称和版本号
image: postgres:latest
# 容器名称
container_name: drone_db
# 该容器随Docker启动而启动
restart: always
# 加入到drone网络
networks:
- drone
# 端口映射,左边宿主机端口:右边容器内部端口
ports:
- '7931:5432'
environment:
- POSTGRES_USER=drone # PGSQL默认用户
- POSTGRES_PASSWORD=drone # PGSQL默认密码
- POSTGRES_DB=drone # PGSQL默认数据库
volumes:
# 数据持久性挂载宿主机 左边宿主机路径:右边容器内路径
- /volumes/drone/db:/var/lib/postgresql/data
# Drone Server 服务
server:
image: drone/drone:2.9.1 # 目前drone最新版本为 2.9.1
container_name: drone_server
# 该容器随Docker启动而启动
restart: always
# 加入到drone网络
networks:
- drone
# 端口映射,左边宿主机端口:右边容器内部端口
ports:
- '7929:80'
environment:
- DRONE_SERVER_PROTO=http # 访问协议,创建webHooks和重定向
- DRONE_SERVER_HOST=192.168.2.7:7929 # 主机名称,创建webHooks和重定向
# 与 drone runner 通讯的密钥 可以在 服务器(Linux) 中使用 openssl 生成密钥
- DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009
# 设置管理员账户,username和Gitea账户名称需要一致
- DRONE_USER_CREATE=username:young,admin:true
- DRONE_DATABASE_DRIVER=postgres # 数据库类型
- DRONE_DATABASE_DATASOURCE=postgres://drone:drone@db/drone?sslmode=disable # 数据库连接
- DRONE_GIT_ALWAYS_AUTH=true # 使用 oauth 身份验证信息拉取代码
- DRONE_GITEA_SERVER=http://192.168.2.7:3000 # gitea服务器地址
- DRONE_GITEA_CLIENT_ID=2c921d85-e40e-41f8-90e0-c77c383786b5 # gitea 客户端 id 刚才创建的OAuth2的客户端Id
- DRONE_GITEA_CLIENT_SECRET=ZVZoRWK6jR5mqgAIm6sB5VX6C2LPK1sYKv4hQWyTdULu # gitea 客户端 密钥 刚才创建的OAuth2的客户端密钥
- DRONE_GITEA_SKIP_VERIFY=false # 禁用 gitea 链接时 tls 验证 volumes:
# 数据持久性挂载宿主机 左边宿主机路径:右边容器内路径
- /volumes/drone/server:/data
- /var/run/docker.sock:/var/run/docker.sock
# 依赖的容器
depends_on:
- db
# Drone Docker Runner
runner:
image: drone/drone-runner-docker:1.8.0 # 目前drone-runner-docker最新版本为 1.8.0
container_name: drone_runner
restart: always
networks:
- drone # 加入到drone网络
ports:
- '7930:3000'
environment:
# 名称
- DRONE_RUNNER_NAME=docker-runner
- DRONE_RUNNER_CAPACITY=10 # 限制runner可执行的并发管道数量 默认为2
- DRONE_RPC_PROTO=http # 访问drone server 协议
- DRONE_RPC_HOST=server # 访问drone server 服务器地址
# 与 drone server 通讯的密钥, 需与上面Server的 DRONE_RPC_SECRET 值相同
- DRONE_RPC_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009
- DRONE_UI_USERNAME=admin # Drone Runner 的 UI 用户账号
- DRONE_UI_PASSWORD=qwe123 # Drone Runner 的 UI 用户密码
volumes:
- '/var/run/docker.sock:/var/run/docker.sock'
depends_on:
- server

将上述保存,文件名为:drone-docker-compose.yml

docker-compose 执行命令:

docker-compose -f drone-docker-compose.yml up -d
# -f dockerfile文件名,不使用-f参数时,默认就为 docker-compose.yml
# -d 后台启动并运行容器

如果未报错,那么docker就启动成功了,使用Portainer查看容器状态:

显示都为running状态。

部署成功后激活存储库

部署成功后,访问7929端口的页面:

点击Continue会自动跳转到Gitea的授权页面:

如果你浏览器没有登陆Gitea,会先让你登陆:

登陆且授权后,就会跳转到Drone的页面了,只需要授权一次即可,往后我们登录了Gitea就直接进入Drone了。

进入Drone会看到未激活的仓库,选择需要激活的仓库,然后我们点击激活它:

激活成功后,回到Gitea查看被激活的仓库,就会看到仓库已经自动的配置好了WebHook(Web钩子):

点击钩子,进去找到测试推送,点击测试推送,如果出现如下绿色,那钩子就没问题了:

踩坑小Tips:

如果是红色,且HTTP相应内容包含context deadline exceeded (Client.Timeout exceeded while awaiting headers),请检查你的仓库根目录是否存在Drone的.drone.yml配置文件,我就是这个配置文件放错了地方卡了我大半天。。。

到这里我们的Drone就安装完毕了,激活仓库后,我们向仓库推送一个commit,Gitea就会发送消息通知Drone去自动构建了!

配置Drone的自动构建

Drone支持不同环境的不同管道配置,这里我使用Docker Pipelines管道配置简单来说就是Drone的每一步操作都在一个临时的Drone的容器中进行,容器操作完会自动销毁,容器之间会共享当前的工作目录。

本人这里使用了私有镜像仓库 Harbor ,Harbor的搭建文章点击此处。

Drone 配置文件 .drone.yml 如下:

kind: pipeline # 默认为 pipeline
type: docker
name: deployment # 构建文件名称 steps: # 数组结构,流水线化的构建步骤
# 步骤1 将镜像推送到 Harbor
- name: publish 2 harbor
pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
image: plugins/docker
settings:
dockerfile: Demo/Dockerfile # Dockerfile 在项目中的位置
tags: latest # 生成镜像后的Tag标签
insecure: true # 是否不安全
registry: 192.168.2.7:8088 # 私有镜像仓库地址
repo: 192.168.2.7:8088/zhjs/drone-ci-demo # 仓库地址/Harbor项目名称/自定义镜像名称
username:
# 从drone仓库配置中秘密空间读取用户名
from_secret: docker_username
password:
# 从drone仓库配置中秘密空间读取密码
from_secret: docker_password
# 步骤2 使用ssh访问主机,拉去镜像并运行部署
- name: deploy
pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
image: appleboy/drone-ssh
settings:
# 需要部署的主机地址
host: 192.168.2.7
# 主机ssh端口
port: 22
# 主机登陆用户名
username: root
password:
# 从drone仓库配置中秘密空间读取密码
from_secret: ssh_pwd
script:
- echo =========暂停并删除旧容器========
- docker stop drone-ci-demo-1 && docker rm drone-ci-demo-1
- docker stop drone-ci-demo-2 && docker rm drone-ci-demo-2
- echo =========删除旧镜像=============
- docker rmi 192.168.2.7:8088/zhjs/drone-ci-demo:latest
- echo ========从harbor拉取最新镜像========
- docker pull 192.168.2.7:8088/zhjs/drone-ci-demo:latest
- echo ===============运行镜像==========
- docker run --name drone-ci-demo-1 -p 5555:80 -d 192.168.2.7:8088/zhjs/drone-ci-demo:latest
- docker run --name drone-ci-demo-2 -p 5556:80 -d 192.168.2.7:8088/zhjs/drone-ci-demo:latest
- echo ========部署成功========
# 步骤3 部署完成,邮件通知
- name: notify
pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
image: drillster/drone-email
settings:
recipients_only: true # 只发送给指定邮件收件人,不默认发送给流水线创建人
host: smtp.qq.com #SMTP服务器 例如 smtp.qq.com
port: 465 #SMTP服务端口 例如QQ邮箱端口465
subject: "Drone Build Complete!" # 邮件主题内容
username: #邮箱用户名
from_secret: qqmail_username
password: #邮箱密码
from_secret: qqmail_pwd
from:
from_secret: qqmail_username
recipients: #收件人
from_secret: email_recipients # 格式:xxxx,xxxx
when: #执行条件
status:
- success
- changed
- failure

文件编写完成后,把代码git push到仓库中,Gitea会通知Drone进行部署,Drone找到.drone.yml配置文件,就会按照配置文件中的步骤进行构建了,部署期间可以在Drone中查看到每一步的部署情况

首次部署的速度可能略慢,最终部署成功图:

总结:对于小团队来说,总体是完全可以接受的,自动部署一旦配置好了,所有的编译/测试/打包/部署的工作就交给Drone去完成了,而我们只需要专注于我们的代码编写就行了!

Drone-比Jenkins更轻量化的持续集成部署工具的更多相关文章

  1. Centos7.4简单安装使用gitlab+maven+jenkins实现java代码的持续集成部署

    1.工具的简单介绍 gitlab--源代码版本管理控制工具 maven--java代码编译构建工具 jenkins--基于java开发的自动化持续集成部署工具 sonar--代码质量管理工具 2.gi ...

  2. Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成——部署方案优化

    Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成--部署方案优化 之前我们做的方案部署都是只能选择一个微服务部署并只有一台生产服务器,每个微服务只有一个 ...

  3. 基于 Node.js 的轻量「持续集成」工具 CIZE

    CIZE 是什么? CIZE 是一个「持续集成」工具,希望能让开发人员更快捷的搭建一个完整.可靠.便捷的 CI 服务. 甚至可以像 Gulp 或 Grunt 一样,仅仅通过一个 cizefile.js ...

  4. [C#]使用 Jenkins 为 .Net Core 实现持续集成/部署

    在前后端分离开发的项目当中为了避免重复构建发布,我们需要部署一个持续发布环境,而目前的开发环境服务器都是基于 CentOS 的,因此每次在本地发布之后还需要打包,上传,部署,十分繁琐.故这里采用了比较 ...

  5. [dotnet core]落地微服务特色的DevOps管道,持续集成/部署到kubernetes。

    目录 前言 目标 工具 - 最小的学习成本 方案 - 愿景 1. 持续集成 - CI 2. 持续部署 - CD 部署环境 1. 部署gitlab-runner 2. 注册gitlab-runner 搭 ...

  6. ASP.NET Core + Docker + Jenkins + gogs + CentOS 从零开始搭建持续集成

    为什么不用gitlab? 没有采用gitlab,因为gitlab比较吃配置,至少得2核4G的配置.采用go语言开发的gogs来代替,搭建方便(不到10分钟就能安装完成),资源消耗低,功能也比较强大,也 ...

  7. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    前言     上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...

  8. Jenkins+maven+git+sonar 系统持续集成&代码单測管理

    Jenkins+maven+git+sonar 系统持续集成&代码单測管理 Jenkins的安装 Jenkins是基于Java开发的一种持续集成工具,用于监控持续反复的工作.功能包含: 1.持 ...

  9. Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...

随机推荐

  1. Linux操作系统基本知识

    1.Linux开发环境 2.GCC 2.1GCC工作流程 预处理:只运行 C 预编译器. 宏去掉了,注释没有了 汇编 编译 链接 2.2GCC常用参数选择 选项 解释 -ansi 只支持 ANSI 标 ...

  2. Hadoop(四)C#操作Hbase

    Hbase Hbase是一种NoSql模式的数据库,采用了列式存储.而采用了列存储天然具备以下优势: 可只查涉及的列,且列可作为索引,相对高效 针对某一列的聚合及其方便 同一列的数据类型一致,方便压缩 ...

  3. 老生常谈系列之Aop--CGLIB动态代理的底层实现原理

    老生常谈系列之Aop--CGLIB动态代理的底层实现原理 前言 上一篇老生常谈系列之Aop--JDK动态代理的底层实现原理简单讲解了JDK动态代理的实现,动态代理常用实现里面的双子星还有另一位--CG ...

  4. HandlerMethodArgumentResolver 自定义使用

    HandlerMethodArgumentResolver 自定义使用 1.HandlerMethodArgumentResolver 的应用场景 ​ HandlerMethodArgumentRes ...

  5. TCP 协议有哪些缺陷?

    作者:小林coding 图解计算机基础网站:https://xiaolincoding.com 大家好,我是小林. 忽然思考一个问题,TCP 通过序列号.确认应答.超时重传.流量控制.拥塞控制等方式实 ...

  6. 使用requests爬取梨视频、bilibili视频、汽车之家,bs4遍历文档树、搜索文档树,css选择器

    今日内容概要 使用requests爬取梨视频 requests+bs4爬取汽车之家 bs4遍历文档树 bs4搜索文档树 css选择器 内容详细 1.使用requests爬取梨视频 # 模拟发送http ...

  7. 使用WebDriverManager实现自动获取浏览器驱动程序

    原理: 自动到指定的地址下载相应的浏览器驱动保存到缓存区 ~/.cache/selenium 痛点: 解决因Chrome浏览器升级,driver需要同步升级,要重新下载驱动的问题 区别: 传统方式 需 ...

  8. SSO 方案演进

    背景介绍 随着业务与技术的发展,现今比以往任何时候都更需要单点登录 SSO 身份验证. 现在几乎每个网站都需要某种形式的身份验证才能访问其功能和内容. 随着网站和服务数量的增加,集中登录系统已成为一种 ...

  9. 单源最短路问题:OJ5——低德地图

    本题就是一道单源最短路问题.由于是稀疏图,我们采用Dijkstra算法. Dijkstra算法原理 Dijkstra算法的步骤 我们把所有的节点分为两个集合:被选中的(visited==1) 和 未被 ...

  10. postman 脚本和变量

    背景 后端接口有登录或鉴权验证,通过 swagger 调用比较费劲,并且 java 的 swagger 库(不够自动化,嵌套类支持需要各种配置才能正常显示 schema)个人感觉也没有 .net co ...