中国出口信用保险公司 DevOps 的发展历程
中国出口信用保险公司是我国唯一政策性出口信用保险公司,中国信保通过为对外贸易和对外投资合作提供保险等服务,促进对外经济贸易发展。
现阶段公司面临由大到强的整体转型,总部及分支机构迫切需要IT团队提供科技赋能,以用户为中心,实现科技引领的目标。因此IT团队面临很大挑战,传统的IT模式向DevOps转型也成为必然趋势。
项目背景:在企业IT部门转型 DevOps 任务之初,IT团队生产力工具匮乏,仅有的SVN和QC工具已经无法继续与日益增长的需求相匹配,同时,开发、运维间隙越来越大,相关技术积累薄弱、新旧文化冲突突显,转型困难重重。
什么是 CI/CD 交付通道?
Continuous Integration,持续集成包括:源代码变更、自动检测、拉取、构建、单元测试、自动化测试等。
Continuous Delivery,持续交付包括:源代码变更、自动检测、拉取、构建、单元测试、自动化测试、生产交付等
在众多CI/CD交付链介绍中,从CI到CD的区别只是最后能否将代码交付到生产环境。从理论上讲,在CI/CD交付链全部工具和技术就位并运转后,能否交付到生产似乎并不是很困难的问题。但在项目落地过程中,我们发现还是“Too Young To Naive(很傻很天真)”!
那么影响从CI到CD的到底是什么呢?我总结了以下4点:
1. 当工具链支持提交代码自动触发编译,意味着开发团队每次提交的代码都是“Build Success” 的版本,而不能再像过去那样仅仅是“我今天工作干完了帮我保存一下进度”;
2. 自动化测试团队需要更全面地对测试场景进行覆盖,意味着对自动化测试的进一步依赖和自动化测试团队重要性的大幅升级;
3. 团队敏捷程度更高则考验着团队文化的新旧碰撞,一个团队能够从过去的大瀑布流程里走出来接受DevOps文化中高频构建,小步快跑的思想在现实落地的过程中并不容易;
4. 最后就是团队的信心,变革者要带领团队大部分甚至全部成员接受敏捷文化以及在DevOps工具链上进行交付,这打破了常规交付手段,对交付工具间稳定配合工作的要求极具挑战。
如何在中国信保落地 DevOps?
接下来就让我们看看我们是如何一步步通过 Atlassian 的全系列工具落地 DevOps 工具链的。
过去,IT团队开发与运维的交付基本靠手工搬运文件形式进行,这种交付方式不仅效率低下,甚至经常出现人工失误,更严重的情况是,交付时很难预知交付后的各种状况,大版本的交付在所难免。
IT团队在代码管理方面也没有有效的版本管理机制,仅有的SVN只是作为备份和保存的依据。
初步变革发生在Git服务器搭建之后,团队陆续接受了从SVN向Git的转变,在Git的推广中渗透了版本与分支的管理理念,从此为后续 DevOps 转型奠定基础。其中SVN向Git迁移的同时我们对源码库进行了进一步的拆分,以更好地适应分支的管理和后续微服务的推广。我们平滑迁移了全部提交历史和用户映射,使用了 SVN Mirror for Bitbucket Server工具。
后续,我们将 Git 与 Jira Software 进行集成,实现了将代码与开发任务的关联。
我们还同时考察和对比了 Bamboo vs. Jenkins,Bitbucket vs. GitHub, 但考虑到与 Jira 和 Confluence 的集成优势,我们选择了 Atlassian 的全套工具以及插件作为公司下一代发展的平台,后面的实践也证明了选对工具和插件对人力资源的节约是多么巨大!
下图是我们现在的 DevOps 所使用到的产品和平台,接下来就让我们一起来看看我们是如何一步步实现 DevOps 全流程的过程。
根据业务场景灵活选择插件:
我们根据自己的业务需求选购了很多 Atlassian Marketplace 里的插件来实现需求,而不是盲目的进行二次开发,Marketplace 里的插件种类非常多,可以实现我们的绝大部分需求。这里,我也把我们用的比较好的插件推荐给大家:
- Big Picture 插件:我们用来实现项目进度甘特图管理,关键项目节点数据通过绘制甘特图进行展示;
- Structure:从项目管理角度,我们将项目划分为三级项目,依照项目-需求-开发任务进行管理,不同项目之间通过不同的任务类型以及它们之间的逻辑关系(Jira Links)进行关联,并通过使用 Structure 插件进行分级,分级后,1个项目对应多个需求,1个需求对应多个开发任务,以上三级任务在JIRA中并行流转,但在逻辑上存在这上下层关系。开发任务与缺陷之间通过Sub-Task形式硬关联,形成了具有团队使用特色的多级项目管理模型;
- ScriptRunner :从工作流角度,我们使用 Adaptavist ScriptRunner 工具在工作流流转中进行权限分隔、任务自动分配、自动记录时间节点和触发各类事务功能;
- eazyBI 统计报表:从数据统计角度,我们通过使用 eazyBI Reports 工具将 Jira 数据从后台导入,加工出各类项目和开发角度的统计数据,并定期在办公公共区域展示;
ScriptField:从字段角度,我们通过使用 ScriptField 工具自动统计加班、迟到、项目人天等数据;
synapseRT 测试工具:从测试角度,我们使用了 synapseRT 工具管理各类测试用例,将测试菜单项预录入工具中,测试人员依据测试用例按步骤执行测试操作和查看预期结果;
Automation Lite:从自动化任务角度,我们使用 Automation Lite 工具制作了非常多的自动化审批和事项跟踪功能,如通过结合JIRA收邮件事务,在特定工作流节点,触发当经办人为审批人的任务情况下,接收到审批人送给 Jira 的邮件和审批关键字,就自动审批该流程,实现了与邮件工作机制的平滑对接。
使用 Bitbucket + Bamboo 打造 DevOps 核心
紧接着,我们引入了 Atlassian 的 Bitbucket 产品,用来对 Git 分支进行管理。
在 Bitbucket 的功能扩展上,我们也选择了两款很好用的插件:
Smarter Search:对全局代码进行搜索,结合其他代码扫描类工具和api接口为开发人员360°查找代码提供了可能,可谓事半功倍;
Awesome Graphs:对代码的分支管理更精细化,分支间的关系和代码提交记录一览无余。
同时,我们还购买了 Fisheye,开发团队在线实现Code Review. 代码审核和提交回溯有据。
在开发相关的基础工具逐步完成后,我们深入运维方向,引入了持续集成工具 Bamboo。
Bamboo 是 Atlassian 家族成员中做 DevOps 的核心工具,在产品选型时曾对比过Jenkins 和 Bamboo,但考虑到与 Jira Software 和 Bitbucket 的集成优势,首选了Bamboo 作为下一代发展的工具,Atlassian 产品之间的无缝链接和集成,以及企业级的应用和支持,也为我们项目的成功打下坚实基础。
随着Bamboo构建次数幂等级的增加,我们搭建 Bamboo Agent,为编译提供更多计算资源。从此开始,团队实现从持续集成到持续交付的转型,代码提交后可直接通过 DevOps 通道进入生产环境,多代理模式提供了多个版本和分支的代码同时build和run一个项目的可能,编译速度大幅度提高;同时我们引入 Pipeline 工具,对交付流程进行可视化和模块化管理。
我们陆续将 Bamboo 与 Jira、Git、Bitbucket 等工具进一步整合,实现了项目、开发任务、缺陷、代码、环境、测试到生产的无缝关联,任何一步的操作都可寻踪觅迹找到源头,从该阶段开始,开发团队工作效率实现跨越式提升,代码终于在 DevOps 通道中流动起来了,版本管理理念深入人心。同时我们没有停下脚步,在团队内部针对不同开发组情况持续开展培训,并将敏捷和 DevOps 理念贯穿其中,在后续团队文化建设方面起到了重要作用。
接下来,我们将 Bamboo 与 Nexus 进行集成,对编译日志进行了集中管理,获取编译涉及代码的提交人,对其进行通知,并通过 Jira 维护的开发人员与其项目经理列表,对代码项目经理进行通知。
将编译过程与自动化测试进行集成,自动化测试报告直接在日志进行打印和通知。
2019年,我们搭建了 Sonar 和 CAST 静态代码扫描工具,与工具链产品进一步集成,补全了 DevOps 交付通道基础工具上的最后一环。
自此,我们的 DevOps 通道工具链基本铺设完成,在通道前开发人员交付代码,在通道后交付war 包给运维,而 DevOps 通道上的工具对开发人员均透明,整个过程全部自动化完成。
不久的将来,我们的 DevOps 通道将进一步输出容器到 PaaS 平台,实现更进一步的敏捷交付。