某银行大型管理系统端到端持续集成和交付实践


背景

传统的银行IT系统研发流程从需求提出到产品交付往往具有较长的研发周期,纵观银行当下面临的市场环境,个人信贷消费升级,资管需求旺盛,普惠金融成为国家战略,来自银行同业和互联网金融的压力扑面而来,谁先推出符合市场需求的产品谁就占领了先机,对银行IT研发的快速交付能力提出了新的要求和挑战。

传统银行IT系统研发过程中的弊端主要体现在研发流程不连贯难追溯、人工处理效率低时效差、缺乏有效的代码审查机制、人力资源浪费等,针对上述问题,我们基于持续集成、持续交付的理念,设计了针对某银行大型管理系统(下称C系统)的CI/CD流水线,开发了一系列核心组件,基于TFS (现已改名为 Azure DevOps Server)实现了端到端、线上化、全自动的持续交付。


作者:葛江浩、宋绍磊、王丽敏

供职于中国农业银行研发中心,从事信贷管理领域系统研发工作,致力于银行大型IT系统端到端全流程敏捷转型的研究与实践。


640?wx_fmt=png


  C系统是某银行重要的大型管理系统,具有多团队协作、多项目并行、多技术体系并用、多产品/模块协同、多环境并存、多时点交付等特点,是一个典型的银行大型IT系统。我们以C系统为试点,基于TFS,设计了从需求管理、任务分配、分支建立、代码提交、版本合并、自动化构建发布到自动化测试的覆盖研发全流程的持续集成和交付流水线。开发人员通过全线上操作发起版本发布申请,将代码收集、版本核对、构建发布等重复性工作自动化、线上化,提高了版本交付的效率与质量、释放了人力资源。


640?wx_fmt=png

1 持续集成和交付流水线模型


1. 自动化代码静态扫描

代码静态扫描是控制代码质量的重要手段。对于C系统来说,原有的人工触发全量检查方式是一种被动的事后检查策略,在发布生产环境前检查,每次检查至少需要3个小时,且需要人工甄别增量违例,时效性差、工作效率低、修改成本高等问题突出。

为解决上述问题,我们深入研究了TFS APIJTestCChecker等静态检查工具,通过文件哈希值比对等技术手段,对代码合规检查组件和邮件通知组件进行了深度定制,形成了一套按需增量检查+定时全量检查相结合的代码合规检查策略,并能够向相关负责人精准发送违例代码通知。


640?wx_fmt=png

1 代码合规检查调用的TFS API列表


我们将代码合规性检查集成到持续集成和交付流水线中,在开发人员申请将代码合并到测试版本库或准生产版本库时,自动触发代码合规性检查步骤,并自动解析检查报告,若存在新增违例,则禁止代码合并,并向代码提交人发送邮件通知。

640?wx_fmt=png

2 分支策略中配置的代码合规性检查


640?wx_fmt=png

3 代码合规性检查存在新增违例的日志信息


2. 代码强制评审

代码评审主要包括两方面内容:一是C系统由多个模块构成,每个模块由不同的开发人员负责,当出现跨模块的代码修改时,须由该模块的负责人评审改动内容的准确性;二是系统中存在一些公共配置文件,这些文件改动后可能会对整个系统产生影响,须由资深的系统研发人员进行评审。

我们借助TFS拉取请求中的审阅者功能,设计了满足C系统特点的代码强制评审策略,有效避免了误审、漏审、甚至不审等弊端。

我们首先在TFS中创建了C系统各模块的开发人员团队,并在分支策略中配置了各模块对应的代码路径。


640?wx_fmt=png

4 分支策略中配置的模块负责人


当开发人员提交代码时,TFS会自动判断是否存在跨模块的代码修改,并在拉取请求的审阅者中自动添加模块负责人作为必须的审核人员,只有通过审核才能进行后续的代码合并。


640?wx_fmt=png

5 代码合并时的强制代码审核


3. 持续集成持续交付

持续集成持续交付是提高研发效率、保证产品质量至关重要的一环,我们编写了一系列构建组件,通过TFS进行组件编排,完成不同环境的持续集成和交付需求。

640?wx_fmt=png

6 TFS构建中的组件编排


C系统前台使用java语言开发,以一个完整程序包的形式进行发布。对于日常的研发,将构建发布配置为定时模式,每周一至周五12:0018:00定时自动构建发布,满足日常测试需要。


640?wx_fmt=png

7 定时构建发布配置


对于时效性强的敏捷类项目,将构建发布配置为实时模式,每当有代码提交时便触发构建发布,测试人员可及时介入,缩短开发测试周期。


640?wx_fmt=png

8 实时构建发布配置


C系统后台功能使用c语言开发,运行在AIX平台,无法直接使用TFS的构建功能,经过一系列的技术攻关,我们借助Jenkins自主实现了一套c程序构建发布的方法,解决了TFS Agent不支持AIX平台的技术难题,统一了C系统前后台的构建发布流程,为开发人员提供了简约一致的使用体验。


640?wx_fmt=png

9 基于AIX平台的C程序构建流程


c程序具有相对独立、依赖关系弱的特点,所以均采用由开发人员自主触发的实时交易构建发布模式,每个开发人员可按需独立发布程序,在构建参数中填入待发布的程序名即可。


640?wx_fmt=png

10  C程序自主构建发布


4. 自动化测试

版本质量是研发的根本落脚点。我们构建了基于Ant+Junit+Selenium的功能测试框架,将测试流程集成到持续集成和交付流水线,实现了业务测试版本和准生产版本的回归测试,每日定时执行业务核心流程案例,缩短了版本验证时间,提升了投产版本的可靠性,有效降低了投产风险。


640?wx_fmt=png

1. 需求条目化和开发

项目经理从项目的角度,以“项目->模块->功能->任务”结构对需求进行条目化拆分,录入TFS,由项目组成员完成任务认领。随后基于各自的任务开展需求分析、设计、开发和测试等工作。


640?wx_fmt=png

11 TFS工作项管理层次


640?wx_fmt=png

12 TFS工作项示例


TFS中配置开发分支自动编译,当TFS检测到新的提交后,获取代码并自动编译,若编译失败,则会自动向代码提交人发送邮件通知。


640?wx_fmt=png

13 TFS开发分支自动编译配置

2. 测试版本发布


640?wx_fmt=png

14 测试发布总体流程


开发人员通过TFS工作项和Git的拉取请求(pull request)功能申请将改动的代码合并到测试分支。


640?wx_fmt=png

15 TFS工作项申请Git分支


640?wx_fmt=png

16 TFS创建拉取请求页面


配置管理员在TFS中对测试分支配置分支策略,主要包括:

Ø 必须使用拉取请求的方式向测试分支提交代码

Ø 所有拉取请求都需要经过至少一个人审阅

Ø 所有拉取请求都要关联工作项

Ø 配置分支合并时触发的预编译定义

Ø 配置代码审查人员


640?wx_fmt=png

17 TFS分支策略配置页面


TFS提交拉取请求后,可以在web页面查看拉取请求状态,包括必须满足的条件、链接的工作项、审阅者、变更内容等,所有条件满足后即可完成代码合并。


640?wx_fmt=png

18 TFS拉取请求页面


完成代码合并后,会自动触发TFS中配置的程序自动发布定义,完成测试环境程序包的部署。


640?wx_fmt=png

19 C3前台自动部署配置


3. 投产版本发布

640?wx_fmt=png

20 投产发布总体流程


TFS中创建投产团队,从系统的角度,以“系统->窗口->职能组->投产内容”的逻辑层次管理投产内容。开发人员通过工作项发起投产申请,填写投产内容并通过TFS文档库管理投产文档。填写完成后将投产申请指派给配置管理员进行审核。


640?wx_fmt=png

21 TFS投产团队工作项


配置管理员根据投产日期创建准生产分支


640?wx_fmt=png

22 配置管理员创建的准生产分支


开发人员申请将已完成测试的待投产代码合并到准生产分支


640?wx_fmt=png

23 创建合并到准生产分支的拉取请求


拉取请求预编译、评审等工作与测试发布流程一致。

完成所有待投产内容到准生产分支的合并后,配置管理员在TFS中创建投产标记(基线),基于该标记触发准生产版本的自动构建,生成投产包,发布到准生产环境供开发人员进行投产前的最终验证,验证完成后在投产窗口将程序部署到生产环境。


640?wx_fmt=png

24 TFS创建标记页面


640?wx_fmt=png

基于TFS的端到端持续集成和交付流水线在C系统中的正式应用实现了研发流程自动化、线上化、可追溯的目的,提高了系统研发效率、保证了研发质量、释放了人力资源、缩短了产品交付周期,是银行大型IT系统研发模式转型的一个典型实践。银行IT系统研发流程的DevOps转型任重道远,是一个渐进式的过程,我们会对流水线模型进行持续改进优化,不断适应业务和技术的新需求,探索出一条满足银行IT特色的DevOps之路。



640?wx_fmt=other微软DevOps技术社区持续招募中


640?wx_fmt=png


我们的DevOps社区仍然继续招募中,希望加入的小伙伴可以扫描下面的【DevOps社区运营助手】二维码添加好友并申请入群。


640?wx_fmt=png


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

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

相关文章

排列组合十一个性质公式及证明,错排数公式及证明

文章目录排列数组合数求组合数常用公式定义式递推式杨辉三角组合数常用性质及证明性质一性质二性质三性质四(二项式定理)性质五性质六性质七性质八性质九性质十性质十一错排数排列数 从nnn个物品中不放回地依次选mmm个物品,考虑顺序,有多少种方案&#…

洛谷P3155:叶子的染色(树形dp)

解析 本题的关键是选取哪一个根对答案没有影响 还有一个重要的性质是:根节点必定涂色 这点对每棵子树作为独立的子问题时依然成立 然鹅我完全没有看到上面那俩性质 直接暴力设计dp状态0.、1、2 开始莽 然后?然后就T了啊… 只好开始考虑换根 然后&#x…

P7011-[CERC2013]Escape【堆,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P7011 题目大意 给出nnn个点的一棵树,从一出发,要走到 ttt。初始时权值为000,每个节点有一个权值wiw_iwi​,第一次走过这个节点时会让权值加上该节点的权值,要求全程…

CF1463F Max Correct Set(取小样法+状压 DP)

CF1463F Max Correct Set 要求选出集合 \(U\{1,2,3,\dots,n\}\) 的一个子集 \(S\),满足:如果 \(a \in S\) 并且 \(b \in S\),那么 \(|a-b| \not {x}\) 并且 \(|a-b| \not {y}\)。求集合 \(S\) 大小的最大值。 \(1\le n\le 10^9,1\le x,y\le 2…

引入用于 Azure IoT Edge 的 Visual Studio 工具

物联网开发人员:工具和经验引入用于 Azure IoT Edge 的 Visual Studio 工具今天,我们很高兴地发布用于 Visual Studio 2017 的 Azure IoT Edge 工具的预览版。Azure IoT Edge 是一个全托管服务,通过直接在跨平台物联网设备上部署并运行人工智…

P4878 [USACO05DEC]Layout G

P4878 [USACO05DEC]Layout G 题意&#xff1a; 题解&#xff1a; 这个题其实是差分约束的裸题&#xff0c;但是有几个坑要注意 1.题目说了&#xff0c;奶牛按照编号1…N排列&#xff0c;对于ML个输入&#xff0c;A< B ,所以关系是B - A < 10,而不是A - B <10,我一开…

【学习笔记】原根 / BSGS / 扩展BSGS证明及模板

文章目录原根BSGS大步小步算法扩展BSGS原根 如果两个整数a,ba,ba,b互质&#xff0c;则有aϕ(b)%b1a^{\phi(b)}\%b1aϕ(b)%b1 定义模bbb意义下的aaa的阶为使ad%b1a^d\%b1ad%b1的最小正整数ddd 显然&#xff0c;模bbb的阶d∣ϕ(b)d|\phi(b)d∣ϕ(b) 如果模bbb意义下aaa的阶为…

Loj#3130-「COCI 2018.12」Praktični【线性基】

正题 题目链接:https://loj.ac/p/3130 题目大意 给出nnn个点mmm条边的一张有权无向图&#xff0c;你每次可以选择一个边集异或上一个值&#xff0c;要求最少次数使得所有简单环异或和都为000。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 先找一棵生成树&#xff0…

洛谷P5664:Emiya 家今天的饭(容斥、dp)

解析 应该是比较入门的容斥了 统计方案用总方案数-某列超过1半的方案数 dp设计的一个trick是只统计差值 代码 #include<bits/stdc.h> using namespace std; #define ll long long const int N2050; const double eps1e-6; const int mod998244353; inline ll read(){l…

[ARC098F] Donation(找性质+点 Kruskal 重构树)

[ARC098F] Donation 给出一个 \(N\) 个点 \(M\) 条边的无向连通图&#xff0c;每个点的标号为 \(1\) 到 \(n\)&#xff0c; 且有两个权值 \(A_i,B_i\)。第 \(i\) 条边连接了点 \(u_i\) 和 \(v_i\)。 最开始时你拥有一定数量的钱&#xff0c;并且可以选择这张图上的任意一个点作…

.Net Core分布式部署中的DataProtection密钥安全性

在.NetCore中默认使用DataProtection来保护数据&#xff0c;例如Cooike等。一般情况下DataProtection生成的密钥会被加密后存储&#xff0c;例如默认的文件存储可以看到使用了Windows DPAPI加密。但是如果更改默认设置例如使用的外部存储如redis则此时密钥默认是不加密的微软说…

P2294 [HNOI2005]狡猾的商人

P2294 [HNOI2005]狡猾的商人 题意&#xff1a; 你需要调查某个商人的账本&#xff0c;给你n个月内&#xff0c;m条账单信息&#xff0c;每条账单信息为x到y月的收入或者支出多少钱&#xff0c;问你根据账单信息判断这个账本是否合理 5 3 1 5 100 3 5 50 1 2 51比如样例&…

洛谷P1852:跳跳棋(LCA,树形结构)

解析 考虑一个三元组(x,y,z)(x,y,z)(x,y,z)&#xff0c;看它能如何跳 要么是yyy往左右跳&#xff0c;左右边界会变大 要么是两边往中间跳&#xff0c;由于最多跨过一个棋子&#xff0c;所以左右边界会变小 当三点等距时&#xff0c;无法往中间跳 于是我们惊喜的发现&#xff1…

scanf(“%s“)真的只开读入字符串大小就可以了吗??

文章目录前言还原过程计算机程序背后的故事总结瞎逼逼前言 艹艹艹艹艹艹&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;老子没想到没想到&#xff0c;靠&#xff01; 本人刚刚在做树链剖分“染色”一题的代码重构&#xff0c;上午打…

P5299-[PKUWC2018]Slay the Spire【dp】

前言 正题 题目链接:https://www.luogu.com.cn/problem/P5299 题目大意 有2n2n2n张牌&#xff0c; nnn张强化牌&#xff0c;每张上有一个正整数x(x>1)x(x>1)x(x>1)&#xff0c;如果使用后之后的每一张攻击牌伤害都会乘上xxx。nnn张攻击牌&#xff0c;每张上有一个正…

CF1152F Neko Rules the Catniverse(状压 DP)

CF1152F Neko Rules the Catniverse 给定参数 \(n,k,m\)&#xff0c;你需要求有多少个大小为 \(k\) 的序列 \(a\) 满足如下三个条件&#xff1a; 任意两个元素其权值不同。对于任意 \(i\) 满足 \(1\le i\le k\) 有 \(1\le a_i\le n\)。对于任意 \(i\) 满足 \(2\le i\le k\) 有 …

asp.net core2.2 多用户验证和授权

asp.net core2.2 用户验证 和授权有很详细和特贴心的介绍&#xff0c;我感兴趣的主要是这两篇&#xff1a;cookie身份验证基于角色的授权我的项目有两类用户&#xff1a;微信公众号用户&#xff0c;用户名为公众号的openid企业微信的用户&#xff0c;用户名为企业微信的userid每…

P1494 [国家集训队]小Z的袜子

P1494 [国家集训队]小Z的袜子 题意&#xff1a; 有一个长度为 n 的序列c[i] 。现在给出 m个询问&#xff0c;每次给出两个数l,r &#xff0c;从编号在 l 到 r 之间的数中随机选出两个不同的数&#xff0c;求两个数相等的概率。 题解&#xff1a; 很明显&#xff0c;莫队算法…

CSP2020洛谷P7076:动物园(位运算)

你知道它很水&#xff0c;但你就是切不掉它 解析 一直卡85&#xff01;&#xff01; 原因&#xff1a;最后判断的循环应该从0到k-1而不是从1到k&#xff01; 啊啊啊一定要小心啊qwq 说实话这个分都算是好的&#xff0c;这种bug爆大分一点招没有 还有一个问题是对于ans64爆unsi…

一文带你快速读懂.NET CLI

dotnet cli 是 .Net Core 功能中最有用的特性之一。在这篇文章里&#xff0c;我们将介绍几个.Net OSS 工具是如何使用 dotnet cli&#xff0c;并介绍如何在日常开发中使用新的 cli 工具。正文关键要点dotnet cli 使得基于. Net 项目的自动化和脚本编写变得非常简单&#xff0c;…