使用持续集成工具
概要
这篇文章介绍了持续集成相关的概念,介绍了一些常用的持续集成工具,使用 GitHub Action 和 Travis-CI 体验自动化的持续部署流程。
什么是持续集成
持续的含义是每完成一个部分,就向下一个环节交付,发现问题可以马上调整,一直重复这个过程,持续的做这个动作。
集成的含义就是把修改内容合并到主干上,在版本管理工具中称为主分支。
持续集成(Continuous Integration,CI) 是指软件开发时,频繁的将修改内容集成到主干上,让产品可以快速迭代,同时还能保持高质量。在集成到主干之前要通过自动化测试,只有通过所有测试用例才能进行集成。持续集成不能消除 bug,而是让他们非常容易发现和改正。
一些概念
持续集成
持续集成(Continuous Integration,CI),开发人员提交新代码后,立即进行构建、(单元)测试,根据测试结果来确定新代码和原有代码能否正确的集成在一起。
在开发时,每天会进行多次的集成,这样做的好处是:
- 快速发现错误:因为每次修改都会进行单元测试并集成到主干,可以快速发现错误,而且错误是最近修改内容导致的,因而也容易定位。
- 防止分支大幅偏离主干:如果没有经常集成,可能会导致和主干之间差异很大,导致后续难以集成。
持续交付
持续交付(Continuous Delivery),频繁的完成项目构建,更新软件版本,并做好部署前的准备,是否部署一般需要交付给质量团队或用户进行评审。
持续交付可以看作持续集成的下一步,强调的是不管怎么更新,软件随时可以交付。
持续部署
持续部署(Continuous Deployment,CD),所有流程都是自动化的,单次修改提交会触发自动处理流程(测试、构建等),最后自动部署到生产环境。
持续部署是持续交付的下一步,一般企业中都会做到持续交付,但不做持续部署,因为持续部署是有风险的,因为一次简单的提交,可能会将 bug 引入生产环境。
常见的持续集成工具
市面上 CI/CD 工具非常多,如 Buddy 、Jenkins 、Hudson 、TeamCity 、Travis-CI 、GoCD 、Bamboo 、Gitlib-CI 、CircleCI 、Codeship 、Buildbot 、Nevercode 、Integrity 、Strider 、AutoRABIT 、FinalBulider 、Wercker 、Buildkite 、Semaphore 、CruiseControl 、Bitrise 、UrbanCode 等等,实在太多了,就取其中几个来体验一下。
Jenkins
一款开源的 CI/CD 软件,用于自动化各种任务,包括构建、测试和 部署。用 java 语言开发,需要 java 运行环境,也可以使用 docker 运行。
Github Actions
GitHub 提供的持续集成功能,可以自动化和定制化项目工作流。尚在测试阶段,用户可以申请加入测试来体验。
Travis-CI
在 GitHub Actions 没有出来之前,很多人都是用这个来完成 CI/CD 工作的。开源项目可以免费使用,在国内有时访问速度有点慢。
自动化流程
根据持续集成的设计,代码从提交到生产,整个过程有以下几步。
提交
第一步是开发人员向代码库提交代码,在 svn 中称为提交(commit),在 git 中称为推送(push)。
测试(第一轮)
在代码仓库中设置钩子(hook),每次代码提交就会触发自动化测试,第一轮测试至少要完成单元测试。测试可分为:
- 单元测试:针对函数或模块的测试
- 集成测试:针对整体产品的某个功能的测试
- 端对端测试:从用户界面直达数据库的全链路测试
构建
通过第一轮测试后,代码就可以合并进主干,可以交付了。交付后先进行构建(build),然后进入第二轮测试。构建是指安装依赖、配置资源、编译源码等过程。
测试(第二轮)
第二轮是全面测试,新版本的每一个更新点都要,需要进行单元测试和集成测试,有条件的话也要做端对端测试。如果第一轮测试覆盖了所有测试内容,可以省略第二轮测试,当然构建步骤也要在第一轮测试前完成。
部署
通过第二轮测试后,就是可以部署的版本(artifact),将这边版本进行打包,发到生产服务器,生产服务器解包并允许这个应用。
回滚
当前版本出现问题时,需要回滚到上一个版本的构建结果。
使用 Github Action
Github 的 Action 功能还未正式发布,所以需要注册才能使用,注册地址:https://github.com/features/actions/signup
创建仓库
创建脚本
提交代码&触发自动任务
查看结果
使用 Travis-CI
登陆官网 https://www.travis-ci.org/ ,可以直接用 GitHub 账号授权登陆。
Travis-CI 可以直接与 github 关联,在 github 仓库内容有变化时,自动完成项目的构建、测试、部署。详细操作可以参考我的文章:使用 TravisCI 自动部署 hexo 博客
参考资料
- 如何理解持续集成、持续交付、持续部署?: https://www.zhihu.com/question/23444990
- The Product Managers’ Guide to Continuous Delivery and DevOps: https://www.mindtheproduct.com/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/
- 持续集成是什么?: http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html
- 使用 CircleCI 2.0 进行持续集成/持续部署: https://www.jianshu.com/p/36af6af74dfc
- 仅需一篇,妥妥吃透“持续集成”: https://zhuanlan.zhihu.com/p/52197714
- Goodbye Travis, Hello Actions!: https://zhuanlan.zhihu.com/p/91055962
总结
持续集成这种自动化是未来的大趋势,不仅在大项目中可以使用,在我们自己的项目中,比如个人博客中也可以使用,将这些重复、繁琐的工作交给 CI/CD 工具来做,将大大减少我们的工作量,让我们把精力放到开发上。