持续集成与持续交付是软件开发和交付中的实践。咱们项目中一直在践行持续集成(CI:Continuous Integration);持续交付(CD:Continuous Delivery)未能达到理想状态,只能实践一部分。这篇文章用于总结CI/CD的实践。程序员
软件开发中,集成是一个极可能发生未知错误的过程。持续集成是一种软件开发实践,但愿团队中的成员频繁提交代码到代码仓库,且每次提交都能经过自动化测试进行验证,从而使问题尽早暴露和解决。docker
持续集成可使问题尽早暴露,从而也下降了解决问题的难度,正如老马所说,持续集成没法消除bug,但却能大大下降修复的难度和时间。数据库
首先,持续集成须要:后端
1. 单一的代码仓库,团队成员都像该仓库提交代码;服务器
2. 自动化构建且构建过程须要包含自动化测试;架构
3. 有单独的集成机器用于构建;运维
4. 保证构建速度不要太慢(曾经有一个项目构建须要20分钟,就会很痛苦);微服务
5. 在类产品环境进行测试;工具
6. 可以方便获取最新的可执行程序;单元测试
7. 可视化,你们都能看到构建过程及结果;
8. 自动化部署。
其次,咱们经过如下步骤进行持续集成:
1. 程序员将代码下载到本地,并在完成修改后提交代码;
2. CI服务器监测代码库,并在有提交时自动触发;
3. CI服务器对代码进行构建,运行单元测试和集成测试;
4. CI服务器发布可部署的artefact用于后续测试,并加上本次构建版本的标签。
5. CI服务器通知团队构建成功或者失败;失败发生时团队须要尽快修复,以避免耽搁后续的持续集成过程,由于失败时处于持续集成的暂停阶段。
最后,须要就团队责任达成共识:
1. 频繁提交;
2. 提交以前确保测试经过;
3. 不在持续集成失败时提交代码;
4. 提交代码后保证持续集成成功,否则不许回家😄
CI工具
Jenkins + K8s + docker
持续交付是持续集成的扩展,指的是将经过自动化测试的软件部署到产品环境。持续交付的本质是把每一个构建成功的应用更新交付给用户使用。在持续交付的世界里,咱们对完成的定义不是测试完成,而是交付到客户手中。这里须要注意的是,CD表明持续交付(Continuous Delivery)而不是持续部署(Continuous Deploy),由于部署也包括部署到测试环境,而持续交付表明的是功能的上线,交付给用户使用。
持续交付的好处在于快速获取用户反馈;适应市场变化和商业策略的变化。开发团队保证每次提交的修改都是可上线的修改,那么决定什么时候上线,上线哪部分功能则彻底由产品业务团队决定。
虽然持续交付有显著的优势,但也有不成立的时候,好比对于嵌入式系统的开发,每每须要软硬件的配合。
1. 保证每次提交的修改都是可上线的修改。
2. 完善的测试(包括单元测试,组件测试,验收测试)来测试新功能和进行回归测试;
3. 持续交付的前提条件是自动化的集成和部署;须要开发/测试/运维人员一块儿完成。
蓝绿发布须要注意⚠️(转载自小程故事多的博客https://www.jianshu.com/p/022685baba7d)
当你切换到蓝色环境时,须要稳当处理未完成的业务和新的业务。若是你的数据库后端没法处理,会是一个比较麻烦的问题;
可能会出现须要同时处理“微服务架构应用”和“传统架构应用”的状况,若是在蓝绿部署中协调很差这二者,仍是有可能会致使服务中止。
须要提早考虑数据库与应用部署同步迁移 /回滚的问题。
蓝绿部署须要有基础设施支持。
在非隔离基础架构( VM 、 Docker 等)上执行蓝绿部署,蓝色环境和绿色环境有被摧毁的风险。