云计算的普及不仅改变了当前的IT基础设施和企业系统架构,也改变了技术团队的组织架构和企业内部的研发流程。持续集成(CI)和持续交付(CD)是企业内部研发过程中提高交付效率的关键。CI/CD的核心价值是性能和质量。性能提升的关键在于自动化,它包括两个方面:一是整个软件开发过程的自动化,降低人力成本;二是CI/CD平台实现自动化,从而降低技术支持成本。质量保证,一方面是研发质量,需要提供相应的质量检验和测试工具;另一方面,流程质量,CI/CD平台需要能够持续采集研发过程中的指标数据(如交付频率、交付周期、交付成功率),建立完善的质量衡量体系。目前各大公司的CI/CD平台在工具选择和实现上各不相同。此次,InfoQ采访了网易杭州研究院高级产品开发工程师王灿峰和服务器高级开发工程师梅光辉。他们分享了网易轻舟在CI/CD方面的实践。由于干货内容过多,我们将本次实践分为上、中、下三个部分,分别介绍网易的CI实践、CD实践、测试自动化和API版本管理。一、网易CI/CD实践的背景据了解,网易大部分互联网产品业务团队使用统一的平台进行CI/CD实践。目前,平台上运行着数万个仓库,近万个活跃仓库,平台中还有大量副本数在数千以上的服务,这些服务每年承载着业务方的大量访问。天。为了适应业务发展的节奏,网易在内部广泛推行敏捷开发。每天通过该平台发布的应用数量达到数万次。产品迭代节奏快,交付周期短。所有业务使用统一平台进行CI/CD,无需单独搭建,降低成本,使用统一规范,避免同一个问题挖多个坑。网易内部CI/CD实践主要是青州CI/CD平台,提供可视化流水线布局界面,一次配置,多次运行,支持团队成员共享配置。每次提交或合并代码时,都会自动触发流水线的执行,并自动将代码发布到环境中。数据显示,CI/CD流水线相比传统人工或脚本方式平均效率提升5倍以上,发布效率提升8倍以上。另外,通过集成多种自动化测试工具,帮助业务方实现高质量的集成。通过可视化测评平台,多维度了解构建部署相关指标数据,助力产品提升发布效率。此前,网易有一个从主机部署时代发展而来的自动化部署平台,但对容器部署的支持并不友好。在部署之前,需要在服务器上部署一个agent,注册到内部的CMDB,然后下发指令执行。这样的执行操作,注定了在这个平台大规模部署场景下会出现性能瓶颈。基于原有平台的性能问题和对业务容器化、微服务演进的判断,网易开发了全新的青州CI/CD平台,成为网易云原生技术栈的重要组成部分,满足企业需求在云原生环境中。在能源效率、团队合作效率、产品迭代速度等方面有很多要求。在用户体验上,青州CI/CD是一体的,但在系统架构设计上,它们实际上是分开的。下面分别说说CI和CD的系统设计。2、网易CI实践的整体架构和工具选择与大部分互联网公司相同。网易内部各业务方的持续整合,也主要是负责研发团队的QA。CI工具选择比较常用的Jenkins。流水线的上下游集成了其他主流的CI工具。整个流水线平台依托于Kubernetes,基于K8sCRD(自定义资源)重新设计了流水线的上层模型,通过Operator驱动流水线执行过程。当pipeline触发执行时,会生成一个PipelineRun对象,Operator会根据对应pipeline预先定义的stage生成对应的Job,然后通过JenkinsAPI触发Job的执行。作业执行完毕后,会通过Webhook回调上层服务接口,将状态写回PipelineRun,进而触发下一阶段的执行。CI工具选择传统的持续集成实践本身就占用了大量的资源。编译构建对磁盘、CPU,甚至网络都有一定的要求。如果要保证持续集成任务在高峰期能够及时运行,通常需要预留大量的资源。施工机械资源,不仅会造成资源浪费,而且需要更多的人力进行维护和管理,成本高。因此,网易技术团队在选择CI工具时,直接划定了4款目前主流的工具,即TravisCI、CircleCI、GitLabCI和Jenkins,并对4款工具进行了详细对比。其中TravisCI和CircleCI在Github开源项目中应用广泛,但不支持私有化部署,不适合企业实践;GitLabCI可以与代码仓库无缝集成,天然支持GitOps,但目前整体生态还不成熟。需要制作自己的构建器镜像,并与Gitlab深度绑定;Jenkins作为传统的CI工具,有着比较完善的社区和生态。Jenkins2.0版本提供了Pipelineascode的特性,可以将CI流程纳入版本管理,支持GitOps。此外,Jenkins社区还制作了kubernetes-plugin等插件,可以将流水线的执行从传统的物理机转移到容器中,依托Kubernetes强大的调度能力,实现资源的动态调度和编排。基于以上原因,网易轻舟最终选择了Jenkins,但传统的Jenkins在系统运维、资源管理、使用方式等方面存在诸多问题。比如Jenkins的主从架构就比较经典,但是因为诞生的比较早,所以所有的配置和数据都是基于文件存储的(存储在Jenkins主节点的home目录下)。修改时会先更新内存,再异步写入。当底层文件更新时,Jenkins不会自动重新加载更新后的数据,难以实现高可用;Jenkinsmaster实例独占文件目录,不同的Jenkins实例不能共享底层存储。.....因此,网易技术团队希望在传统Jenkins版本上做出如下改进:结合Docker/Kubernetes云原生技术栈,解决传统Jenkins使用痛点;通过将行业最佳实践固化到产品中,解决易用性问题,降低用户使用门槛,提高访问效率;重新设计上层流水线模型,提供更强大的流水线调度能力;自研流水线底层组件,替代Jenkins插件,提供更灵活的扩展能力,方便与公司内部系统集成;提供丰富的企业级功能(如鉴权、鉴权、审计、告警、通知等)CI工具,如:代码仓库:支持Git/SVN,可适配大部分代码托管平台,对比如Gitlab,支持从GitlabWebhookpayload中提取各种参数;扫码:集成SonarQube,支持所有主流编程语言;单元测试:集成Java常用的Jacoco工具,方便用户在运行单元测试时生成相应的UT和覆盖率报告;代码编译:Java支持Maven/Gradle,内置Nexus私服,方便内网代理;Node.js支持Npm;Golang支持gomod缓存加速;镜像构建:支持DockeroutDocker和Kaniko两种构建方式,用户可以根据自己的需要选择使用;镜像仓库:集成Harbor,支持Harborwebhook,集成Harbor的镜像扫描和镜像复制功能;容器部署:支持kubectl原生部署、升级、升级青州CI/CD应用部署等部署方式;自动化测试:支持Java语言常用的TestNG,集成网易内部GoAPI测试平台,支持在pipeline中运行指定接口测试集,执行时输出测试报告;报警通知:集成邮件发送、短信报警、网易POPO等多种通知方式;据了解,国内大部分公司在1.0时代还在使用Jenkins,很多人还在使用JenkinsUI的配置方式,没有使用Jenkins2.0提供的Pipelineascode功能,在使用场景上严重依赖一些自定义脚本.这些脚本通常是QA同学预先在机器上预设好的。一旦机器宕机或出现故障,迁移的成本也很高。相比之下,选择更新版本的Jenkins,使用更前沿的功能,及时补充其他CI工具,往往会有更好的效果。3、网易CI实践的分支管理与协作流程。所有CI实践的来源必须是代码更改。良好的代码分支管理和版本变更规范是良好CI实践的先决条件。网易轻舟基于GitFlow进行代码管理和协作流程。主要阶段包括预发布验证、测试验证和代码审查、集成和验证。网易青州CI实践中主要分支有devlop和master,辅助分支有feature/*、release/v1.x.0、hotfix/v1.x.1。develop:集成分支,不允许提交/推送,只允许从feature/*或hotfix/v*分支合并;master:版本分支,不允许commit/push,只允许从release/v*orhotfix/v*branches的合并,每次接受合并都要在上面创建TAG;feature/*:feature分支,派生自develop,不允许从develop合并,合并到develop后删除;release/v1.x.0:releaseupdateverification分支来源于master。派生时根据master分支的TAG标记和第二个版本号命名。不允许commit/push,只允许从develop合并,合并到master后删除;hotfix/v1.x.1:补丁更新验证分支,派生自master,派生时根据master分支TAG进行标记,增加第三个版本号名称。允许commit/push,禁止从develop合并,合并到master再合并到develop,合并后删除。另外,对于TAG,网易轻舟也有一些具体要求:v1.x.0:release版本更新,release/v*分支合并到master,创建在master分支上;v1.x.1:补丁更新,hotfix/v*分支合并到master后,在master分支上创建;另外,为了保证合并后的代码质量,我们也制定了相应的代码审查原则;任何代码改动必须提交给mr,不允许直接push到dev/master等受保护的分支;任何更改都必须经过至少两个其他团队成员的审查,然后才能合并到develop和hotfix分支中,只有被团队接受的代码才是团队的代码。网易CI流程的具体步骤通常一个持续集成流程会包括以下几个步骤:代码checkout,单元测试,静态扫描,编译,构建,镜像扫描,测试部署。一个好的持续集成流程一定是以质量为导向的,所以在实践中,除了工具和流程,还需要做好代码质量相关的工作。对于大多数团队,CI可能由QA维护。所以在实际使用过程中,线下环境的CI会和线上分开。线上通常更注重持续部署,主要是QA、PE等角色。负责,简化流程,更加注重运维规范和线上审核。代码检出:通常需要在管道中配置代码源、sshkey、代码分支等信息。为了优化代码校验的性能,CI/CD管道将使用git浅拷贝来加速整个过程。静态扫描:这是管道的关键部分。运行时,扫描的数据会上传到用户预先配置的SonarQube平台,通过SonarQube的QualityGate检查质量卡。除了QualityGate,用户还可以自定义一些流水线特有的卡点规则,并配置通过邮件、网易popo等方式通知执行结果。单元测试:这是CI过程的重要组成部分。CI/CD流水线集成了常用的Jacoco工具,方便用户在运行单元测试时生成相应的UT和覆盖率报告。报告内容可在流水线执行详情查看页面,并支持用户设置单元测试通过率和UT覆盖率卡点,并发送相应的邮件通知。代码编译:支持大部分主流编程语言,如Java、Node.js、C++、Golang等,并针对各种语言做了相应的编译加速方案,支持Maven、Gradle、C++、Gomod构建缓存.镜像构建:支持DockeroutofDocker、Kaniko等构建方式。同时整合了网易青州港湾,集成了港湾的镜像扫描功能。支持在流水线运行过程中进行镜像扫描,查看镜像安全报告,支持安全项。卡点和邮件通知等功能。集成测试:CI/CD流水线与网易内部自动化测试平台GoAPI集成。用户可以在平台侧预先配置相应的接口执行集,然后选择相应的执行集在流水线中执行,并在流水线详情页面查看执行集的通过率,支持刷卡积分和邮件通知。Pipelinetrigger:各种触发器,如定时触发器、PollSCM、Webhook和pipeline系列触发器,其中Webhook还额外提供了对Gitlab和Harbor的支持,支持从Gtilab和Harbor的payload中提取相关参数,并在pipeline阶段使用在。
