chapter 1: 为什么要使用持续交付 在我们的开发部署工作中,有一些典型的反人类发布软件模式: 1.手工部署软件 无论是自己编写的系统,还是系统所需的一些软件:mysql、redis、git等,统统都是用手动部署的方式 试想,如果有一种方法,当你本地Push代码之后,只需要在网页上点击一个按钮,或者点击按钮这一步都省略掉,再倒上一杯咖啡,你的系统已经部署到线上环境了,这样的自动化,不是更人性化吗 2.开发完成后才向类生产环境部署 自动化是必然的趋势,那么典型的解决方案就是使用某个配置管理软件,或者将配置放在某个具体的脚本中,这样会使软件发布轻松很多 chapter 2: jenkins介绍 jenkins是一个开源软件项目,基于 那么接下来,我们就要开始搭建自动化部署的pipeline了。 什么,你说什么是Pipeline?好吧,简单讲解一下 ?
自动化测试要发挥其频繁快速的质量反馈作用,还需要团队从文化和技术上去建设和学习。 提到敏捷交付,我们总会说到持续集成,持续交付,持续发布,即频繁地交付产品特性。 从这个定义可以看出,持续测试的目的即在软件交付的流水线中执行自动化测试以提供对产品质量的反馈。 ,持续测试需要不同类型的自动化测试在交付的不同阶段为产品的不同层级提供反馈。 ---- 最后用个比喻结束这篇文章 会自动化工具算是有了织网的道具,有自动化测试资产算是编出了能捞鱼的网,而持续测试才能真正地实现持续交付,才算是把一张张过滤不同缺陷的网放置于了不断提交变更的交付之流中 软件交付是一项团队工作,即便自动化测试也一样需要全员协作。
当下VUCA的疫情常态化,谁都不知道黑天鹅是怎么出现的,哪怕有了详细的流调、监控、隔离,在严格符合规范的情况下,迪士尼的万圣节差点成为了城市核心停转的导火索。 疫情常态化的背景下,如何高效抗疫又把对民众生活的影响降到最低,是让这个城市和经过这个城市的人们生活更美好一点的必然要求。这背后,是无数相关岗位工作人员日夜不休完成防控的所有标准程序的努力。 不是说软件复杂就做不好,而是从瀑布流程到工程化支撑再到管理能力都跟不上软件的变化,从而导致要么全局刹车,要么问题在扩散,表面很努力,实际效果并不好。 构建适应变化的“流畅、持续高质量交付用户价值”能力!
背景 传统 Web 前后端协作模式中,HTTP API 是前后端的分界点,服务端交付 API,Web 端根据 API 构建应用。 感想 直接交付 SDK,其实在 RPC 调用中很常见。 因为 RPC 接口通常有结构化的协议文件,比如 protobuf,可以借助自动化工具,生成各种语言的调用 SDK(即桩代码 Stub)。 HTTP 没有主流的结构化接口描述语言,而且接口风格灵活,很难通过自动化工具直接输出 SDK。 前后端分离、分工的细化,带来了效率的提升。 包括最近流行的一些概念,比如前后端一体化,背后思路都是为了让代码跨端复用,从应用整体减少重复。
明明说好某天上线,最后发现测试没过;文档应该在签署当天提交,结果客户两天都没收到;功能发布后出了问题,却没有交付记录,无法追责。这些现象的背后,是一个普遍缺失的机制:交付事件的标准化跟踪体系。 这些话背后的共性,是交付过程缺乏透明化记录,交付结果缺乏可验证节点。典型困境包括: 1. 没有定义“什么叫交付”是发送了?是客户确认了?是文档归档了?各说各话。 2. 没有回溯能力出错之后只能靠聊天记录、邮件翻找,没有结构化数据支持复盘。 交付事件跟踪工具的目标是: 让这些事项形成结构化、可视化、可追溯的记录系统,并嵌入团队流程中,变为行动闭环。四、关键使用场景:适合哪些人、哪些环节? if due_date < today else " 待完成") print(f"{e['name']} | 截止:{e['due']} | 状态:{status}")✅ JavaScript:动态生成交付看板视图
那么,当我们谈“交付基础设施”,我们究竟在谈什么?怎样的交付基础设施能加速数字化项目的交付? ? ---- 什么是交付基础设施 云时代的研发环境应该以原生支持云计算的方式提供、管理和维护。 走上数字化道路的企业必定有大量的软件项目,尤其是微服务架构风格的引入会使企业拥有数量更多、单体规模更小的软件应用,此时交付基础设施不一致、不规范的情况就会对企业的数字化进程带来更大的阻力。 云计算带来的弹性和灵活性让组织级的交付基础设施标准化、规范化成为可能。 在微服务语境下,这种弹性有两层常见的含义:在生产环境下,服务可以随负载动态获得和释放计算资源,从而更高效地使用计算资源,更自动化地应对负载变化;在研发环境下,开发、测试、运维等不同角色可以随需动态获得完整的环境 这些流程与工作方法虽然不能完全以软件代码的形式承载,但它们同样是交付基础设施的重要组成部分。 ---- 小结 数字化、服务化的IT大背景会让企业开发和拥有的IT系统数量剧增。
这次我就讲一下我之前做的一个案例,就是无服务化的微服务的持续交付。 一 什么是无服务器架构 无服务器架构,这个词2012年就已经出现了,当时是因为移动互联网兴起。 三 打造无服务器化的微服务持续交付流水线 基于这个架构我们是怎么打造无服务化的微服务的持续交付流水线。 ? 我们是前后端分离的,我们前端预发布,然后进行测试,然后前端正式发布。 用某一种方式构建一个可以快速交付的流水线。 第三是监控。在这中间所有初始化、安全相关、网络相关的所有问题,云平台全都会帮你解决的。 只有这三个部分是你自己需要解决的,Ops 的工作就轻松了很多。 第二,状态即版本化配置(Status as versioning configs)。各种状态就是通过版本化的配置,可以放到你的代码管理仓库里面,也可以放在你的基础设施的版本化的管理。 现在的编程模型是由编程语言确定的,每个语言都有自己的特性,我适合扩展的,我是编译的,我是动态的还是静态的,我是脚本的还是非脚本的。
今天我们将重点介绍 CI/CD 的第二阶段,持续交付。它有助于确保代码已准备好交付。它的主要特点是代码构建、测试和交付等过程的自动化,有助于及早避免错误并最大限度地降低风险。 在 CD 将产品投入生产后,也可以自动化和手动执行。 这是对源代码的系统检查,旨在发现和纠正在开发的初级阶段没有注意到的错误; CD 实施的好处 持续交付的自动化过程为团队和项目带来了许多好处。 自动化测试可以立即定义回归,以便团队可以专注于用户研究或更深入的测试等过程。它可能包括探索性、可用性、性能和安全性测试。这些过程可以在整个交付过程中继续进行,从一开始就为产品带来质量。 灵活性。 如果你正在寻求升级和发展自己产品,投资于构建、测试、部署和环境的自动化流程将通过降低发布流程的成本来节省制作和交付软件迭代的资金。 潜在的绊脚石 实施 CD 工具最具挑战性的是需要重建一些工作流程。
目前运营商又提出了对传统装维服务进行产销品化和价值化的转型。那么,装维服务为何要实现产销品化? 传统的装维服务为何要实现产销品化? ? 这不仅对于上门装维工程师提出了专业化要求,也要求运营商重新按照解决方案的交付模式来架构、设计、构建、销售、交付、运营、维护,以重新实现相应的装维产品 / 服务提供。 装维服务如何实现产销品化? ? 装维服务如何实现产销品交付? ? 已购服务的交付模式也因客户购买场景的不同而不同(交付模式如图1所示)。对场景一来说,运营商平台应根据客户指定的服务地址,调配指派对应的装维工程师跟进。 当出现一次上门服务无法交付成功的情况时(如装维工程师到现场时,客户因故不在,或非客户方原因导致已购服务无法交付成功等),装维工程师应指导客户进行二次服务预约操作。 当客户购买的所有服务成功交付,并由客户现场确认服务竣工,服务的交付流程才算结束(交付流程如图 2 所示)。
我记得【持续交付:发布可靠软件的系统方法】中讲到反模式,都是破坏Dev/Test/Prod环境之间的一致性(Parity)。因此基于一个标准化的自动化持续交付过程是实现环境一致性的必要条件。 其实从一个应用的代码包交付过程来说,无非就是其环境的交付、外部依赖的交付(运行时环境、公共库、容器等等)以及应用程序包的交付。形如: ? 这样的分解非常重要,实现应用交付过程的解耦,让上次的自动化过程任意的组合,实现弹性应用交付。 对于每一个层次,我们又详细的定义了其标准化的执行细则,就拿业务层的标准化来说,如下图: ? 接下来在系统层面上要实现应用的整个应用的标准化交付管理,核心就是基于这些资源的标准化管理。 ? 在这个应用为中心的界面中,实现了其资源的管理、关联工具和流程的管理(动作管理)。 基于标准化实现端到端的持续交付链之后,达到的收益非常明显。
对于这些反模式,《持续交付》提出的解决办法是“将几乎所有事情自动化”。 但在当时的技术水平下,由于软件发布的形态和流程不标准、开发/测试环境和生产环境不统一、环境管理情况复杂,“将发布流程自动化”在每个团队的具体做法都不同,因此持续交付的水平高度依赖于团队的能力与觉悟。 《持续交付》也只能苦口婆心地劝说“如果需要执行这个流程数十次的话,就不是那么容易的事了”,而且“不需要把所有的东西一次性地全部自动化……随着时间的推移,最终你可以、也应该将所有环节全部自动化”。 但如果在软件的开发过程中充分利用云计算的弹性能力,这些反模式有可能被根除,而不必由每个开发团队重复地尝试通过自动化来缓解。 ---- 部署流水线 《持续交付》提出了“部署流水线”的概念(如下图)。 例如当“发现在运行持续集成工具的机器上缺少一些必需的软件和设置”时,《持续交付》提出的建议是“将接下来你所做的工作全部记录下来,并放在自己项目的知识共享库中……并将重建全新环境的整个活动变成一个自动化的过程
Buildkite Pty Ltd 扩展了其同名注重并发性的 持续集成和交付软件,使其成为一个完整的平台,增加了测试引擎、包注册服务和移动交付云。 因此,该软件在许多规模化公司中得到应用,包括 Airbnb、Canva、Lyft、PagerDuty、Pinterest、PlanetScale、Shopify、Slack、Tinder、Twilio、 “采用交付优先的思维方式对于我们发展至关重要,”他断言。 为了说明为什么加速持续集成对于规模化公司如此重要,Kitt 提供了一个例子:像 Uber 这样的公司可能拥有 5000 名开发人员。在工作日开始时,大多数开发人员或多或少会同时开始进行代码提交。 Kitt 表示,对于不想管理移动应用程序交付复杂物流的组织来说,这是理想的选择。
spinnaker概述和选型 概述 主要功能 Spinnaker是一个开源的多云持续交付平台,提供快速、可靠、稳定的软件变更服务。 部署管理 管理部署流程是Spinnaker的核心功能,使用minio作为持久化层,同时对接jenkins流水线创建的镜像,部署到Kubernetes集群中去,让服务真正运行起来。 Front50用于管理数据持久化,用于保存应用程序,管道,项目和通知的元数据。 Kayenta为Spinnaker提供自动化的金丝雀分析。 Fiat 是Spinnaker的认证服务。 Echo是信息通信服务。 众多公司开发了开发第三方发行版来简化Spinnaker的部署工作,例如我们要用的Armory发行版 Armory也有自己的脚手架工具,虽然相对halyard更简化了,但仍然部分被墙 因此我们部署的方式是手动交付
在敏捷的环境中,我们关注的是交付价值,需要澄清原始需求背后客户的真实痛点是什么。 最终交付了此功能,并与客户简单讲解了整个使用配置过程,得到了客户的认可。 另一个例子 在信通院的自动化测试平台三级认证中,原来有这么一条:自动化平台需要有录制回放功能。这条要求的价值主张在于通过一些自动化的方式能够直接生成用例,让平台的可用性更高。 但是实际的自动化平台中,我们很多时候并不需要录制回放功能(很鸡肋,懂的都懂),完全可以通过其它的方式来实现(如接口平台可以通过接口分析自动生成基础用例,UI自动化可以通过自动解析页面HTML结构树来自动生成元素 提升整个团队的交付价值,不仅仅是产品需要思考的问题。
2018 年 04 月 22 日,才云科技创始人兼CEO张鑫在“全球首发| Kubeflow Meetup 4.22 杭州场,开拓 AI 新视野”进行《从 Google TFX 到 Kubeflow:容器化交付敏捷 数据分析帮助用户快速洞察数据集的关键特征,并建立对数据集的整体印象,带来了丰富的数据可视化。 数据验证 数据验证主要指针对数据的完整性和有效性进行验证。 面对怎么多的模块我们所希望的是用一种非常模块化的系统将整个流水线给串起来,这样的话如果要对流水线中的某个模块进行修改的时候就不会影响到其他的部分。 Kubrflow希望用容器的方式交付一个敏捷开发的机器学习平台。 上图是GitHub上kubeflow项目的现状,它下面有很多的代码仓库,可以说这个项目本身也是模块化的。
以下主要分享大型团队持续集成服务器的集中化管理中所遇到的挑战和积累的经验。 如何集中化管理CI Agent? 我们知道CI/CD是持续交付中很重要的部分,而CI/CD又依赖于持续集成服务器(还有另外一个说法是自动化服务器)。 其中一个好处是通过强CI Agent基础设施代码化,再加上不同的配置参数,可以定制化、快速并且正确的在不同AWS环境中自动化创建CI Agent。 如何集中化创建CI Agent? 当我们已经可以集中化创建CI Agent,通常情况下会出现另外一个需求,即需要更新CI Agent。但是我又不想一个一个去修改,那么如何集中化并且自动化升级CI Agent? 如何集中化并且自动化升级CI Agent? 通过对CI Agent的基础设施代码库添加CI/CD pipeline来实现CI Agent自动化更新。
聊这个事情要从一个很古老的项目开始(我们直接略过不谈 Hybrid 架构的应用,就谈 Native 动态化)。 # 「始作俑者」Wax 最早要从 Wax 这个项目开始说,大家都知道 Objective-C 有着非常强大的动态特性。 这个项目的做法是通过加载 Lua 脚本,动态的生成 Objective-C 的方法,通常用来替换掉出了问题的那个,Lua 脚本是可以动态下发的,所以也就实现了修复线上 bug 的使命。 # 动态化的动机在哪里 各种技术的诞生都伴随着各种各样的原因,我们在聊动态化的时候,往往伴随着以下这么几个动机: 动态修复线上 bug 逃避审核,调用私有方法 跨平台开发 开发周期太短,运营需求变化太大 由于 Objective-C 夸张的动态性,其实我们很早就知道,Apple 从技术层面比较难完全防止掉这样事情的发生。
但是,这样并不能满足我们线上化判断,或者频繁更改规则的诉求。于是我们在实践中需要对drools更高阶的使用方式。 四、 drools动态化实践 从以上简单demo中我们可以看出,规则依赖drl文件存在。而业务实际使用中,需要动态对规则进行修改,无法直接使用drl文件。 在此背景下,我们尝试drools高阶应用,既规则动态化实践。 我们在创建缓冲池的页面中加入了流向规则的创建环节。每个缓冲池维护自己的流向规则,即为自己的一根连线。 五、 总结 从上边的流程中我们体验了动态规则的创建以及使用。动态规则满足了我们规则动态变化,规则统一管理的诉求。 我也总结了在这种使用方式下drools的几个优缺点。 优点: 规则动态化方便 在工作内存中匹配规则性能好 几乎可以满足所有的规则需求 内置方法丰富完善 缺点: 分布式一致性需要自行处理 需要研发了解drl语法 学习曲线陡峭 匹配过程监控手段需要自行实现
* * 反射是为了动态代理做准备的 * @author Administrator * */ public class reflexdDome_01 { public static void c.getDeclaredFields(); for (Field field : f) { System.out.println(field.getName()); } } } 动态实例化 com.gaoji.reflex; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; //动态实例化 :是一种不通过new的方式来实例化对象 public class reflexdDome_02 { public static void main(String[] args) throws getDeclaredConstructor(int.class, String.class); System.out.println(c3); // 动态实例化