需求并行开发场景,如何高效发布

云布道师

微服务架构下,每个应用服务独立开发、独立发布,小步快跑,持续快速交付业务需求。多人协同开发同一个应用时,分支开发模式是一个适合的协同方案。该模式下一个需求或任务通常对应一个 feature 分支,多个需求一起合并到 release 分支进行集成测试验证并发布。

适用场景

微服务架构下,每个应用服务独立开发、独立发布,小步快跑,持续快速交付业务需求。多人协同开发同一个应用时,分支开发模式是一个适合的协同方案。该模式下一个需求或任务通常对应一个 feature 分支,多个需求一起合并到 release 分支进行集成测试验证并发布。

该场景下,你是否有这样的苦恼?

  • 一个需求没有经过集成测试验证,却被发布上线了,最终因为“漏测”导致生产故障!
  • 一个需求经过了集成测试验证,但是临发布前发现有严重问题,但需求无法灵活“下车”,最终导致本次发布的所有需求都被延期了!

云效解决方案

在这里插入图片描述
云效应用交付平台 AppStack 提供变更持续交付解决方案,涉及核心概念如下:

  • 应用:一个软件的最小发布单元,聚合代码、环境、版本等软件资产,以及研发流程定义。最小发布单元意味着无法解耦的一个或者多个服务的组合,这个服务组合会通过一个流程进行统一交付。
  • 变更:变更是对应用的一次特性改变(引入新的特性或改变已有特性),源于需求,终于交付。通常一个需求或任务对应一个变更,对应一个
    feature 分支。
  • 研发流程:应用完成一次变更的过程和约束,包括开发、测试、发布上线的完整流程,由多个阶段的多条流水线承载,依次在不同环境进行测试、构建、部署,最终审批通过后发布生产环境。
    在这里插入图片描述
    云效通过应用定义、变更承载需求、研发流程约束发布规范,来解决以下两个问题:
  • 问题1:当其中一个 feature 分支没有经过测试验证时,怎么“阻止”它发布到生产环境避免漏测引起故障?
  • 问题2:当其中一个 feature 分支做了测试验证,但是发现有严重问题,怎样可以“退出”本次发布而不影响其他需求正常发布?

云效操作实践

以下实践,以一个 spring-boot 应用的“图书馆管理系统”为例,开发“图书借阅功能”、“图书归还功能”、“图书到期续借功能”三个需求,一起发布上线。

3.1 前提条件
已有一个应用 spring-boot,配置好应用代码、研发流程(CI/CD流水线)、环境等。通常一个应用的研发流程可以分为测试阶段、预发阶段、生产阶段:

  • 测试阶段:由 Java 单元测试、Java 代码扫描、构建、部署测试环境等步骤组成。用于日常测试验证。

  • 预发阶段:由构建、部署预发环境等步骤组成。用于预发布验证。

  • 生产阶段:由构建、生产发布审批(人工卡点)、部署生产环境、合并主干、关闭变更等步骤组成。

  1. 配置准入规则为:「测试阶段-执行结果」等于「成功」,「预发阶段-执行结果」等于「成功」,避免没有经过预发验证的分支直接进入生产阶段。

  2. 生产发布审批通过后,部署生产环境。

  3. 生产环境部署验证通过后,表明本次发布成功,可以将发布release 分支合并回主干 master,并自动关闭相关变更。
    在这里插入图片描述

3.2 需求开发测试
“需求 1:图书借阅功能”、“需求 2:图书归还功能”、“需求 3:图书到期续借功能”三个需求分别分配给开发小张、小明、小强开发。

第 1 步,为一个需求新建一个变更拉一个 feature 分支

小张创建一个变更「变更 1-实现图书借阅功能」,选择新建分支输入 feature001,则可自动为该需求拉取一个分支。依次类推,小明创建一个变更「变更 2-实现图书归还功能」,自动新建分支 feature002。小强创建一个变更「变更 3-实现到期续借功能」,自动新建分支 feature003。
在这里插入图片描述
第 2 步,开发代码提交到 feature 分支

小张开发好图书借阅相关代码后,提交代码到 feature001 上,小明开发图书归还相关代码后,提交代码到 feature002 分支上。

第 3 步,选择变更集成,部署测试环境验证

小张和小明,一借一还,需要一起部署到测试环境进行联调验证。进入应用研发流程页,选择变更 1 和变更 2 一起集成测试,云效会自动将 feature001 和 feature002 合并到自动生成的 release/xxx_n 分支,使用该 release 分支做构建,并部署环境。环境部署成功即可进行测试验证。
在这里插入图片描述
在这里插入图片描述
第 4 步,提交变更进行预发布

测试环境验证通过,进入「预发阶段」,选择变更 1 和变更 2 进行集成,勾选自动合并上一阶段集成的分支,会自动生成新的 release/xxx_m 集成分支,自动合并上一阶段 feature001、feature002、release/xxx_n 分支,使用新的 release/xxx_m 分支构建并部署预发环境。预发部署成功后即可进行预发验证。
在这里插入图片描述
在这里插入图片描述
3.3 需求发布上线
提交变更,需求自动化发布到生产环境

预发验证通过后,即可进入生成发布阶段。选择待发布的变更 1 和变更 2,运行生产流水线,发布审批通过后,即可部署生产环境。生产环境部署完成,可配置自动关闭变更,并将发布 release/xxx_k 分支合并入主干 master,至此即完成了一次完整的需求发布上线。

未经过预发验证的需求禁止发布,避免“漏测”

此时若在生产阶段选择变更 1、变更 2、变更 3一起发布,则经过变更准入卡点时会校验失败,因为变更 3 没有在测试环境部署验证过,即保证了没有经过测试验证的需求不可发布。
在这里插入图片描述
需求临时“下车”,退出发布窗口,不影响其他需求发布

临发布前,变更 3 因没有测试验证通过,不满足发布条件,团队本次决定图书续借功能不上线,只上线变更 1 和变更 2,则可再次运行预发阶段流水线,将变更 3 踢出集成区,退出本次发布。
在这里插入图片描述

总结语

至此,本方案完成了从应用配置、到需求开发、多变更(需求)集成测试、发布上线的完整流程,满足了变更分支自动创建、变更分支自动合并集成测试、发布准入卡点控制等诉求,避免因为“漏测”带来的生产故障,也避免因为其中一个需求未达到发布条件延期所有需求。

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

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

相关文章

WSL2安装+深度学习环境配置

WSL2安装深度学习环境配置 1 安装WSL22 配置深度学习环境1.1 设置用户名、密码1.2 安装cuda修改WSL安装路径 1.3 安装Anaconda 参考:搭建Windows Linux子系统(WSL2)CUDA环境 参考:深度学习环境配置 WindowsWSL2 1 安装WSL2 WSL …

《计算机程序的构造和解释》:计算思维的圣经,引领你走向编程的巅峰

写在前面 《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs,简记为SICP)是MIT的基础课教材,出版后引起计算机教育界的广泛关注,对推动全世界大学计算机科学技术教育的发展和成熟产生了…

【QT】自定义控件的示例

自定义控件(很重要) 什么是自定义控件? 顾名思义就是创建一个窗口,放入多个控件,拼接起来,一起使用。 为什么需要它? 需求,假设有100个窗口,那如果有两个控件同时被使…

JavaWeb - 1 - 概述

一.什么是Web? Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站 二.Web网站的工作流程 三.Web网站的开发模式 3.1 前后端分离开发(主流) 3.2 混合开发…

PaddleSeg分割框架解读[01] readme解读

简介 PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置45+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥…

MooC下载pdf转为ppt后去除水印方法

1、从MooC下载的课件(一般为pdf文件)可能带有水印,如下图所示: 2、将pdf版课件转为ppt后,同样带有水印,如下图所示: 3、传统从pdf中去除水印方法不通用,未找到有效去除课件pdf方法…

2024年Android开发陷入饱和,安卓面试题2024中高级

点击领取完整开源项目《安卓学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》 前言 这是一篇软文、但是绝对不是鸡汤;为啥不是呢?因为我文笔太差…偶尔矫情发发牢骚(勿喷) 说说程序猿行业 现在社会上给IT行业…

香港媒体发稿:【超值1元港媒发稿套餐】推广技巧-华媒舍

在当今竞争激烈的市场中,品牌的推广是企业取得成功的关键。众多的宣传渠道中,香港媒体发稿无疑是一种高效的品牌推广方式。本文将为您介绍《超值1元港媒发稿套餐》的各个组成部分,以及它如何帮助您实现品牌的腾飞。 1. 1元套餐的优势 1元港媒…

从《繁花》看图数据库的关联力!

2024年开年,最热的电视剧非《繁花》莫属。 这部现象级剧集不仅在全国掀起了一股怀旧潮,还引发了对故事情节和人物关系的深入探讨。 随着《繁花》的热播,不少观众为了更好地理解复杂的故事情节,开始自制人物关系图。 这些关系图以…

小白跟做江科大51单片机之AT24C02数据存储

1.导入Delay、key、LCD1602相关文件 2.控制逻辑 以I2C去写入&#xff0c;用AT24C02包装好&#xff0c;main调用即可 3.编写I2C代码 看着这六个状态编 图1 开和关 图2 发送一个字节 图3 接收一个字节 图4 接收和发送应答 #include <REGX52.H> sbit I2C_SCL P2^1; sbi…

java: No enum constant javax.lang.model.element.Modifier.SEALED报错

这里我的idea版本为2021.03&#xff0c;JDK版本为21.0.2。经过大量冲浪后大多数都是让修改JDK版本&#xff0c;原因是Modifier.SEALED是JDK15新增的&#xff0c;但是当我修改完JDK版本后并无卵用。 尝试在代码中声明&#xff0c;也没问题可以引用到&#xff0c;这就怪了&#…

CleanMyMac X2024非常值得推荐的Mac清理工具

经过全面的评估和分析&#xff0c;CleanMyMac X在Mac清理和优化软件市场中表现出色。它具备全面的功能特点&#xff0c;如智能扫描、恶意软件检测和清除、应用程序管理等&#xff0c;为用户提供了全面的Mac维护服务。同时&#xff0c;该软件的用户体验也非常优秀&#xff0c;界…

所有人都告诉我考上了会怎么怎么样,却没人告诉我考研失败后该何去何从?

“所有人都告诉我考上了会怎么怎么样&#xff0c;却好像没人告诉我考研失败后该何去何从?” 2023年考研人数: 474万。 在竞争愈发激烈的考研热潮下&#xff0c;破茧成蝶&#xff0c;金榜题名注定只能成为少数人的如愿以偿。梦醒时分&#xff0c;大多数人或许也只能无奈地自嘲&…

【产品经理方法论——产品的基本概念】

1. 产品学三元素 产品学有三个元素&#xff1a;用户、需求、产品 产品学的内容&#xff1a;根据用户的需求设计产品&#xff0c;使用产品服务用户 仅仅通过三个元素无法说明每个元素的概念&#xff0c;因为三个元素互为说明关系。 通过引入人/群体来说明三个元素的关系。 需…

基于springboot海滨学院班级回忆录的设计与实现论文

海滨学院班级回忆录 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足&#xff0c;创建了一个计算机管理海滨学院班级回忆录的方案。文章…

2.Rust变量

变量的声明 let关键字 在Rust中变量必须要先声明才能使用&#xff0c;let关键字用于声明变量并将一个值绑定到该变量上。如下: fn main() {let var_name:i32 123123;println!("{}",var_name) //println! 是一个宏&#xff08;macros&#xff09;&#xff0c;可以…

PSINS工具箱笔记——SINS/GNSS的例程

如图&#xff0c;三个不同维数的SINS/GPS的融合&#xff0c;153表示状态量15维、观测量3维&#xff0c;以此类推。 15维包括&#xff1a;失准角&#xff08;3&#xff09;速度误差&#xff08;3&#xff09;位置误差&#xff08;3&#xff09;陀螺漂移&#xff08;3&#xff…

FL Studio20官方中文国内版升级下载2024最新

FL Studio 20&#xff0c;也被众多音乐制作人亲切地称为“水果20”&#xff0c;是一款功能强大的音乐制作软件&#xff0c;它在音乐创作、编曲、录音、混音以及后期制作等方面都有着出色的表现。这款软件不仅适用于专业的音乐制作人&#xff0c;也对初学者非常友好&#xff0c;…

【CSS】关于文字的换行问题

给固定宽度的div中写入一些文字&#xff0c;你会发现文字可能会超出&#xff0c;实例如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…

【QT】重载的信号槽/槽函数做lambda表达式

重载的信号槽 函数指针&#xff1a; int fun(int a,long b) int (*funp)(int, long) fun; 实现回调函数就需要函数指针 信号重载 派生类槽函数发送两个信号 派生类给父类发两个信号 void (SubWidget::*mysigsub)() &SubWidget::sigSub;connect(&subw,mysigsub,t…