腾讯蓝鲸团队是怎么做持续集成和部署的?

​蓝鲸是腾讯游戏沉淀多年的技术运营支撑体系,承担着数百款业务线上运营的使命。研发团队间的技术栈以及设计理念不同导致了游戏架构差异性和复杂性,也给 CI/CD 应用在包交付模式和灵活的编排上提出更多的挑战。

背景和痛点

蓝鲸是腾讯游戏沉淀多年的技术运营支撑体系,承担着数百款业务线上运营的使命。如图所示,蓝鲸的服务支撑覆盖到娱乐、文学、游戏、影视等不同领域的业务。这些业务来自于腾讯自研或者代理的,研发团队间的技术栈以及设计理念不同导致了游戏架构差异性和复杂性,也给 CI/CD 应用在包交付模式和灵活的编排上提出更多的挑战。研发与运维团队职责不同和环境差异化,在版本交付过程中版本因环境差异带来的问题,导致沟通成本非常高。研发团队在日常版本构建过程中,往往容易忽略代码检查以及安全扫描的事项,版本包外发现网导致了业务出现问题等。以上种种问题,都使得 CI/CD 的产品设计理念以及如何串连各大工具链,让业务在安全保障,版本稳定,效率提升上获得到最大收益,成为了 CI/CD 设计和实践的首要任务和重要挑战。

蓝鲸的 CI/CD 设计和实践

在设计 CI/CD 的应用中,需要充分考虑业务的支撑模式,基于业务的不同承载模式,会有 4 种不同场景,分别为:

  • 传统模式
  • 带集成的传统模式
  • 容器模式
  • 带集成的容器模式。

传统模式是业务运行在传统 OS 系统(虚拟机或物理机)上,但交付的包方式是二进制,这个在腾讯的代理游戏持续交付中比较常见(因为代理游戏游戏开发商是外部的,而运维是腾讯内部的,所以交付的包一定是编译后的二进制包)。

带集成的传统模式是业务运行在传统 OS(虚拟机或者物理机)上,也会带上源代码,这个在腾讯的自研游戏持续交付中比较常见。

另外,容器技术带来的技术变革,在 CD 方面发生了很大的变化,以至于模式又进一步延伸,CI/CD 中需要跟容器进行紧密的结合,有了容器模式和带集成的容器模式。以上几种模式都需要在设计 CI/CD 应用中充分考虑到。

 

CI/CD 工具链设计

 

经过多年的沉淀,蓝鲸的 CD 应用非常成熟,包括大家所熟悉的蓝鲸作业平台、蓝鲸标准运维、容器管理(k8s 和 mesos)等等。因此我们设计 CI/CD 的工具链时,是从 CD 工具链往前设计,基于 jenkins 开源工具整合了代码编译、代码检查、单元测试、容器构建和归档、部署工具,容器编排(mesos 和 k8s)等原子节点,丰富的工具和灵活的编排使得研发团队可以在 CI 场景中可以灵活定制,来满足自己的构建场景。另外, 我们通过调用 Artifactory 的 API,将 CI 流水线中产生的数据,比如单元测试通过率,代码检查结果,代码分支信息等等,都作为发布包的元数据,记录在 Artifactory 里面,使得我们的开发,测试,运维团队实时了解发布包最新信息的能力,而不需要进行冗余的人工沟通。同时在流水线过程中提供了质量关卡来保障每个环节的依赖以及包质量,使得外放的版本质量更高。

 

上图是简单的流水线产品图,用户可以根据自己的构建需求来创建属于自己的流水线,因后台是基于容器的快速生成构建机的技术,使得流水线间的资源可以保持独占和隔离,构建过程中体验感以及排队机制也得到相应的提升。

 

蓝鲸 CI 核心功能 — 代码检查

 

代码检查是持续集成中较为重要的环节,它不仅可以提前发现业务缺陷,而且还在开发团队落地和宣扬了代码检查文化。这部分核心技术和文化落地主要由腾讯内部专业的 codecc 团队设计和实践,他们将提供的服务对接到整个持续集成工具链中,主要核心服务提供了 Coverity,CppLint,PyLint,ESLint,圈复杂度以及重复率等来对不同开发语言进行全方位扫描和检测。CI 整合了代码检查工具环节,一者可以让每个原材料(代码等)都可以经过代码检查这个环节,保证所有代码都是经过扫描过的。二者站在整个工具链角度,最终版本的质量,代码检查的修复情况决定了最终版本质量好坏的因素之一。最后,将代码检查出来的数据指标可以作为包的元数据,也是作为最终质量红线的核心指标之一。 

使用 JFrog Artifactory 实现全球化仓库管理和工具链集成

 

仓库管理主要在持续集成过程中用于包归档以及对接部署环节,我们使用了 JFrog Artifactory 作为软件仓库管理平台,在仓库管理这块,我们需要考虑到代理游戏和自研游戏的不同交付所产生的不同管理模式。对于代理游戏,例如英雄联盟 (LOL),研发团队在美国,需要实时将美国研发团队的交付物(Docker 镜像)实时传输到中国区的数据中心,并且保证 Docker 镜像的实时多中心同步稳定以及数据一致性,也是一项较大的挑战。所以我们使用了 JFrog 的 Artifactory 作为全球化仓库管理的支持平台。帮我们解决了实时同步 Docker 镜像到内部 IDC 环境,从实际数据来看,从美国节点传到深圳节点、上海节点,每次的包大概是 340M 左右,大概耗时 2 分钟左右。另外,在二进制包交付中,早期我们内部有一个叫云石的系统,主要用于自研和代理的游戏的二进制包交付。

图中所示,利用云石可以无缝对接蓝鲸的运维发布工具。所以在包归档中,容器归档我们用了 JFrog Artifactory 进行管理,二进制目前还是使用到自研的云石系统,CI 工具都整合了这些,使得用户可以根据自己的需求灵活使用。

小结

以上从 CI/CD 工具链设计和核心实践角度做了简单阐述,实现的持续集成 APP 也是腾讯蓝鲸 CI 演进的第一版,主要用于运营系统和游戏服务端构建,相对比较简单和易用,随着后续游戏的客户端构建的复杂性以及游戏对 DevOps 提出更高的要求,CI/CD 系统在内部也随着演进和升级。