在回答标题这个问题前,我先以自己亲身经历来说了一下,我所经历过的代码发布历程

1.1 原始版本发布流程

早在 Long long ago(故事开始),写完后的代码经过测试环境测试后,接下来进入发布流程,通过FTP工具(文本传输协议软件)如:FileZilla ,上传到服务器通过肉眼比对文件是否修复,然后进行上传代码覆盖。

这种方式的问题我总结有下几点问题:

  • 不支持回滚操作
  • 代码发布期间会造成服务中断

因为以上问题的存在,又是单机服务,所以每次发版基本都得是尽可能在下班以后或半夜操作,又是人工上传完成代码的覆盖,每次都得小心翼翼,如果一旦新版代码存在严重问题更是头大,最早期14年在北京一家做电商的时候每周必干的事情。

1.2 传统应用发版流程

我将上面的做法称为原始方法(纯手工,肉眼比对),后面接触到的更高级一点的做法,是使用的版本控制软件(GIT/SVN),配置 Webhook 的方式,代码自动推到指定分支后将触发部署脚本,那个时候的 webhook 写的还比较Low(就是直接 pull 某个分支代码),大多数用在测试环境集成,生产环境还是手动拉代码,可以是指定分支,也可以是指定 Tag Release(手动发版)。

有些童鞋公司做法是直接拉最新 master 分支,不推荐这么做,原因是因为不方便后期出问题时回滚,为了解决这个问题打 release tag 是一种方案,也是我们之前的早期做法,以下是我司一个 laravel 项目,手工发版执行的部分示例命令如下:

  1. 本机打 Tag git tag -a v3.9.2 -m ‘版本描述’ git push origin v3.9.2

  2. 远端发版 git fetch –tags git checkout -b v3.9.2 refs/tags/v3.9.2

  3. 更新依赖(可选) composer update neox/lib neox/model –verbose -vvv –profile

  4. 其他处理(可选) chmod -R storage/*key

注:还有使用 SVN 做代码管理,通过备注的特殊备注来自动触发,将代码发布测试或生产环境。

1.3 Gitlab DevOps CI/CD

DevOps 概念 DevOps :Development 和 Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

CI 是什么?CI 和 CD 有什么区别? CI 持续集成(Continuous Integration): 解决:多位开发人员处理同一应用的不同功能时,可以帮助开发人员更加频繁的将代码合并到共享分支或“主干”中(自动构建应用时,通过会运行不同级别的自动化测试)

CD 持续交付(Continuous Delivery): 完成 CI 中构建以及单元测试和集成测试的自动化流程后,持续交付可自动将已验证的代码发布到存储库,在该流程结束时,运维团队可以快速、轻松的将应用部署到生产环境中

CD 持续部署(Continuous Integration ): 解决:可以自动将应用发布到生产环境

总而言之,CI/CD 是一种通过自动化来频繁向客户交付应用的方法, 其核心概念是持续集成、持续交付和持续部署,好处便是降低应用部署的风险。

DevOps 有哪些方案

  • Jenkins
  • Gitlab
  • GoCD
  • Drone
  • CircleCI
  • ….

Gitlab CI/CD 与 Jenkins 对比

Gitlab CI/CD

  • 轻量级、配置简单,不需要复杂的安装
  • 构建日志十分清晰,交互体验友好,gitlab 角色权限控制
  • 配置依赖于项目代码仓库,根据 YAML 进行配置,没有统一的管理界面

Jenkins

  • 构建服务与代码仓库分离,可以支持任意代码仓库
  • 有统一管理界面,支持插件多、支持多语言(插件配置以及自身安装复杂)
  • 体量大,不建议小团队使用

小结:

  1. Gitlab CI/CD 更适用于敏捷开发,开发与运维是同一(或一小组)人,最便捷的开发方式
  2. Jenkins 更适合在多角色团队,有单独运维团队,开发与运维两个部门,配置与代码分离,职责分明

如果你感兴趣,可以阅读这么扩展文章 13 Jenkins Alternatives For Continuous Integration

我们解决了什么?

  • 编码完成后,提交PR,Code view 后,集成到dev测试分支,并自动部署
  • 测试完成后,打 Release 自动(或主动)发布到生产环境

我们哪些语言项目在使用?

  • PHP (业务)所有项目
  • 前端项目(React / Vue)
  • Golang 项目
  • 客户端 App 项目(IOS + Android)