CI/CD工具选型
背景
现状
需求
痛点
业务
CI/CD定义
持续集成(CI)
什么是持续集成?
它是软件工程师每天频繁地将更新代码的副本传递到共享位置的过程。所有的开发工作都在预定的时间或事件中进行集成,然后自动测试和构建工作。通过 CI,开发过程中出现的错误能被及时发现,这样不仅加速了整个开发周期,而且使软件工程师的工作效率更高。
持续集成有什么好处?
开发
在开发过程的早期,开发人员能够发现和解决任何编码问题,使它们在成为下游主要问题之前得到纠正。这样可以降低错误代码导致的长期开发(和业务)的成本。
使用 CI 的另一个好处是可以提高编码能力。由于持续发展的自然灵活性,这使得开发人员能够快速、轻松地对代码进行更改,却不会产生运行回归风险。
测试
持续集成对于 QA 测试花费的时间也有很大的影响。通过 CI,开发人员不断审查和编辑以前的代码,能够检查到许多小的错误,这些错误在 QA 里通常发现的晚一些。这使得测试人员不仅可以专注研究代码和关注更加紧迫的问题,而且能够同时测试更多的场景。
持续交付(CD)
什么是持续交付?
持续交付(CD)是创建高质量应用程序的第二个难题。CD 是一门软件开发学科,利用技术和工具快速地交付生产阶段的代码。由于大部分交付周期都是自动化的,所以这些交付能够快速地完成。
持续交付有什么好处?
实施持续交付的主要好处是能够加快应用程序的上线时间。CD 的另一个好处是它能保证每个发行版本的风险较低。当使用 CD 方法发布时,开发团队也会更有信心,因为在整个开发生命周期中,所有内容都经过了多次测试
CI/CD工具要解决问题
- 构建自动化
- 测试自动化
- 部署自动化
CI/CD流程具体步骤
CI/CD选型考虑事项
- 易于安装、使用
- 开源,社区活跃度高
- 多云管理
- 多环境管理(物理机、k8s、docker、虚拟机)
- 触发CI/CD方式(手动、定时、代码提交触发)
CI/CD工具运用
公司级常用
特性 | Jenkins | Bamboo | GitLabCI |
---|---|---|---|
开源/商业性 | 开源 | 商业许可 | 开源 |
产品类型 | 自托管/本地部署 | 自托管/本地部署 | 自托管/本地部署 |
安装配置 | 简单 | 简单 | 简单 |
易用性 | 相比于可用性,更专注于功能 | 易于使用和定制 | 是 |
官方支持 | Jenkins 论坛和其他支持渠道获得支持 | 是 | 是 |
Plugin 生态系统 | 丰富的插件生态系统(1500 多个插件) | Atlassian 市场上有将近 200 个插件 | 否 |
并行性 | 是(部分) | 是 | 是 |
构建管道 | 是 | 是 | 是 |
集成 | 通过 Jenkins Pipeline DSL 自定义管道 | BitBucket 管道 | 很多第三方集成都可以访问,最著名的是GitHub和Kubernetes |
REST API | 是 | 是 | 是 |
内置 Git 分支工作流 | 不支持 | 是 | 是 |
Jira 软件集成 | 通过插件提供支持 | 是 | 否 |
容器化支持 | Jenkins X 集成Kubernetes | 是 | 是 |
代码质量 | 通过Sonarqube插件以及其它可以用来验证代码质量的不同插件来提供代码质量检查。 | 否 | GitLab也提供了一个功能来仔细检查代码的质量 |
开源项目
CircleCI
CircleCI 相对来说比较便宜,有免费计划,易于使用(配置是基于 YAML 的,虽然并不是每个人都喜欢 YAML)并易于阅读。
不推荐使用它的理由:
-
有限的企业级部署选项:仅在具有 Terraform 的 AWS 中支持
-
很难在本地部署
-
不支持在 K8s 中部署
-
核心组件是用 Clojure 编写的,虽然很酷,但是使用群体相对较少,而且 Clojure 也比 Java 慢
TravisCI
Travis CI 是使用 Ruby 编写的,性能不如 Java,而且本地 / 云(on-premise/cloud)部署选项也很有限。
公司自研
OPPO CI
网易
https://www.infoq.cn/article/aeo9cNR2vPfrYZCbx2fs
- 代码仓库:支持Git/SVN,可以适配绝大多数代码托管平台,并且对Gitlab做了深度适配,例如,支持从Gitlab Webhookpayload中提取各类参数;
- 代码扫描:集成了SonarQube,支持了所有主流的编程语言;
- 单元测试:整合了Java中常用的Jacoco工具,方便用户在运行单元测试时,生成对应的UT和覆盖率报告;
- 代码编译:Java支持了Maven/Gradle,并且内置了Nexus私服,方便做内网代理;Node.js支持了Npm;Golang支持了go mod缓存加速;
- 镜像构建:支持Docker out of Docker、Kaniko两种构建方式,用户可以根据自身需求选择使用;
- 镜像仓库:整合了Harbor,支持Harbor webhook,并且集成了Harbor的镜像扫描和镜像复制功能;
- 容器部署:支持kubectl原生部署、升级,以及轻舟CI/CD应用部署等多种部署方式;
- 自动化测试:支持Java语言常用的TestNG,同时整合了网易内部的GoAPI测试平台,支持在流水线中运行指定的接口测试集,并在执行时输出测试报告;
- 告警通知:集成了邮件发送、短信告警、网易POPO等多种通知方式;
CI/CD工具选型
结论
jenkins
原因
- 丰富插件,满足完整CI/CD构建流程
- 使用公司广泛、使用案例丰富,利用推广、以及运维人员技能提升
- 支持k8s构建,可与rancher等工具集成
- 集成cas, 完整权限管理、账号管理
遗留问题
-
中间件部署
-
混合云
-
服务扩缩容(CMDB)