视频云SDK iOS持续集成项目实践
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 的 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 项目结构
上图中,每个框都是一个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持续集成项目实践的更多相关文章
- CI Weekly #21 | iOS 持续集成快速入门指南
搭建 iOS 持续集成环境要多久?每个 iOSer 都有不同的答案.这次我们整理了 flow.ci 的 iOS 持续集成的相关文档和最佳实践,希望帮你更快地完成构建.更新文档见: flow.ci iO ...
- iOS 持续集成
iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 ...
- 使用Jenkins+Calabash+Cocoapods搭建iOS持续集成环境
使用jenkins+calabash+cocoapods搭建ios持续集成环境 持续集成 持续集成到底是什么呢?依据敏捷大师Martin Fowler的定义: 持续集成是一种软件开发实践. 在持续集成 ...
- 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP
什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有
一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...
- fir.im weekly - 「 持续集成 」实践教程合集
我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集 ...
- 使用VSTS/TFS搭建iOS持续集成环境
TFS 自2015版开始支持跨平台的持续集成环境,通过提供开源的build agent为 Windows / linux / macOS 提供了统一的持续集成环境管理能力.这篇文章给大家介绍一下如何使 ...
- 基于 CODING 的 Spring Boot 持续集成项目
本文作者:CODING 用户 - 廖石荣 持续集成的概念 持续集成(Continuous integration,简称 CI)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少 ...
- Apache DolphinScheduler 的持续集成方向实践
今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...
随机推荐
- web兼容性测试相关知识
一.客户端兼容性 1.浏览器的兼容性测试 a.内核角度 Tridnt内核:代表作IE.腾讯.遨游.世界之窗等 Gecko内核:代表作Firefox webkit内核:代表作Safari.Chrome ...
- 外观模式(Facade)
外观模式(Facade) 外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合 ...
- oracle中 常用的 join on 相关和 集合运算的总结
sql常用联合查询的 join on . left join(左连接) . right join (右连接).inner join (等值连接)以及常用的集合运算有:union.unionall.mi ...
- JavaWeb 之文件的上传下载
又到了每周更新博客的时候了,每看到自己发布的随笔阅读量上涨的时候就特别开心,我也会尽自己的努力提高自己的水平,总结出通俗易读的学习笔记,还望大家能多多支持!!! ------------------- ...
- OBS源码解析(1)main函数
int main(int argc, char *argv[]){#ifndef _WIN32 signal(SIGPIPE, SIG_IGN);#endif #ifdef _WIN32 /*Open ...
- 【Java入门提高篇】Day9 Java内部类——静态内部类
今天来说说Java中的最后一种内部类--静态内部类 所谓的静态内部类,自然就是用static修饰的内部类,那用static修饰过后的内部类,跟一般的内部类相比有什么特别的地方呢? 首先,它是静态的,这 ...
- HDU 1908 Double Queue(set)
Problem Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in B ...
- C++、Objective-C 混合编程
在XCODE中想使用C++代码,你须要把文件的扩展名从.m改成.mm.这样才会启动g++编译器. 我们来看个測试代码: [java] view plaincopy class TestC { priv ...
- 三、spring cloud 服务提供与调用
如何使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用. 案例中有三个角色:服务注册中心.服务提供者.服务消费者,eureka单机版启动既可,流程是首先启动注册中心,服务 ...
- 自学Python5.3-内置模块(1)
内置模块(1)内置模块是Python自带的功能,在使用内置模块相应的功能时,需要 先导入 再 使用 1.OS模块 用于提供系统级别的操作: os.getcwd() 获取当前工作目录,即 ...