大型企业 CI 平台建设和实施分
         享

            腾讯 陈小光
A genda

现状 & 挑战
实践分享 - 平台建设
实践分享 - 实施推广
总结
Q&A
   7 年研发管理和优化经验,跨越银行、互联网等行业
   目前腾讯持续交付、持续集成实践者
   爱好广泛包括且不限敏捷实践,音乐,数学
   微博 @   v陈小光v
   Mail go2cxg@vip.qq.com
现状 & 挑战 - 现状
工程师 > 500
同时进行的项目 > 20
开发语言覆盖 c,c+ + ,php,j va,以及手机平台等
                    a
项目之间依赖复杂,涉及到多层循环
现状 & 挑战 - 挑战 - 平台

同时存在 CI 平台五套,各自为政,平台不一,资源浪费,是否要整合?

当项目代码量超过百万时,如何提升构建效率?如何管理复杂构建依赖?

CI 集群 30 台,如何能及时有效的更新工具和软件以及配置到相关环境里面?

如何保证从开发 -> 测试 -> 上线三个步骤的源码和二进制包版本一致性?

如果处理来自不同团队的对 CI 平台的需求?
现状 & 挑战 - 挑战 - 实施

B U 老大们对 CI 理解不一,如何获取他们的支持?


开发对持续构建的失败漠不关心怎么办?


如何让不到五人的 CI 团队,高满意度的支持大于五百人团队实施
CI ?


如何提高开发编写单元测试的积极性?


底层代码随意变更提交,影响到上层代码怎么办?
解决方案 - 平台 - 设计思想

平台设计思想 :
 统一平台和运维,减少维护成本和机器资源,成果共享
 环境保证绝对权威,跟线上、测试、开发保持一致
 提升易用性,减少用户学习成本
 统一测试和上线的包出口

工具尽量使用开源
 Jenkins
 Subversion
 T estlink
解决方案 - 平台 - 拓扑结构
解决方案 - 平台 - 高效构建系统

   基于开源 scons 自研的一套分布式统一构建系统
    支持 c+ + ,j va
              a ,probuf,swig 等多种语言
    代码变更后可以自动分析依赖关系
    集构建,测试,静态代码检查,高亮错误显示等功能
    支持增量和分布式编译和测试

   解决了构建效率和依赖管理问题

其他提升构建速度方法 :
   使用 tmpfs,I O 效率基本为 0 ,需要大内存机器
   使用 ca 机制,比如 cca
         che          che
   分布式编译,比如 distcc
   源码分层 : 抽离基础库代码专人维护 , 包括 common 和 thirdparty
解决方案 - 构建分级

构建类型
NightlyB uild: 夜间,全量测试和构建,重建 cache

CheckI nB uild:CheckI nSvn ,增量 ut,增量构建,基于
cache

HandleB uild: 按需,全量构建和测试,为了打包
解决方案 - 平台 - 统一接入脚本

概述: 统一某种类型的项目或代码的公共动作 ( 比如编译 , 执行 ut, 静态检查 , 包上传等 )
到一个脚本或工具里面,用户只需要输入路径配置即可完成 CI 的配置,减少用户学习和
使用成本。

C+ + :
  写好脚本 ci_exec compil
                    e_dir= $dir1 ut_dir= $dir2 s_dir= $dir3
                                               t

Java( ant 为例 ) :
解决方案 - 平台 - 统一环境管理 -puppet 管理环境

使用 puppet做构建环境统一管理更新                   管理如下配置:
                                       Hosts配置
                         Puppet        构建脚本
Subversion               master        构建软件
                                       Sla 初始化脚本
                                           ve

      CheckIn
                                       Sla 上 puppet初始化用 rpm 包实现。
                                          ve
                Puppet    Puppet
                                   …
WorkSpace       slave1    slave1
                                       亦可通过 CI 本身功能来管理环境
                                       Jenkins提供多 Sla 配置功能
                                                     ve
解决方案 - 平台 - 统一环境管理 -Jenkins 管理环节

通过 Jenkins 本身管理构建环境, slave 正在以后即可做。

                         Jenkins
Subversion               master
                                        通过 Jenkins 多 S lave配置完成:
                                        规划好 SVN 里面目录 Conf bin 等
     CheckIn                            在 Sla 机器上配置 bin 目录到 $PAT H
                                              ve

               Jenkins    Jenkins
                                    …
                slave1    slave1
 修改工作区




优点:
   使用方便,测试通过以后直接提交到 SVN 即
   可更新
   Jenkins直接辐射到各个 Sla ,更新方便
                      ve
缺点:
   没有整体视图
解决方案 - 平台 -presubm 方案 -client 模式
                  it


      Subversion      CheckSvnService

                    Check.py
                    检查 : 提交的注释里面是否有指定加密串
                    通知 : 通过对应人


                     Upload.py :
                     1 . 检查是否被模块 owner Codereview 且被 Approved
                     2. 在内存文件系统 tmpfs中快速 run 编译和 ut
   D ev 工作区          3. 做 CodeStyle 检查以及静态检查
                     4. 成功则自动提交 , 在注视里面加标记
                     5. 失败给予提示
 Upload.py 专用提交脚本    upl oad.py –i 33896 –I 后为 codereview id
                     目的:把问题扼杀在提交到代码库之前,减少影
                     响
两种 Presubm 模式 -Client/S erver 模式
          it
 验证、提交

  Presubmit服务器        Source
                      Control      CheckSvnService
                      System
                                Check.py
                                检查 : 提交的注释是否有指定加密串
                                通知 : 通过对应人




   D ev 工作区
 presubmit.py 脚本
 检查、信息搜集、打 diff、上传
解决方案 - 平台 - 包服务器媒介

                      包服务器                包服务器两分支
                                          T est: 用来存放从 CI 发过来的包,待测试
              Test              Rel       Rel: 用来存放从已测的包,待发布
                                          包服务器跟电子流串通
                          3
                                      4
       1              2


 CI                  Test                 IDC


 1   CI 里面执行手工打包,到包服务器 test分支

 2   测试从包服务器取包部署测试测试环境

 3   得到测试通过信号后,被测通过的包自动转到 rel分支

 4   发布系统从 rel分支拉取测通过的包上线
解决方案 - 平台 - 报表平台
jenkins 构建的报表平台
保存如下数据
构建成功率
构建时长
测试覆盖率
接入率等




 有开源插件可支持数据报表展现
 !
解决方案 - 实施 - 先试点

试点项目选择 :
交付压力小的重点项目
成立联合虚拟项目组运作
做好评估 : 缺陷率 , 代码质量等


试点目标目标 :
摸索经验
平台建立
树立标杆
建立影响
透明效果
取得重视
解决方案 - 实施 - 制度化

接口人制度 :
1 . 需要实施 CI 部门指定接口人
2. 每个部门对应 CI 实施责任人
3. 对 CI 实施接口人进行 training

CI 平台需求管理流程 :
1 . 把 CI 平台当做“产品”来做
2. 明确需求管理流程
3. 排期实现,可视化进度

沉淀制度
1 . 把 CI 实施框架和 FAQ 沉淀到 wiki
2. 每周专人值班辅助接口人
3. 常见问题沉淀到 wiki

合作,而非推广
解决方案 - 实施 - 可视化
周报 : 部门周报
月报 : 整个事业部周报
显示器 : 质量情况 , 放置门口
总结

平台
 总体架构:统一平台,包服务器,统一出口
 构建平台:构建平台,管理依赖,支持分布,增量编译
 公用脚本:封装复杂操作,减少 dev 学习和使用成本
 环境管理: puppet ,利用 CI 平台管理构建环境
 Presubmit 机制: presubmit , codereview 确保质量



实施
 试点先行:摸索经验,建立平台,树立标杆,扩大影响
 推广策略:沉淀 wiki ,职责明确,值班制度,合作态度
 报告和奖励机制:数据可视化
Q&A

Scrum gathering 2012 Shanghai_精益与持续改进分会场演讲话题: 大型企业ci平台建设和实施分享(陈小光)

  • 1.
  • 2.
    A genda 现状 &挑战 实践分享 - 平台建设 实践分享 - 实施推广 总结 Q&A
  • 3.
    7 年研发管理和优化经验,跨越银行、互联网等行业  目前腾讯持续交付、持续集成实践者  爱好广泛包括且不限敏捷实践,音乐,数学  微博 @ v陈小光v  Mail go2cxg@vip.qq.com
  • 4.
    现状 & 挑战- 现状 工程师 > 500 同时进行的项目 > 20 开发语言覆盖 c,c+ + ,php,j va,以及手机平台等 a 项目之间依赖复杂,涉及到多层循环
  • 5.
    现状 & 挑战- 挑战 - 平台 同时存在 CI 平台五套,各自为政,平台不一,资源浪费,是否要整合? 当项目代码量超过百万时,如何提升构建效率?如何管理复杂构建依赖? CI 集群 30 台,如何能及时有效的更新工具和软件以及配置到相关环境里面? 如何保证从开发 -> 测试 -> 上线三个步骤的源码和二进制包版本一致性? 如果处理来自不同团队的对 CI 平台的需求?
  • 6.
    现状 & 挑战- 挑战 - 实施 B U 老大们对 CI 理解不一,如何获取他们的支持? 开发对持续构建的失败漠不关心怎么办? 如何让不到五人的 CI 团队,高满意度的支持大于五百人团队实施 CI ? 如何提高开发编写单元测试的积极性? 底层代码随意变更提交,影响到上层代码怎么办?
  • 7.
    解决方案 - 平台- 设计思想 平台设计思想 : 统一平台和运维,减少维护成本和机器资源,成果共享 环境保证绝对权威,跟线上、测试、开发保持一致 提升易用性,减少用户学习成本 统一测试和上线的包出口 工具尽量使用开源 Jenkins Subversion T estlink
  • 8.
    解决方案 - 平台- 拓扑结构
  • 9.
    解决方案 - 平台- 高效构建系统  基于开源 scons 自研的一套分布式统一构建系统 支持 c+ + ,j va a ,probuf,swig 等多种语言 代码变更后可以自动分析依赖关系 集构建,测试,静态代码检查,高亮错误显示等功能 支持增量和分布式编译和测试  解决了构建效率和依赖管理问题 其他提升构建速度方法 :  使用 tmpfs,I O 效率基本为 0 ,需要大内存机器  使用 ca 机制,比如 cca che che  分布式编译,比如 distcc  源码分层 : 抽离基础库代码专人维护 , 包括 common 和 thirdparty
  • 10.
    解决方案 - 构建分级 构建类型 NightlyBuild: 夜间,全量测试和构建,重建 cache CheckI nB uild:CheckI nSvn ,增量 ut,增量构建,基于 cache HandleB uild: 按需,全量构建和测试,为了打包
  • 11.
    解决方案 - 平台- 统一接入脚本 概述: 统一某种类型的项目或代码的公共动作 ( 比如编译 , 执行 ut, 静态检查 , 包上传等 ) 到一个脚本或工具里面,用户只需要输入路径配置即可完成 CI 的配置,减少用户学习和 使用成本。 C+ + : 写好脚本 ci_exec compil e_dir= $dir1 ut_dir= $dir2 s_dir= $dir3 t Java( ant 为例 ) :
  • 12.
    解决方案 - 平台- 统一环境管理 -puppet 管理环境 使用 puppet做构建环境统一管理更新 管理如下配置: Hosts配置 Puppet 构建脚本 Subversion master 构建软件 Sla 初始化脚本 ve CheckIn Sla 上 puppet初始化用 rpm 包实现。 ve Puppet Puppet … WorkSpace slave1 slave1 亦可通过 CI 本身功能来管理环境 Jenkins提供多 Sla 配置功能 ve
  • 13.
    解决方案 - 平台- 统一环境管理 -Jenkins 管理环节 通过 Jenkins 本身管理构建环境, slave 正在以后即可做。 Jenkins Subversion master 通过 Jenkins 多 S lave配置完成: 规划好 SVN 里面目录 Conf bin 等 CheckIn 在 Sla 机器上配置 bin 目录到 $PAT H ve Jenkins Jenkins … slave1 slave1 修改工作区 优点: 使用方便,测试通过以后直接提交到 SVN 即 可更新 Jenkins直接辐射到各个 Sla ,更新方便 ve 缺点: 没有整体视图
  • 14.
    解决方案 - 平台-presubm 方案 -client 模式 it Subversion CheckSvnService Check.py 检查 : 提交的注释里面是否有指定加密串 通知 : 通过对应人 Upload.py : 1 . 检查是否被模块 owner Codereview 且被 Approved 2. 在内存文件系统 tmpfs中快速 run 编译和 ut D ev 工作区 3. 做 CodeStyle 检查以及静态检查 4. 成功则自动提交 , 在注视里面加标记 5. 失败给予提示 Upload.py 专用提交脚本 upl oad.py –i 33896 –I 后为 codereview id 目的:把问题扼杀在提交到代码库之前,减少影 响
  • 15.
    两种 Presubm 模式-Client/S erver 模式 it 验证、提交 Presubmit服务器 Source Control CheckSvnService System Check.py 检查 : 提交的注释是否有指定加密串 通知 : 通过对应人 D ev 工作区 presubmit.py 脚本 检查、信息搜集、打 diff、上传
  • 16.
    解决方案 - 平台- 包服务器媒介 包服务器 包服务器两分支 T est: 用来存放从 CI 发过来的包,待测试 Test Rel Rel: 用来存放从已测的包,待发布 包服务器跟电子流串通 3 4 1 2 CI Test IDC 1 CI 里面执行手工打包,到包服务器 test分支 2 测试从包服务器取包部署测试测试环境 3 得到测试通过信号后,被测通过的包自动转到 rel分支 4 发布系统从 rel分支拉取测通过的包上线
  • 17.
    解决方案 - 平台- 报表平台 jenkins 构建的报表平台 保存如下数据 构建成功率 构建时长 测试覆盖率 接入率等 有开源插件可支持数据报表展现 !
  • 18.
    解决方案 - 实施- 先试点 试点项目选择 : 交付压力小的重点项目 成立联合虚拟项目组运作 做好评估 : 缺陷率 , 代码质量等 试点目标目标 : 摸索经验 平台建立 树立标杆 建立影响 透明效果 取得重视
  • 19.
    解决方案 - 实施- 制度化 接口人制度 : 1 . 需要实施 CI 部门指定接口人 2. 每个部门对应 CI 实施责任人 3. 对 CI 实施接口人进行 training CI 平台需求管理流程 : 1 . 把 CI 平台当做“产品”来做 2. 明确需求管理流程 3. 排期实现,可视化进度 沉淀制度 1 . 把 CI 实施框架和 FAQ 沉淀到 wiki 2. 每周专人值班辅助接口人 3. 常见问题沉淀到 wiki 合作,而非推广
  • 20.
    解决方案 - 实施- 可视化 周报 : 部门周报 月报 : 整个事业部周报 显示器 : 质量情况 , 放置门口
  • 21.
    总结 平台 总体架构:统一平台,包服务器,统一出口 构建平台:构建平台,管理依赖,支持分布,增量编译 公用脚本:封装复杂操作,减少 dev 学习和使用成本 环境管理: puppet ,利用 CI 平台管理构建环境 Presubmit 机制: presubmit , codereview 确保质量 实施 试点先行:摸索经验,建立平台,树立标杆,扩大影响 推广策略:沉淀 wiki ,职责明确,值班制度,合作态度 报告和奖励机制:数据可视化
  • 22.