私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

提示:本系列笔记全部存在于
Github,
可以直接在
Github 查看全部笔记

持续部署概述

持续部署是能以自动化方式,频繁而且持续性的,将软件部署到生产环境。使软件产品能够快速迭代。

在之前部署 web 项目时,都是手动进行部署

拉取代码 —> 编译项目 —> 打包镜像 —> 推送镜像仓库 —> 服务器拉取新镜像 —> 停止和移除旧容器 —> 启动新容器

这一整套部署步骤枯燥又费时。

持续部署就是使用工具自动处理整套步骤。代码在提交之后自动执行整套流程将项目部署到生产环境,省去繁琐的人工操作。

持续部署整套流程本质上是一个极其简单的东西。可以拆解为两个阶段

  1. 打包阶段: 拉取代码 —> 编译项目 —> 镜像打包 —> 推送镜像仓库
  2. 部署阶段: SSH 连接服务器 —> 拉取新镜像 —> 停止和移除旧容器 —> 启动新容器

未使用自动化部署工具时,整套套也可以使用 .sh 脚本实现半自动化。甚至可以编写一个小程序,自动连接服务器实现全自动化。

而所谓的持续部署工具本质上做的也是这么一件事,只是提供了更强大更丰富的功能。

Drone

持续部署工具一开始打算使用 GitlabGitlab 中直接集成代码仓库和持续部署工具,用起来会方便很多,但部署完 Gitlab 发现小服务器真心扛不住。

后也考虑过大名鼎鼎的jenkins,查询资料发现 Jenkins 资源占用也挺大,最后选择了一个轻量级的工具 Drone

Drone 也是一个优秀、开源的持续部署工具,具有很高的关注度。https://github.com/harness/drone

不过稍微遗憾的是 Drone 社区不太完善。尤其国内,资料很少。折腾部署时利用 Google 搜索也耗费了不少时间。

Drone 简介

Drone 应用由 Server(服务器)Runner(执行器) 两种服务构成。

Server(服务器) 主要负责管理和展示, Runner(执行器) 主要负责执行操作。

Server

Server(服务器) 负责的工作主要有

  1. 连接集成代码仓库
  2. 提供 web 管理页面
  3. 管理 Runner

代码仓库

Drone 可以无缝集成多种主流代码仓库,官方给出了具体的使用文档。

提供 Web 页面

Server 负责提供 web 管理页面显示执行情况。

管理 Runner

Server 服务可以与一个或多个 Runner 连接通信进行管理。

Runner

Runner(执行器) 是真正执行持续部署操作服务。Runner 执行时会轮询 Server 来确定执行的操作。

Drone 官方提供了多种类型的 Runner(执行器),用于适配不同的运行环境。


SSH Runner 类型 Runner 可以使用容器化管理,所以可以使用 Docker Runner 代替。

Drone 提供了 管道(Pipeline) 机制,管道(Pipeline) 机制下一篇介绍

Drone 部署

Database

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

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

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

Gitea 配置

在此直接集成之前部署的 Gitea 仓库, 至于其它仓库,有兴趣的可以查询文档:https://docs.drone.io/server/overview/

部署 Drone 之前需要先在 Gitea 中添加一个 OAuth 登录密钥, Drone 使用的 OAuth 方式登录。

登录成功后重定向 URL 地址为 Drone 登录页。 /login 路由。

PS:注意,此地址必须设置公网可访问地址。

客户端 ID客户端密钥 保存。 客户端 ID客户端密钥 需要在 Drone 配置中使用


Dockerfile

version: '3.9'
# 创建自定义网络
networks:drone:name: dronedriver: bridge
services:# 数据库服务db:image: postgres:latestcontainer\_name: drone\_dbrestart: alwaysnetworks:- drone # 加入到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.8.0 # 目前drone最新版本为 2.8.0container\_name: drone\_serverrestart: alwaysnetworks:- drone # 加入到drone网络ports:- '7929:80'environment:- DRONE\_SERVER\_PROTO=http # 访问协议,创建webHooks和重定向- DRONE\_SERVER\_HOST=82.157.55.94:7929 # 主机名称,创建webHooks和重定向- DRONE\_RPC\_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 # 与 drone runner 通讯的密钥- DRONE\_USER\_CREATE=username:yxs970707,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=https://gitea.mwjz.live # gitea服务器地址- DRONE\_GITEA\_CLIENT\_ID=2c921d85-e40e-41f8-90e0-c77c383786b5 # gitea 客户端 id- DRONE\_GITEA\_CLIENT\_SECRET=ZVZoRWK6jR5mqgAIm6sB5VX6C2LPK1sYKv4hQWyTdULu # gitea 客户端 密钥- DRONE\_GITEA\_SKIP\_VERIFY=false # 禁用 gitea 链接时 tls 验证volumes:- /volumes/drone/server:/data- /var/run/docker.sock:/var/run/docker.sockdepends\_on:- db# Drone Docker Runnerrunner:image: drone/drone-runner-docker:1.8.0 # 目前drone-runner-docker最新版本为 1.8.0container\_name: drone\_runnerrestart: alwaysnetworks:- drone # 加入到drone网络ports:- '7930:3000'environment:- DRONE\_RUNNER\_NAME=docker-runner- DRONE\_RUNNER\_CAPACITY=10 # 限制runner可执行的并发管道数量- DRONE\_RPC\_PROTO=http # 访问drone server 协议- DRONE\_RPC\_HOST=server # 访问drone server 服务器地址- DRONE\_RPC\_SECRET=e1ad8a7f3dbc68ca9c21bcc949335009 # 与 drone server 通讯的密钥- DRONE\_UI\_USERNAME=yxs970707 # Drone Runner 的 UI 用户账号- DRONE\_UI\_PASSWORD=yxs970707 # Drone Runner 的 UI 用户密码volumes:- '/var/run/docker.sock:/var/run/docker.sock'depends\_on:- server

Dockerfile 中部署了三个服务:

  • 数据库(postgres)
  • Server(drone/drone:2.8.0)
  • Runner(drone/drone-runner-docker:1.8.0)

数据库使用的是 postgres。三个服务之间通信使用的是自定义 network

PS: 多个应用服务可以共享同一个数据库服务,也可以创建独立的数据库服务。在当前服务器中,Gitea 应用和 Drone 应用创建了各自独立的数据库服务,这种方式会浪费一些服务器资源。但是维护起来比较方便。
具体采用哪种方案可以根据不同场景选择

部署 Droneenvironment 属性有些麻烦,在此简单介绍下某些属性。

Server

DRONE_SERVER_PROTO 、 DRONE_SERVER_HOST

这两个属性是设置 Webhook 重定向 URL 的访问协议和主机名称。 Webhook 在下面会介绍到。

DRONE_RPC_SECRET

此属性是设置 Server(服务器)Runner(执行器) 之间通讯的密钥,Server(服务器)Runner(执行器) 必须设置相同的密钥值才允许通信。

可以在 服务器(Linux) 中使用 openssl 生成密钥

openssl rand -hex 16

DRONE_USER_CREATE

此属性是设置 Drone 管理员。

注意:username 必须设置为 OAuth 用户(Gitea 的用户名),否则不具有管理员权限。

非管理员会少部分功能,例如不许设置 Trusted 属性

DRONE_DATABASE_DRIVER 、 DRONE_DATABASE_DATASOURCE

这两个属性是设置数据库类型和数据库连接。

具体连接配置可以参考官方文档

DRONE_GIT_ALWAYS_AUTH

此属性是设置 OAuth 登录用户进行拉取代码

默认情况下 OAuth 只作用于登录操作。但存储库设置为私有时,需要登录用户才允许拉取代码,此时需要将此属性设置为 true

可以参考 https://discourse.drone.io/t/fatal-could-not-read-username-for/6198

默认值为 false

DRONE_GITEA_SERVER 、 DRONE_GITEA_CLIENT_ID 、DRONE_GITEA_CLIENT_SECRET

这几个属性是设置 Gitea 地址和 OAuth ID、密钥。

DRONE_GITEA_SKIP_VERIFY

此属性是设置禁用 GiteaTLS 验证,

此属性为 false 时,当 Gitea 使用 HTTPS 协议但证书有问题,会出现授权验证失败,报 x509 错误。

下图是将 网关(Nginx)Gitea 证书特意处理无效后进行的授权验证测试。 有兴趣的朋友可以自行测试。


当存储库使用 HTTPS 协议但没有证书情况下,此属性设置设置为 true 跳过 TLS 验证。

默认值为 false

Runner

DRONE_RUNNER_CAPACITY

此属性是设置 Runner(执行器) 并发管道数量

默认值为 2

DRONE_RPC_PROTO 、DRONE_RPC_HOST

这两个属性设置通信 Server(服务器) 的协议和主机名。 主机名使用 server-name

DRONE_UI_USERNAME、DRONE_UI_PASSWORD

Runner(执行器) 也具有 UI 展示页面,可以查看当前执行器的执行信息。这两个属性是设置 UI 展示页面的用户名称和密码

执行部署

使用 Dockerfile 进行部署,大概率不会出现问题,我进行了多次测试,

但部署 Drone 难免会碰到问题,每个人碰到的问题还不尽相同。所以需要善用 Google 查询

部署成功后访问,会跳转到欢迎页面,点击按钮就会进行 Gitea 登录


登录成功后会跳转到主页面,主页面上只有一项,就是 Gitea 中目前的存储库(web),这个存储库当前为未激活状态。


未激活情况下进入当前项目会跳转到 settings 页面,当前页面具有一个激活按钮,点击就可以激活此存储库

激活后会向 Gitea 注入一个 Webhook

这个 Webhook 会监听仓库的变更情况,当代码仓库发生变化时, Webhook会向 Drone 推送消息。

Drone 接收到消息之后便可以执行,这也就是持续部署的第一步。



Drone 设置

激活完毕之后 settings 页面就会出现很多设置

Protected

此属性是设置 是否要验证 配置文件(.drone.yml) 中的签名,开启后签名验证错误则不允许构建

Trusted

此属性设置是否允许使用挂载权限,挂载在之后会介绍。

不开通此权限,volumes 挂 host path 时报 Linter: untrusted repositories cannot mount host volumes 错误

注意:非管理员用户不具有此属性。

Auto cancel pushes、Auto cancel running

这两个属性是优化操作的属性。

开启这两个属性,当执行构建任务时,会自动取消之前未执行完毕的构建任务。

当合并多个 commit 时,这个属性具有很好的效果。

Timeout、Configuration

timeout 是设置构建任务执行的超时时间。

Configuration 是设置配置文件文件,默认为 .drone.yml。 这个一般不需要改动。

PS: 注意:配置文件必须设置根目录

Secrets

secrets 是用来设置敏感属性的。

编写配置时,有些敏感数据需要隐藏,如账号密码,这些属性可以配置 Secrets 使用

测试执行

现在对 Giteaweb 项目提交就可以触发 Webhook 发送消息,

也可以在 Gitea 中主动触发 Webhook测试

但当前推送会返回一个 context deadline exceeded (Client.Timeout exceeded while awaiting headers) 错误。

这个错误是因为根目录中没有找到 配置文件(.drone.yml)

https://discourse.gitea.io/t/client-timeout-exceeded-while-awaiting-headers/4148/4



在根目录创建 .drone.yml 文件并添加了一个测试配置,配置文件中内容下一篇介绍

kind: pipeline # 定义一个管道
type: docker # 当前管道的类型
name: test # 当前管道的名称
steps: # 定义管道的执行步骤- name: test # 步骤名称image: node:latest # 当前步骤使用的镜像commands: # 当前步骤执行的命令- echo 测试drone执行


提交代码,Webhook 会主动推送到 DroneDrone 会成功构建任务。


PS:有可能还是会推送失败或者构建失败,可能会发生各种各样的问题。

在页面中, 具有两个 steps,这是因为默认第一个会拉取仓库代码,当然这个操作也可以禁用。

网关配置


server {#SSL 访问端口号为 443listen 443 ssl http2;#填写绑定证书的域名server\_name drone.mwjz.live;#日志error\_log /var/log/nginx/drone/error.log;access\_log /var/log/nginx/drone/access.log;#证书文件ssl\_certificate /etc/nginx/conf.d/ssl/drone/drone.mwjz.live\_bundle.crt;#证书密钥文件ssl\_certificate\_key /etc/nginx/conf.d/ssl/drone/drone.mwjz.live.key;ssl\_ciphers SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4;ssl\_protocols TLSv1 TLSv1.1 TLSv1.2;ssl\_prefer\_server\_ciphers on;location / {proxy\_pass http://10.0.24.12:7929;}
}

Drone 方面,我没有找到怎么修改配置,所以直接使用了暴力方式,重新部署。

部署的时候不需要清理 volume, 不清理重新部署还会保留之前的记录,当然也可以清理后重新部署。

如果没有删除 volume的话,需要在 Gitea 中手动修改一下 Webhook 的推送地址

server:image: drone/drone:2.8.0 # 目前drone最新版本为 2.8.0container\_name: drone\_serverrestart: alwaysnetworks:- drone # 加入到drone网络ports:- '7929:80'environment:- DRONE\_SERVER\_PROTO=https # 访问协议,创建webHooks和重定向- DRONE\_SERVER\_HOST=drone.mwjz.live # 主机名称,创建webHooks和重定向



无证书 HTTPS 触发 Webhook

在部署时碰到这样一种情况,当 Drone 使用 HTTPS 但是没有证书情况下,Webhook 推送也会出现 X509 错误。



解决这个问题需要设置 Gitea 的配置, 在 /data/gitea/conf/app.ini 配置文件中设置跳过验证

[webhook]
SKIP_TLS_VERIFY = true


也可以在部署 Gitea时直接添加在 Dockerfileenvironment 属性

#gitea服务
server:image: gitea/gitea:latestcontainer\_name: gitea\_serverrestart: alwaysenvironment:- GITEA\_\_webhook\_\_SKIP\_TLS\_VERIFY=true # webhook 跳过 tls 验证- GITEA\_\_webhook\_\_DELIVER\_TIMEOUT=10 # webhook 超时时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PS图像菜单下计算命令

PS图像菜单下计算命令通过通道的混合模式得到的选区非常精细,从而调色的时候过度非常好。功能十分强大。 下面用计算命令中的"相加"和"减去"模式做实例解析,这里通道混合模式和图层混合模式原理是一样的。 原图: 实例目…

win10 VScode配置GCC(MinGW)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 前提 安装 Visual Studio Code安装 C/C 扩展 for VS Code 也可以在vscode的extension界面搜索’c’查找插件安装 3. 获取最…

复制构造函数的用法及出现迷途指针问题

复制构造函数利用下面这行语句来复制一个对象: A (A &a) 从上面这句话可以看出,所有的复制构造函数均只有一个参数,及对同一个类的对象的引用 比如说我们有一个类A,定义如下: ?12345678910class A{public:A(int i…

Linux下压缩某个文件夹(文件夹打包)

为什么80%的码农都做不了架构师?>>> tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。 zip 压缩方法: 压缩当前的文件夹 zi…

GoJS 使用笔记

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 作为商业软件,GoJs很容易使用,文档也很完备,不过项目中没有时间系统地按照文档学习&…

Android学习笔记:TabHost 和 FragmentTabHost

2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记:TabHost 和 FragmentTabHostTabHost命名空间:android.widget.TabHost初始化函数(必须在addTab之前调用):setup(); 包含两个子元素:…

PostgreSQL VACUUM 之深入浅出 (二)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 AUTOVACUUM AUTOVACUUM 简介 PostgreSQL 提供了 AUTOVACUUM 的机制。 autovacuum 不仅会自动进行 VACUUM,也…

分布式概念与协议

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 分布式协议 分布式理论概念 1. 分布式数据一致性 分布式数据一致性,指的是数据在多个副本中存储时&#xff…

java Web监听器导图详解

监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,H…

Linux C/C++ UDP Socket 网络通信

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 昨晚 Vv 让我给她讲讲网络编程,于是我就傻乎乎的带她入了门… 以下内容为讲课时制作的笔记~ 1. sock…

strtok和strtok_r

strtok和strtok_r原型:char *strtok(char *s, char *delim); 功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。 说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。 …

Django ORM

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 目录* Django ORM ORM实操之数据库迁移 ORM实操之字段的修改 ORM实操之数据的增删改查 数据库同步 ORM创建表关系 Dja…

分享25个高质量的移动设备wordpress主题(Mobile theme)

日期:2012-9-10 来源:GBin1.com wordpress毋庸置疑是占有量最大的博客管理系统。提供强大的功能和使用的主题及其自定义模块。随着移动互联网的发展,更多的人开始使用移动设备访问互联网,为了更好的迎合用户的需要,我…

.NET NPOI导出Excel详解

http://www.cnblogs.com/yinrq/p/5590970.html .NET NPOI导出Excel详解 NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件。 支持的文件格…

c++隐式类型转换存在的陷阱

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 目录* 目标代码 构造函数定义的隐式类型转换分析a1分析a2分析a3 1|0目标代码 旨在弄懂下面的代码,明确变量a1…

Android中将一个图片切割成多个图片[转]

有种场景,我们想将一个图片切割成多个图片。比如我们在开发一个拼图的游戏,就首先要对图片进行切割。 以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。 一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的…

并行开发 —— 第六篇 异步编程模型

在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能有人会问,这样做有什么好处,下面一一道来。 一: Begin/En…

C++相关

初始化列表中的初始化顺序1 class Printer{2 public:3 Printer(string name){cout<<name;}4 };5 class Container{6 public:7 Container():b("b"),a("a"){}8 Printer a;9 Printer b; 10 }; 11 12 int main…

Java中的Unsafe在安全领域的一些应用总结和复现

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 目录* 0 前言 1 基本使用 1.1 内存级别修改值1.2 创建对象1.3 创建VM Anonymous Class 2 利用姿势 2.1 修改值以关闭RASP等…

Spring Boot中使用Swagger2构建强大的RESTful API文档

由于Spring Boot能够快速开发、便捷部署等特性&#xff0c;相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因&#xff0c;这些终端会共用很多底层业务逻辑&#xff0c;因此我们会抽象出这样一层来同时服务于多个…