- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
本文分享自华为云社区《你了解部署流水线吗?》,作者: 敏捷小智。
部署流水线,又称持续集成流水线、构建流水线,是指软件从制品库到用户的自动化交付过程。通常包括代码提交、构建、部署、测试、发布环节。部署流水线实现DevOps模式下持续开发、持续测试、持续集成、持续部署和持续监控这些活动的编排并自动化执行,及时获得结果反馈,实现商业敏捷化。
构建一条部署流水线,首先要根据软件架构和业务特点,确定流水线的各个环节内容,如下就是某产品开发的流程设计。从大框架上需要包含构建、部署、测试和发布这几个环节。其中构建包含代码提交、本地构建、云端构建、静态检查、单元测试;部署包括测试环境的部署,α、β、γ环境部署。各环境中的测试实施,其中“Dog food(吃狗粮)”是互联网公司的一种文化,指的是自研自用,即部署到内网环境,供大家使用;发布包括依据发布策略,实施发布。如下图所示。
流程确定后,然后要实现集成、交付、部署和发布各环节的自动化,自动化不等于不需要人的参与,而是将复杂易错、重复的步骤变成可靠的自动化步骤。
最后将各个环节统一编排成流水线,设置质量门禁,实现提交代码即触发自动部署的功能。
实现构建流水线,团队需要有良好的基础服务支撑,包括配置管理,可实现自动化配置的脚本等。业界领先的互联网公司很多都采用基础支撑服务云化,服务端程序部署频率都非常快。根据《凤凰项目》一书中的记载,业界Top互联网公司的网站部署频率如下:
| <br>公司<br> | <br>部署频率<br> | <br>部署效率<br> |
| <br>亚马逊<br> | <br>23000次/天<br> | <br>分钟级<br> |
| <br>谷歌<br> | <br>5500次/天<br> | <br>分钟级<br> |
| <br>Netflix<br> | <br>500次/天<br> | <br>分钟级<br> |
| <br>Facebook<br> | <br>2次/天<br> | <br>分钟级<br> |
| <br>Twitter<br> | <br>3次/周<br> | <br>分钟级<br> |
此外,团队成员要遵守共同的规则,比如代码变更即上流水线,有错误发生及时暂停,待问题解决后再继续等,需要团队成员共同制动并遵守。
流水线编排客户实现CI、CD无缝结合,快速迭代,让价值流快速流动,适应市场需求频繁变化。端到端的流水线,让各个流程透明可视化,团队人员可以随时获取需要的信息,哪个版本出现了问题回退,当前版本所处的阶段等。同时可视化也能发现流程中的瓶颈环节,进行优化和调整,使流水线不断的演进,提升交付效率。
流水线的每个环节都会有反馈,实现完整快速的反馈循环,团队获得反馈,有利于及时改进,保证质量;并且每个环节都可设置质量门禁,实现质量的层层保障。
加强团队建设,改善组织文化
流水线的各个环节让开发、测试、运维人员都参与进来,共同协作,打破部门之间的隔阂,改善公司组织文化、提高员工的参与感。
华为云DevCloud提供了一站式端到端部署流水线:用户提交代码后,自动触发流水线执行编译构建、代码检查等任务;配置构建、代码检查、部署、测试等多种自动化任务,完成一键式出包发布上线生产全流程;每天定时执行,保障工程质量。
以快速上手流水线为例,在这个流水线中,包含代码检查、构建和质量门禁设置三个环节,其中的代码检查和构建是已经创建好的任务,质量门禁可以在创建流水线的同时创建。下面演示是如何创建和执行流水线。
1. 进入已创建的项目,在顶部导航栏单击“构建&发布 > 流水线”,进入流水线。
2. 单击右上角“新建流水线”,进入“创建流水线”页面。根据界面提示填写基本信息、选择模板、选择代码源,然后单击“下一步”。
3.进入工作流配置页面,在构建阶段,选择类型为“代码检查”,然后添加已创建的代码检查任务。
接着按照相同方法,添加已创建的构建任务。
4.单击质量门禁下+添加质量门禁,选择“门禁任务”类型,然后单击“点击创建”。
5.填写门禁名称(如:test01),并将代码检查任务对应的门禁项“CodeCheck问题数”开关打开,保存并选择已创建的门禁。
6.任务配置完成后单击“保存”,进入流水线详情页面,单击“全新执行”,一键执行流水线。
7.执行完成后,查看执行结果。单击构建任务旁的
,可以下载通过流水线自动构建出来的构建包。
8.配置Codehub源码仓库触发器,可以实现提交代码后自动触发流水线执行。进入“创建流水线 > 选择代码源”页面或者“流水线配置 > 添加代码源”页面,分别配置Codehub触发器和码云触发器。
展开“更多设置”,在触发分支中选择关联仓库的指定分支,如:“master”。保存流水线后触发器即刻生效,当指定仓库分支中有代码提交时,会自动触发关联流水线执行。
通常一个项目的流水线不仅仅是上面的几项,根据业务特点和软件架构的不同,工作流的编排而互不相同,但基本上都包括构建、部署、测试、发布环节,每个环节的任务设置会不尽相同。如下图为某团队的部署流水线样例。
根据《中国 DevOps 现状调查报告(2021)》,大概有六成受访者所在的企业部署频率为1周到1个月1次,同比2020年增长了近一成。仅有16.21%的企业能够每天多次在生产环境进行部署;此外,9.33%的企业部署频率超过 1 个月。
数据来源:中国信息通信院
由以上调查数据可见,2021年国内企业的部署频率已经比2020年有所提升。在当前的VUCA时代,为了应对不确定性,我们要提升自己的业务敏捷程度,小步快跑,及时获得反馈。因此通过自动化和流水线技术提高部署的频次和效率是必不可少的。引入云平台,简化部署和编排操作,让团队将更多的精力专注到业务的研发上更是大势所趋。
我开始在 Ethereum blockchain 上了解如何开发智能合约以及如何写 web-script用于与智能合约交互(购买、销售、统计......)我得出了该怎么做的结论。我想知道我是否正确理解
我正在 UIView 中使用 CATransform3DMakeRotation,并且我正在尝试进行 45º,变换就像向后放置一样: 这是我拥有的“代码”,但显然没有这样做。 CATransform3
我目前正在测试 WebRTC 的功能,但我有一些脑逻辑问题。 WebRTC 究竟是什么? 我只读了“STUN”、“P2P”和其他...但是在技术方面什么是正确的 WebRTC(见下一个) 我需要什么
我在看 DelayedInit在 Scala in Depth ... 注释是我对代码的理解。 下面的 trait 接受一个非严格计算的参数(由于 => ),并返回 Unit .它的行为类似于构造函数
谁能给我指出一个用图片和简单的代码片段解释 WCF 的资源。我厌倦了谷歌搜索并在所有搜索结果中找到相同的“ABC”文章。 最佳答案 WCF 是一项非常复杂的技术,在我看来,它的文档记录非常少。启动和运
我期待以下 GetArgs.hs打印出传递给它的参数。 import System.Environment main = do args main 3 4 3 :39:1: Coul
private int vbo; private int ibo; vbo = glGenBuffers(); ibo = glGenBuffers(); glBindBuffer(GL_ARRAY_
我正在尝试一个 for 循环。我添加了一个 if 语句以在循环达到 30 时停止循环。 我见过i <= 10将运行 11 次,因为循环在达到 10 次时仍会运行。 如果有设置 i 的 if 语句,为什
我正在尝试了解 WSGI 的功能并需要一些帮助。 到目前为止,我知道它是一种服务器和应用程序之间的中间件,用于将不同的应用程序框架(位于服务器端)与应用程序连接,前提是相关框架具有 WSGI 适配器。
我是 Javascript 的新手,我正在尝试绕过 while 循环。我了解它们的目的,我想我了解它们的工作原理,但我在使用它们时遇到了麻烦。 我希望 while 值自身重复,直到两个随机数相互匹配。
我刚刚偶然发现Fabric并且文档并没有真正说明它是如何工作的。 我有根据的猜测是您需要在客户端和服务器端都安装它。 Python 代码存储在客户端,并在命令运行时通过 Fabric 的有线协议(pr
我想了解 ConditionalWeakTable .和有什么区别 class ClassA { static readonly ConditionalWeakTable OtherClass
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我还没有成功找到任何可以引导我理解 UIPickerView 和 UIPickerView 模型的好例子。有什么建议吗? 最佳答案 为什么不使用默认的 Apple 文档示例?这是来自苹果文档的名为 U
我在看foldM为了获得关于如何使用它的直觉。 foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a 在这个简单的例子中,我只返回 [Just
答案What are _mm_prefetch() locality hints?详细说明提示的含义。 我的问题是:我想要哪一个? 我正在处理一个被重复调用数十亿次的函数,其中包含一些 int 参数。
我一直在读这个article了解 gcroot 模板。我明白 gcroot provides handles into the garbage collected heap 然后 the handle
提供了一个用例: 流处理架构;事件进入 Kafka,然后由带有 MongoDB 接收器的作业进行处理。 数据库名称:myWebsite集合:用户 并且作业接收 users 集合中的 user 记录。
你好 我想更详细地了解 NFS 文件系统。我偶然发现了《NFS 图解》这本书,不幸的是它只能作为谷歌图书提供,所以有些页面丢失了。有人可能有另一个很好的资源,这将是在较低级别上了解 NFS 的良好开始
我无法理解这个问题,哪个更随机? rand() 或: rand() * rand() 我发现这是一个真正的脑筋急转弯,你能帮我吗? 编辑: 凭直觉,我知道数学答案是它们同样随机,但我忍不住认为,如果您
我是一名优秀的程序员,十分优秀!