基于 CODING CD + Nocalhost 在大型应用的 ChatOps 实践
本文作者:红亚科技 CTO——卢兴民
红亚科技聚焦信息技术发展,为信息技术相关专业提供优质教学服务
背景
ChatOps 最早起源于 GitHub,它以沟通平台为中心,通过与机器人产生对话和交互,使开发人员只需在聊天窗口即可完成 DevOps 所承载的工作。
服务 600+ 高校的 IT 实训教学平台“青椒课堂”,为何选择 ChatOps 来承载业务,又如何将 SaaS 工具与开源工具结合形成完整的技术方案,本篇文章将为你揭晓答案。
为什么“复杂应用”开发测试阶段需要 ChatOps
- 随着部署工具及部署 Pipeline 流程引入到整个开发迭代流程中,使用发布单模式进行开发、测试环境的部署往往需要打开多个 Web 控制台,对于日常开发迭代来说较为繁琐。
- 随着项目的开发,项目会存在多个 git repo,每个 git repo 又会产生多个制品用于部署,基于手动选择的方式对于开发人员开发、测试非常不友好。
- 在消息通知方面,虽然使用了 Webhook 将项目协同信息进行了群通知,但项目所有通知发送到一个群内,造成信息爆炸,逐渐失去通知意义。
首先来看我们团队当前的部署流程所需要的步骤,需要经过“等待 CI 构建成功”、“发布单选择所需制品及环境”、“部署”这么几个流程。其中制品的选择,在每次发布时,都需要进行选择,当组件较多时,尤为繁琐。
并不是所有的场景都需要 ChatOps,这里重点强调“复杂应用”,是因为应用复杂度提高后,会面临配置复杂、制品复杂、流程复杂的局面,因此需要 ChatOps 工具来降低开发测试过程中的部署难度。而对于简单的应用,例如项目初始阶段的单体应用,则不必大费周折折腾复杂的工具流程,在 CI 中集成小部分自动更新测试环境的流程就很高效。
如何结合 CI/CD 体系和 IM 开放平台构建 ChatOps 工具
当前 CI/CD 落地的现状及选型思考
持续集成
持续集成是所有流程的基础,目标也很明确,就是将构建环境、制品类型进行统一,便于进行后续的部署使用。在当前容器化流程的背景下,我们也是选择了容器镜像作为最终制品,开发人员产出统一均为容器镜像,方便进行部署。所有的代码仓库,无论复杂与否,都会创建 Jenkinsfile 进行构建。
应用定义选型
在应用定义的选择上,经历了最初的 PaaS 平台自定义应用模型、代码仓库存储静态 Manifest 文件后,最终选择了 Helm 作为应用定义的工具,主要基于一下几个方面考虑:
- 部署方式简单,可以通过单条命令直接进行安装,即使在工具较为匮乏的私有化环境中脱离部署工具也可使用一条命令进行部署和升级。
- 使用模板进行定义, 便于进行多个副本部署及差异化配置。
- 通过制品库来存储 Helm chart,dev 环境使用构建号进行版本推送,生产环境通过 Helm 仓库打 tag 后进行版本推送,实现“应用定义”的版本化。
应用部署工具选型
在应用部署工具上选择上使用了 CODING CD,主要基于以下的内容进行考虑:
- 应用定义及组件版本分离。
- 基于环境加载公共配置。
- 发布启动参数定制。
将 Helm chart 及容器镜像作为制品输入,通过制品绑定,将 Helm chart 版本与 image 版本进行分离,实现应用定义和应用组件版本的独立配置。
使用 values 文件引用,方便的对“某一类”环境进行统一配置,例如公用云不同厂商间的差异化配置。
构建适合团队的 ChatOps 体系
ChatOps 工具构建的目标
- 解决消息杂而乱的问题,以项目迭代为粒度进行消息的分类、创建 IM 群组。
- 解决开发测试环境创建繁琐、需要口头约定的问题,以项目迭代为粒度,创建独立的测试环境。
- 尽量避免 Web 控制台操作。
- 迭代结束后自动清理环境、群。
开发测试过程流程梳理
如下图所示,我们对开发测试的整个部署流程进行梳理。其中最为繁琐的、需要多次人工操作的部分就是“部署配置” + “版本选择”这个过程,如何将制品按照一定的规则更新到对应的环境中,并且能够记住当前的选择便是这个流程的关键。
首先,我们需要将整个部署流程进行模板化,这里我们使用 Namespace 作环境间的隔离,将环境中最关键的两个因素,Namespace、访问域名作为启动参数,将单一的部署流水线模板化。
通知隔离
通过接管 Webhook 事件,将原有的项目协同通知进行重新分发。当项目协同工具中产生迭代创建时,自动触发创建一个预制好 DevOps 机器人的群,并利用 IM 提供的卡片能力对消息进行优化,增加便捷的入口。项目协同事项变更时,自动对群内成员进行增删。同时,环境也与当前的迭代关联,在需要时通过聊天指令进行快速创建。在迭代结束时,回收群、测试环境等,进行清理工作。
当前 ChatOps 主要实现以下指令:
- deploy —— 唤出部署设置卡片。
- branch —— 设置某个仓库对应的分支、查找对应制品并唤出部署卡片。
当环境创建成功后,ChatOps 控制器会记录当前环境的制品选择,当对应的制品有更新时,会自动更新当前的环境,实现测试环境一次配置,整个迭代内自动更新。
开发测试阶段如何快速调试应用
在日常的开发过程中,基于上述的 ChatOps 流程进行环境的部署和更新已经能满足大部分的需求,代码推送后,也可以在分钟级做到环境的更新。
单对于联调和测试时遇到的问题需要修改时,等待一个 CI/CD 的流程显得非常漫长,另外开发新的功能和新组件时,想快速放入测试环境中也较为繁琐。因此我们在寻求一个工具,用于快速调试开发环境。
在早年的服务端开发时,我们时常使用 sftp 插件,将本地代码同步到服务器上进行执行,那么 Nocalhost 就是容器化的 rsync 工具。Nocalhost 在进入调试模式时,把对应的 Container 镜像替换为指定的开发镜像,并增加一个文件同步的 Sidecar,可以将本地的代码同步至容器中,对于脚本类型的语言可以直接进行调试,像 Golang 需要编译的类型,可以在本地构建进行同步,也可以直接在容器中进行构建。
整个使用的过程中需要留意的关键步骤是制作适合开发调试使用的镜像,Nocalhost 提供了常见环境的开发镜像,但应用于自己团队内部时,镜像所包含的内容往往与组件相关,此时就需要定制一个适用于当前业务的开发镜像。主要基于以下几点考虑:
- 尽量包含实际环境中使用镜像中的工具和常用的调试工具。
- 去除掉影响调试的缓存组件,例如 PHP 中的 OPcache。
总结
随着业务的复杂程度提高,开发测试流程中重复繁琐的操作会变得越来越多,基于已有的 CI/CD 体系构建 ChatOps 工具是解决这种问题的一个思路,选择适合自己团队的方案才是最为重要。
基于 CODING CD + Nocalhost 在大型应用的 ChatOps 实践的更多相关文章
- 基于 CODING 轻松搞定持续集成
点击观看视频教程 带你一步一步搞定 CODING 持续集成 持续集成加速软件交付 持续集成这个概念是由 Grady Booch 在 1991 年首次提出,随后成为了 DevOps 的核心实践之一.持续 ...
- 基于消息队列 RocketMQ 的大型分布式应用上云最佳实践
作者|绍舒 审核&校对:岁月.佳佳 编辑&排版:雯燕 前言 消息队列是分布式互联网架构的重要基础设施,在以下场景都有着重要的应用: 应用解耦 削峰填谷 异步通知 分布式事务 大数据处理 ...
- 大型网站系统架构实践(六)深入探讨web应用集群Session保持
原理 在第三,四篇文章中讲到了会话保持的问题,而且还遗留了一个问题,就是会话保持存在单点故障, 当时的方案是cookie插入后缀,即haproxy指负责分发请求,应用服务自行保持用户会话,如果应 用服 ...
- 基于Jenkins的开发测试全流程持续集成实践
今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...
- 大型网站系统架构实践(五)深入探讨web应用高可用方案
从上篇文章到这篇文章,中间用了一段时间准备,主要是想把东西讲透,同时希望大家给与一些批评和建议,这样我才能有所进步,也希望喜欢我文章的朋友,给个赞,这样我才能更有激情,呵呵. 由于本篇要写的内容有点多 ...
- 基于Raft构建弹性伸缩的存储系统的一些实践
基于Raft构建弹性伸缩的存储系统的一些实践 原创 2016-07-18 黄东旭 聊聊架构 最近几年来,越来越多的文章介绍了 Raft 或者 Paxos 这样的分布式一致性算法,但主要集中在算法细节和 ...
- [转] 基于NodeJS的前后端分离的思考与实践(五)多终端适配
前言 近年来各站点基于 Web 的多终端适配进行得如火如荼,行业间也发展出依赖各种技术的解决方案.有如基于浏览器原生 CSS3 Media Query 的响应式设计.基于云端智能重排的「云适配」方案等 ...
- 【百度】大型网站的HTTPS实践(二)——HTTPS加密算法介绍
大型网站的HTTPS实践(二)——HTTPS加密算法介绍 原创 网络通信/物联网 作者:AIOps智能运维 时间:2018-11-09 15:09:43 358 0 前言 在上一篇文章中,我们简要 ...
- 【百度】大型网站的HTTPS实践(一)——HTTPS协议和原理
大型网站的HTTPS实践(一)——HTTPS协议和原理 原创 网络通信/物联网 作者:AIOps智能运维 时间:2018-11-09 15:07:39 349 0 前言 百度于2015年上线了全站 ...
随机推荐
- SpringBoot | 1.4 数据库事务处理
前言 前面讲解了Sring的AOP,可以知道它是用来抽取公共代码,增强方法的.而在JDBC操作数据库进行数据处理时,有很多重复的公共代码:事务的提交与回滚跟AOP的约定流程很相似.因此,Spring数 ...
- redis集群搭建中遇到的一些问题
redis单机模式启动后,修改完配置文件,使用以下命令创建redis集群: sudo ./src/redis-trib.rb create --replicas 1 ip1:6379 ip2:6379 ...
- mqtt 集成
-- 在pom.xml导入依赖 <!-- mqtt --> <dependency> <groupId>org.springframework.boot</g ...
- pxe+kickstart部署多个版本的Linux操作系统(下)---实践篇
我们在企业运维环境中,难免会遇到使用多个Linux操作系统的情况,如果每天都需要安装不同版本的Linux系统的话,那么使用Kickstart只能安装一种版本的Linux系统的方法则显得有些捉襟 ...
- window下玩转maven私服全流程,融合创建仓库、上传项目资源、下载私服资源
在互联网项目开发浪潮中,maven成为了项目管理依赖的重要工具,更多时候maven只作为拉取外部依赖的手段.但出于安全的考虑的,部门企业难免封装一些私有的工具类,或开源框架的二次开发封装,mave ...
- C语言:结构体应用
#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct student{ ...
- Kubernetes部署-RKE自动化部署
一.简介 RKE:Rancher Kubernetes Engine 一个极其简单,闪电般快速的Kubernetes安装程序,可在任何地方使用. 二.准备工作 I.配置系统 系统:CentOS 7 / ...
- Maven多模块Spring的注入
第一次做多模块项目,Unit Test的时候发现Biz模块没法注入Dal模块的Mappper,提示找不到Bean. POM文件是正确引入了dependency的,扫描的package也没错,所以卡了好 ...
- request - cookie 操作(一)
from urllib import request#headers 带cookieblog_url = "http://www.renren.com/452057374/profile?r ...
- 分别在Update和FixedUpdate使用GetKeyDown
测试目的 探究分别在Update和FixedUpdate使用GetKeyDown执行次数,会不同的 测试开始 在Update测试 我们先在Update测试,很正常是一帧重置一下状态,以防止点击一下执行 ...