背景
- Cronet是chromium项目的网络协议栈,其编译产出环境需要Ubuntu系统加Chromium的编译工具。
- 公司内部无法提供满足需求的编译发布服务,因此只能自建编译产出系统。
- 团队已有的编译系统只能发布Cronet Android,随着iOS版开始接入产品,我们需要支持Cronet iOS的编译发布。
- 已有的编译发布流程如下:
注:icode为公司的代码托管平台,Agile为公司的持续集成及发布平台,这里不做详细描述。
其中,Agile可以允许用户自定义编译脚本,因此我们用python在团队自运维的机器上做了编译服务,当需要编译的时候由agile触发自定义脚本,自定义脚本再远程触发我们自建编译服务。待编译完成后再回收编译产物。
技术难点
- 需要做到一次代码提交同时触发双端(Android & iOS)编译发布,并且经过调研,公司内部也没有产品线做双端同步编译发布,这应该是首创。
- IDC内无Mac编译机,iOS编译发布需要自建Mac编译环境,IDC向办公区网络发起网络请求时,存在端口隔离,无法直接连通。
解决方案
- 在现有编译server基础上,新增iOS编译流程控制,包括触发iOS编译及回收iOS产物。
- 参考其他iOS端研发团队做法,使用公司提供的jenkins平台对iOS编译机进行调度,解决IDC与自建server无法直接连通问题。
如升级后的编译server,编译服务新增了iOS的编译控制。
对于技术难点2,为了解决办公区mac端口隔离,我们使用了jenkins,公司内部也提供了jenkins服务。jenkins的网络模式是客户机(mac编译机)启动jenkins客户端主动向服务端发起一个长连接。因此避免了端口隔离问题。
具体代码
这里仅列出新增的iOS编译控制相关代码
其中涉及到了python的jenkins库,jenkins在Python中的api可参见:python-jenkins
触发iOS编译
|
|
回收iOS编译产物
由于Android 和 iOS编译不在同一台机器上,最终我们需要将产物回收合并到一起,因此需要通过jenkins平台拉取iOS的编译产物。
总体收益
- 该方案实现了android和iOS双平台的集成及发布,整个编译发布过程对组内开发者是透明的,开发者只需进行icode提交,及在agile上回收编译产物即可,操作体验上与之前无diff。
- 该方案实现了android和iOS并行编译发布,相对于简单的agile串行编译,时间由T(Android) + T(iOS) 优化为 Max(T(Android), T(iOS))。
- 方案注意到了兼容性和功能解耦,通过开关控制可做到android编译、android+iOS编译这些组合,方便一些特殊编译发布需求或者回滚,如果开发者提交了iOS功能之前的代码,也不会造成编译失败。