你以为搞个流水线每天跑,团队就在使用CI/CD实践了?

以为,流水线,每天,团队,使用,ci,cd,实践 · 浏览次数 : 734

小编点评

**流水线设计原则** **1. 确定变量变化的范围** *构建参数 *代码地址 *分支名称 *安装版本 *部署机器IP **2. 规范命名变量和命题** *可复制性控制 *避免重复写hardcode **3. 标准化构建步骤** * docker build/push * helm build/deploy * Maven构建 **4. 标准化流水线分步骤** * 快速失败 * 分层设计 **5. 快速失败** * 在流水线的最前面放置,仅执行不稳定的步骤 * 避免把稳定的步骤放在前面 **6. 集成验收流水线** * 每个团队根据代码仓库创建测试流水线 * 自动化测试,确保基本功能的用例 **7. 部署测试流水线** * 每个团队的测试工程师创建测试流水线 * 部署到团队共同拥有的环境中 **8. 多组件集成流水线** * 集成部署流水线的集成打包阶段自动获取组件最近成功的软件包 * 对组件进行产品集成打包 **9. 单功能流水线** * 适用于代码变更无关的场景 * 使用条件控制跳过步骤 **10. 全功能流水线** * 需求、代码构建、测试、部署环境内嵌自动化能力 * 触发完整流水线,中间通过人工审批层次卡点

正文

在实践中,很多团队对于DevOps 流水线没有很透彻的理解,要不就创建一大堆流水线,要不就一个流水线通吃。实际上,流水线的设计和写代码一样,需要基于“业务场景”进行一定的设计编排,特别是很多通过“开源工具”搭建的流水线,更需要如此(商业的一体化平台大部分已经把设计思想融入自己产品里了)。

  • 流水线的设计与分支策略有关
  • 流水线的设计与研发活动有关

清晰的代码结构,标准的环境配置,原子化的流水线任务编排,再加上团队的协作纪律,和持续优化的动作,才是真正的践行CI/CD实践

流水线设计原则

1. 确定好变量

  • 哪些是构建/部署需要变化的,比如构建参数,代码地址,分支名称,安装版本,部署机器IP等,控制变化的,保证任务的可复制性,不要写很多hardcode进去

2. 流水线变量/命名的规范化

  • 标准化的命名,有助于快速复制;有意义的流水线命名,有助于团队新成员快速了解

3. 一次构建,多次部署

  • 一次构建,多次部署(多套环境配置+多套构建版本标签);杜绝相同代码重复打包
  • 相似技术栈/产品形态具备共性,通过以上原则可以抽取复用脚本,良好的设计有助于后续的可维护性!

4. 步骤标准化/原子化

  • 比如docker build/push, helm build/deploy, Maven构建等动作标准化,避免重复性写各种脚本逻辑
  • 根据业务场景组装,例如. 提测场景,每日构建场景,回归测试场景

image.png
5. 快速失败

  • 尽可能把不稳定的,耗时短的步骤 放在流水线的最前面,如果把一个稳定的步骤放在前面,并且耗时几十分钟,后面的某个步骤挂了,反馈周期就会变长

从零开始设计流水线

流水线分步骤实施, 从 “点” 到 “线” 结合业务需要串起来,适合自己团队协作开发节奏的流水线才是最好的。

  1. 价值流进行建模并创建简单的可工作流程
  2. 将 构建 和 部署 流程自动化
  3. 将 单元测试和 代码分析 自动化
  4. 将 验收测试 自动化
  5. 将 发布 自动化

image.png

流水线的分层

由于产品本身的形态不同,负责研发的团队人员组成不同,代码的版本管理分支策略不同,使用的部署流水线形式也会各不相同,所以基于实际业务场景设计流水线是团队工程实践成熟的重要标志

1. 提交构建流水线(个人级)

适用场景:每名研发工程师都创建了自己专属的流水线(一般对应个人的开发分支),用于个人在未推送代码到团队仓库之前的快速质量反馈。
注意:个人流水线并不会部署到 团队共同拥有的环境中,而是仅覆盖个人开发环节。如图所示,虚线步骤非必选

image.png

2. 集成验收流水线(团队级)

适用场景:每个团队都根据代码仓库(master/release/trunk)分支,创建产品专属的流水线,部署到 团队共同拥有的环境中e.g. dev)。
注意:如图所示,虚线步骤非必选,根据情况可通过 启动参数true/flase 跳过执行,自动化测试仅限于保证基本功能的用例。

image.png

3. 部署测试流水线(团队级)

适用场景:每个团队的测试工程师都需要专门针对提测版本的自动化部署/测试流水线,部署到团队共同拥有的环境中(e.g. test).
注意:如图所示,该条流水线的起点不是代码,而是提测的特定版本安装包;虚线步骤非必选,根据情况可通过 启动参数true/flase 跳过执行 或 裁剪。

image.png

4. 多组件集成流水线

适用场景:如果一个产品由多个组件构建而成,每个组件均有独自的代码仓库,并且每个组件由一个单独的团队负责开发与维护,那么,整个产品 的部署流水线的设计通常如下图所示。 集成部署流水线的集成打包阶段将自动从企业软件包库中获取每个组件最近成功的软件包,对其进行产品集成打包
image.png

5. 单功能流水线

适用场景:适用于和代码变更无关的场景,不存在上面步骤复杂的编排 (也可通过上述流水线的 启动参数进行条件控制,跳过一些步骤)

  • 针对某个环境的漏洞扫描
  • 针对某个已部署环境的自动化测试
  • 定时清理任务
  • ...

6. 全功能(持续交付)流水线

适用场景:需求、代码构建、测试、部署环境内嵌自动化能力,每次提交都触发完整流水线,中间通过人工审批层次卡点,从dev环境,test环境,stage环境一直到 prod环境。 常适用于快速发布的 PASS/SASS服务,对团队各项能力和流程制度要求较高,支持快速发布(策略)和快速回滚(策略)
image.png

流水线运转全景图

团队研发工程师每人每天都会提交一次。因此,流水线每天都会启动多次。当然并不是每次提交的变更都会走到最后的“上传发布” 。 也不是每次提交都会走到UAT 部署,因为开发人员并不是完成一个功能需求后才提交代码,而是只要做完一个开发任务,就可以提交。每个功能可能由 多个开发任务组成,研发工程师需要确保即使提交了功能尚未开发完成的代码,也不会影响已开发完成的那些功能。
制品经过一个个质量卡点,经历各种门禁验证,最终交付给客户 可以工作的软件
pipeline-status.jpg


与你以为搞个流水线每天跑,团队就在使用CI/CD实践了?相似的内容:

你以为搞个流水线每天跑,团队就在使用CI/CD实践了?

在实践中,很多团队对于DevOps 流水线没有很透彻的理解,要不就创建一大堆流水线,要不就一个流水线通吃。实际上,流水线的设计和写代码一样,需要基于“业务场景”进行一定的设计编排,特别是很多通过“开源工具”搭建的流水线,更需要如此(商业的一体化平台大部分已经把设计思想融入自己产品里了)。 - **流

查漏补缺,这些热门开源项目你都知道么?「GitHub 热点速览」

本期热点速览的周榜部分的项目,基本上每周都会在 GitHub Trending 见到它们的身影,因为它们实在太火了。一般来说,这些火爆的项目大家都耳熟能详,但是为了防止有些小伙伴不怎么逛 GitHub,以及并没有翻阅之前的月刊或者是热点速览。借着这个大家不怎么搞新项目的假期,索性收集下常见的 5 个...

NET6使用AutoFac依赖注入(仓储模式)

第一次使用autofac,然后net6最新长期支持的,就想着在net6的基础上使用autofac,我对依赖注入理解很差,一知半解的搞了好久。好在有了一点点的头绪,记录下省的以后忘记(突然发现自己以前用过的东西忘了好多……) 1.首先你要有个仓储模式的项目、这个自己搭建吧 2.在Program.cs文

当 xxl-job 遇上 docker → 它晕了,我也乱了!

开心一刻 公交车上,一位老大爷睡着了,身体依靠在背后的一位年轻小伙子身上 小伙子一直保持站姿十几分钟,直到老人下车 这位在校大学生,接受采访时说:”当时就觉得背后这个人很轻盈,以为是个姑娘!“ 前提准备 对 xxl-job、docker 要有基本的了解 xxl-job 直接看官网:xxl-ob,你想

如何找到并快速上手一个开源项目

以前有写过两篇文章来简单聊过如何做开源的事情,最近我自己组了一个社区里面也有不少朋友对开源感兴趣,于是我便根据自己的经验系统的梳理了一些关于开源的事情。 新手如何快速参与开源项目 手把手教你为开源项目贡献代码 有兴趣的可以先看看之前这两篇。 如何找到自己感兴趣的开源项目 首先第一步先想清楚自己搞

【原理揭秘】Vite 是怎么兼容老旧浏览器的?你以为仅仅依靠 Babel?

本文的重点在于探究 Vite 如何实现兼容低版本浏览器

浅谈Python中的包

浅谈Python中的包 Package的定义(你以为的) 你在很多的地方都能看到关于package的定义:在Python中在当前目录下有__init__.py文件的目录即为一个package。 嗯,包括python目前的官网文档也是类似这么介绍的 https://docs.python.org/zh

欠你们的 → k8s 集群搭建,除夕奉上!

开心一刻 有一天,qq收到一个好友申请,验证消息上写的是:哥哥加我,我是妹妹 我以为是性骚扰,就没加,直接回了一句:我喜欢少妇 过了一会儿,姑姑就给我打了个电话:你妹妹qq加你,你怎么不同意,她想问你几道数学题,你说你喜欢少妇 我:姑姑,你听我狡辩一下...... 祝大家除夕快乐! 节点准备 基于 

记一次字符串末尾空白丢失的排查 → MySQL 是会玩的!

开心一刻 今天答应准时回家和老婆一起吃晚饭,但临时有事加了会班,回家晚了点 回到家,本以为老婆会很生气,但老婆却立即从厨房端出了热着的饭菜 老婆:还没吃饭吧,去洗下,来吃饭吧 我洗好,坐下吃饭,内心感动十分;老婆坐旁边深情的看着我 老婆:你知道谁最爱你吗 我毫不犹豫道:你 老婆:谁最关心你? 我:你

[转帖]apr_socket_recv: Connection reset by peer 错误

用ab做性能测试. 并发请求量稍微高一点(200,300以上)就会报apr_socket_recv: Connection reset by peer 的错. 刚开始以为apache服务器设置有问题. 网上一顿找, 结果你也懂的. 按照咱国家特殊国情惯例, 都是同一篇文章考来考去. 最后还是找到一个