第一章:使用 Gitlab CI/CD 解决了我们什么问题
文章目录
【注意】最后更新于 November 23, 2023,文中内容可能已过时,请谨慎使用。
在回答标题这个问题前,我先以自己亲身经历来说了一下,我所经历过的代码发布历程
1.1 原始版本发布流程
早在 Long long ago(故事开始),写完后的代码经过测试环境测试后,接下来进入发布流程,通过FTP工具(文本传输协议软件)如:FileZilla ,上传到服务器通过肉眼比对文件是否修复,然后进行上传代码覆盖。
这种方式的问题我总结有下几点问题:
- 不支持回滚操作
- 代码发布期间会造成服务中断
因为以上问题的存在,又是单机服务,所以每次发版基本都得是尽可能在下班以后或半夜操作,又是人工上传完成代码的覆盖,每次都得小心翼翼,如果一旦新版代码存在严重问题更是头大,最早期14年在北京一家做电商的时候每周必干的事情。
1.2 传统应用发版流程
我将上面的做法称为原始方法(纯手工,肉眼比对),后面接触到的更高级一点的做法,是使用的版本控制软件(GIT/SVN),配置 Webhook 的方式,代码自动推到指定分支后将触发部署脚本,那个时候的 webhook 写的还比较Low(就是直接 pull 某个分支代码),大多数用在测试环境集成,生产环境还是手动拉代码,可以是指定分支,也可以是指定 Tag Release(手动发版)。
有些童鞋公司做法是直接拉最新 master 分支,不推荐这么做,原因是因为不方便后期出问题时回滚,为了解决这个问题打 release tag 是一种方案,也是我们之前的早期做法,以下是我司一个 laravel 项目,手工发版执行的部分示例命令如下:
本机打 Tag git tag -a v3.9.2 -m ‘版本描述’ git push origin v3.9.2
远端发版 git fetch –tags git checkout -b v3.9.2 refs/tags/v3.9.2
更新依赖(可选) composer update neox/lib neox/model –verbose -vvv –profile
其他处理(可选) 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
- 构建服务与代码仓库分离,可以支持任意代码仓库
- 有统一管理界面,支持插件多、支持多语言(插件配置以及自身安装复杂)
- 体量大,不建议小团队使用
小结:
- Gitlab CI/CD 更适用于敏捷开发,开发与运维是同一(或一小组)人,最便捷的开发方式
- Jenkins 更适合在多角色团队,有单独运维团队,开发与运维两个部门,配置与代码分离,职责分明
如果你感兴趣,可以阅读这么扩展文章 13 Jenkins Alternatives For Continuous Integration
我们解决了什么?
- 编码完成后,提交PR,Code view 后,集成到dev测试分支,并自动部署
- 测试完成后,打 Release 自动(或主动)发布到生产环境
我们哪些语言项目在使用?
- PHP (业务)所有项目
- 前端项目(React / Vue)
- Golang 项目
- 客户端 App 项目(IOS + Android)
文章作者 BING
上次更新 2023-11-23