1. 前言

2016年, 我们维护的 iOS推流播放融合SDK KSYLive_iOS 在github上发布了40多个版本, 平均两周发布一个新版本,

经历了最初痛苦的全手动版本构建和维护, 到后来慢慢搭建起来的持续集成系统, 在这里简要的总结一下这个搭建过程中的一些实践经验.

1.1 持续集成的作用

持续集成系统主要在如下两个环节提供服务:

  • 开发阶段(build), 开发人员提交代码后, 在服务端能够自动对提交的版本进行构建和测试, 保证提交能够编译,并自动测试通过的代码可以不给同事添麻烦,提高工作效率. 对代码审查的人来说,能减轻不少负担.
  • 发布阶段(release), 当阶段性完成了开发任务后, 通过tag触发版本发布, 能够减少手动进行版本构建的工作, 并减少人工引入的疏忽和错误.

后面讲到每个工程组件的持续集成时,都需要针对这样两个环节分别说明.

1.2 持续集成的工具

持续集成可选的工具比较多, 比如Jenkins, Travis CI等等.由于我们内部的版本管理工具是gitlab[http://gitlab.com], gitlab作为代码管理仓库, 和code review的工具. 而gitlab最近的版本中直接提供了CI的server, 可以非常方便的用起来. 权限管理, 代码提交触发等都变得非常自然, 我们大部分的CI工作都是通过gitlabCI进行的.

 
gitlab ci Architecture
  • gitlab ci 的 server直接集成在了gitlab server中, 每当我们提交代码时, ci server就会生成一个构建任务, 在gitlab的页面上可以很直观的追踪到任务的执行情况和执行结果.
  • gitlab ci runner 是一个独立的应用程序, 跑在worker设备上. 他负责从ci server 领取一个任务并完成它.

gitlab ci的基本使用方法可以参考gitlab 自己的指南, 或者简书上搜搜中文版的图文教程.

2. 视频云SDK 持续集成实施

KSYLive_iOS 是一个提供了在手机上直播推流和播放的SDK, 在开发过程中, 我们有不同的同事分别维护demo代码,推流代码,播放内核代码和底层公用部分代码, 只是最后编译打包为一个完善的SDK提供给客户使用. 因此开发过程中涉及到每个模块自身的编译测试,以及多个模块之间的版本同步更新的问题.

2.1 SDK 项目结构

SDK arch

上图中,每个框都是一个gitlab上的代码仓库,存放着代码或编译后的二进制文件

  • codecs: 其实是多个开源项目的仓库, 包括aac,264等音视频的编码器, 作为FFMpeg的依赖项.
  • FFMpeg: 为推流和播放依赖的多媒体框架
  • libyuv: 对图像进行颜色空间转换的工具库
  • KSYCommon: 项目中推流和播放的公共代码
  • GPUImage: GPU图像处理的框架
  • KSYStreamer: 推流相关代码
  • KSYPlayer: 播放相关代码
  • KSYGPUFilter: 美颜滤镜相关代码
  • libksylivedep: 所有代码编译后的二进制库文件和头文件
  • KSYLive_iOS: 最终对外发布的SDK库和demo

整个持续集成系统要保证的是KSYLive_iOS中demo能够顺利build 通过和功能正常.

持续集成系统的中枢则是 libksylivedep, KSYLive_iOS中的SDK本质上是将libksylivedep中的静态库进行组合得到的, 其他项目的git仓库中都只存放代码.

libksylivedep 主要是因为有一些第三方库的构建过程比较耗时,且改动频率不高, 将其构建的结果直接存放到libksylivedep中, 能够起到节约时间的作用. 并且因为有libksylivedep的隔离, 每个项目的持续集成任务更加清晰,减少了项目依赖带来的复杂性.

2.2 SDK 持续集成结构

整个SDK的持续集成简单来说就是给以上的每个项目都添加CI配置. 这里一共有4种CI任务

  • 代码仓库的build任务

    每当开发人员对SDK代码进行了修改, 提交代码到gitlab之后, 都会触发此任务. 任务内容主要是保证SDK代码能够顺利编译出对应的静态库文件, 并保证sdk更新到KSYLive_iOS中去之后,demo能够也是正常工作的.

    这里有一些代码库的是没有依赖项的, build任务比较简单, 可以直接完成.

    而有的代码库则需要依赖其他库, 这个依赖关系主要是通过libksylivedep来解决的.
  • 代码仓库的release任务

    当每个迭代完成的时候, 一个代码仓库的所有改动汇总后打上对应版本号的tag, 可以发起一次release任务. release任务是在build通过的前提下, 将build的结果, 发布到libksylivedep中. 在libksylivedep的master分支的基础上, 更新本项目对应的静态库和头文件, 发起合并请求.
  • KSYLive_iOS 的build任务

    KSYLive_iOS 的build任务主要是用于检查demo代码修改和SDK静态库更新的正确性.
  • KSYLive_iOS 的release任务

    当完成一个迭代, 对应版本通过了QA的测试时, 可以出发release任务, 将SDK和demo更新到对外的github上.

3. 总结

视频云SDK iOS持续集成项目在开发阶段能够保证每次代码提交的质量, 能够提前发现自己引入的破坏开发环境的"坏"提交, 对提高开发效率有比较大的帮助. 在版本发布阶段, 可以将大量重复的操作自动完成,将发布环境和开发环境分离, 减少人为发布引入的不确定性问题。

在视频云 iOS SDK这个依赖关系比较复杂的项目中, 通过引入预编译二进制库存放的仓库, 减少了项目的构建时间, 隔离了依赖关系。

作者金山视频云

视频云SDK iOS持续集成项目实践的更多相关文章

  1. CI Weekly #21 | iOS 持续集成快速入门指南

    搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...

  2. iOS 持续集成

    iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 ...

  3. 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境

    使用jenkins+calabash+cocoapods搭建ios持续集成环境 持续集成 持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践. 在持续集成 ...

  4. 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP

    什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  5. fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有

    一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...

  6. fir.im weekly - 「 持续集成 」实践教程合集

    我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集 ...

  7. 使用VSTS/TFS搭建iOS持续集成环境

    TFS 自2015版开始支持跨平台的持续集成环境,通过提供开源的build agent为 Windows / linux / macOS 提供了统一的持续集成环境管理能力.这篇文章给大家介绍一下如何使 ...

  8. 基于 CODING 的 Spring Boot 持续集成项目

    本文作者:CODING 用户 - 廖石荣 持续集成的概念 持续集成(Continuous integration,简称 CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少 ...

  9. Apache DolphinScheduler 的持续集成方向实践

    今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...

随机推荐

  1. C++11 标准新特性: 右值引用与转移语义

    文章出处:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rvalue Referene) ...

  2. VC++下编译 程序“减肥”

    在vc6 和 vs 2008下 编译 以下代码,不更改任何编译设置(vc6  40k , s2008 7k). 一.vc6下,Release 模式 编译处理. 1.去掉不必要的 链接库  工程(Pro ...

  3. TCP/IP协议栈 --- IP路由

    IP路由:当一个IP包在主机发送出去或者在网络当中时,是怎么选择路径到达目的主机的呢? 一般情况下, 如果说源主机和目的主机在同一个网络中的话,那个数据报可以直接到达目的主机而不经过路由器,下面可以试 ...

  4. 验证 Swarm 数据持久性 - 每天5分钟玩转 Docker 容器技术(104)

    上一节我们成功将 Rex-Ray Volume 挂载到了 Service.本节验证 Failover 时,数据不会丢失. Scale Up 增加一个副本: docker service update ...

  5. mysql--二进制日志(bin-log)三种格式介绍及分析

    一.Mysql binlog日志有三种格式,分别为ROW.Statement以及MiXED.Row LevelBinary Log会记录成[每一行数据被修改的形式],然后在Slave端再对相同的数据进 ...

  6. Centos7 下安装Docke

    为什么 要用centos7呢. 现在哪个企业用的是centos7呀.不都是老版本么. 对咱们是新技术.所以只有新系统才可以用.因为docker要求服务CentOS6以上,kernel 版本必须2.6. ...

  7. 浅谈php的优缺点

    一.优点 1. 跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux /Apache/Mysql/PHP)或者FA ...

  8. JavaScript参考

    要查看英语原文,请勾选"英语"复选框.也可将鼠标指针移到文本上,在弹出窗口中显示英语原文. 翻译 英语 JavaScript 语言参考 JavaScript 是一种可嵌入网页和其他 ...

  9. win10下Python3.6安装、配置以及pip安装包教程

    0.目录 1.前言 2.安装python 3.使用pip下载.安装包 3.1 安装Scrapy 3.2 安装PyQt 3.3 同时安装多个包 3.4 pip的常用命令 1.前言 之前在电脑上安装了py ...

  10. css3的动画特效--元素旋转

    开发中,视觉要你实现一个元素的旋转问题,比如说如下图所示: 思路:首先动画动效肯定离不开anmimation动画. 和transition动画一样,animation动画也是CSS3动画的一种,这类动 ...