iOS持续集成:Coding + flow.ci +fir.im

字数 2870阅读 181

前言
如今的App开发,主要注重两点:效率和质量。如何在信息高速发展的今天,快速更新迭代一个产品,满足市场的需求,同时又保证产品质量。这是很多产品经理的需要面对的问题。解决上述问题,这就需要我们提高开发效率,引入自动化操作。
本文接下来主要讨论 Coding + flow.ci +fir.im 持续集成,解放开发-调试-发布的繁琐步骤,提高开发效率。

目录
1.为什么我们需要持续集成
2.完整的持续集成流程
3.代码托管——Coding
4.代码管理——SourceTree
5.自动化打包以及分发工具——flow
6.flow工作流配置(打包完成自动化上传 fir平台,推送到钉钉)
7.未来还有待完善的工作。

一. 为什么我们需要持续集成
现有阶段,我们其实已经在实践持续集成:使用SVN或者Git在管理我们团队代码,协同开发。然而,我们很多时候仅仅停留在当前阶段。后续的版本构建、代码编译、版本分发、版本部署、版本迭代测试等。都需要我们人工操作。而且每次上一个版本,就需要重复操作,苦不堪言。如果我们引入了持续集成,我们就可以通过自动化等手段高频率地去获取产品反馈并响应反馈的过程。总的的来说,采用持续集成,我们可以:

(1) 可以缩减开发周期,快速迭代版本。
每个版本开始都会估算好开发周期,但是总会因为各种事情而延期。这其中包括了一些客观因素。由于产品线增多,迭代速度越来越快,给测试带来的压力也越来越大。如果测试都在开发完全开发完成之后再来测试,那就会影响很长一段时间。这时候由于集成晚就会严重拖慢项目节奏。如果能尽早的持续集成,尽快进调试-测试环节,就可以尽早的暴露出问题,提早解决,尽量在规定时间内完成任务。

(2) 自动化流水线操作带来的高效
其实打包对于开发人员来说是一件很耗时,而且没有很大技术含量的工作。如果开发人员一多,相互改的代码冲突的几率就越大,加上没有产线管理机制,代码仓库的代码质量很难保证。团队里面会花一些时间来解决冲突,解决完了冲突还需要自己手动打包。这个时候如果证书又不对,又要耽误好长时间。这些时间其实可以用持续集成来节约起来的。一天两天看着不多,但是按照年的单位来计算,可以节约很多时间!

(3) 随时可部署
有了持续集成以后,我们可以以天为单位来打包,这种高频率的集成带来的最大的优点就是可以随时部署上线。这样就不会导致快要上线,到处是漏洞,到处是bug,手忙脚乱弄完以后还不能部署,严重影响上线时间。

(4) 极大程度避免低级错误
我们可以犯错误,但是犯低级错误就很不应该。这里指的低级错误包括以下几点:编译错误,安装问题,接口问题,性能问题。以天为单位的持续集成,可以很快发现编译问题,自动打包直接无法通过。打完包以后,测试扫码无法安装,这种问题也会立即被暴露出来。接口问题和性能问题就有自动化测试脚本来发现。这些低级问题由持续集成来暴露展现出来,提醒我们避免低级错误。

上述引用这篇文章,我觉得表述得很到位,推荐大家看看。

二. 完整的持续集成流程
我们采用以下几个工具完成持续集成:
1、coding.net : 托管项目代码
2、SourceTree :管理代码,主要处理主干以及分支代码
3、flow.ci :自动化打包以及分发工具
4、fir :第三方分发工具
5、钉钉办公 : 分发消息给相关人员

20.png

完整的持续集成流程:
(1)项目代码托管到coding.net;
(2)本地拉去项目代码,使用SourceTree 建立分支,代码主要在分支上开发,版本稳定之后,合并分支版本到主干,推送Coding.net进行集成化;
(3)Coding.net接收到主干的推送后,推送消息给 flow.ci ,进行自动化打包以及分发;
(4)flow.ci完成打包后,分发给fir以及钉钉,提示相关人员下载

三. 代码托管——Coding
首先,我们创建远程仓库进行代码管理,这点很像现阶段我们对代码管理的Git或者SVN。代码托管Coding地址
(1)注册账号后登录(这个好像是必须的)
(2)创建项目,输入名称、项目描述。我们可以创建空白的项目或者从其他平台导入。

1.png
2.png

(3)至此,我们完成项目的创建

3.png

(4)复制仓库地址,方便本地管理

4.png

四. 代码管理——SourceTree
下载本地代码工具:SourceTree
(1)拉取远程项目代码,进入SourceTree主页,点击新增,输入上述复制的地址。拉取项目

1.png
2.png

(2)创建项目分支。分支(develop)作为开发,主干(master)作为版本的管理。

4.png

(3)在刚才的本地地址创建项目代码,进行开发。
(4)本地有修改,文件状态有新的提示,勾选暂存的文件,填写备注,推送到远程的分支。

5.png

(5)如果分支开发稳定之后,即可以远程推送到远程主干发布。点击分支,右键合并。然后推送到远程

6.png
7.png

(6)可以给项目添加标签,比如以版本号区分:1.0.0

9.png

(7)至此,项目托管以及本地管理已经完成。

8.png

五. 自动化打包工具——flow
(1)注册账号,创建团队,flow提供三种套餐。

0.png

1.png

(2)创建团队之后,就可以创建项目

2.png

(3)如果没有设置,会报以下错误。需要在项目中,取消证书自动选择,选择开发证书,再次上传程序。

3.png
1.png

(4)然后再次选择后,进入项目配置。

2.png

(5)配置完成就开始构建。因为没有做证书配置,第一构建是失败的。


3.png

(6)选择团队,点击设置,进行证书设置

4.png

(7)上传证书。证书配置指导指南。如果进入设置页面,你发现没有设置证书的地方,说明你还没有添加团队成员,需要先添加团队成员。

4.png

(8)进行仓库权限授权,系统根据你项目仓库记录授权

5.png

(9)至此,flow的基本配置完成。下面配置flow的工作流

六. flow工作流配置(打包完成自动化上传 fir平台,推送到钉钉)
初次创建,默认会创建一下流程

1.png

(1)为了满足需求,我们自定义了以下工作流,接下来,就逐个配置

2.png

(2)触发器:设置构建版本的条件。
我们设置master提交之后触发构建版本。

3.png

(3)环境变量以及更新日志:设置环境变量(FLOW_DISTRIBUTION_ENV)以及更新日志(CHANGE_LOG)的全局变量。

4.png

(4)钉钉机器人配置,配置钉钉机器人的提示信息标题(FLOW_DINGTALK_MESSAGE)以及地址(FLOW_DINGTALK_MESSAGE_URL)。这个地址是配置钉钉机器人时生成的。

6.png

(5)测试下载地址配置:配置测试以及正式版本的下载地址
测试地址全局变量:FLOW_CheckAuthorization_BETA_DOWNLOAD_URL
正式地址全局变量:FLOW_CheckAuthorization_DOWNLOAD_URL

7.png

以上是一些全局变量的配置,后续更改可以用到。

(6)初始化。主要是配置启动 iOS 项目运行需要的环境
//证书信息
security find-identity -p codesigning ~/Library/Keychains/app-build.keychain

//Pods repos 获取pod列表
pod repo list

//输出证书信息
curl -O -L http://developer.apple.com/certificationauthority/AppleWWDRCA.cer
security import AppleWWDRCA.cer -k ~/Library/Keychains/app-build.keychain -A

(7)Git 仓库克隆:这个是系统自动从代码托管仓库克隆代码
这里会输出项目的地址:FLOW_CURRENT_PROJECT_PATH

(8) 安装:主要用来安装pod

8.png

(9) 提取更新内容。我们在程序中建立文件夹release_note,存放每次更新版本的内容。命名方式:1_0_0.md。
获取版本号 例如1.0.0
infoPlist="${FLOW_CURRENT_PROJECT_PATH}/CheckAuthorization/Info.plist"
bundleVersion=/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $infoPlist

//更新文件名称 把1.0.0改成1_0_0
fileName=${bundleVersion//'.'/'_'}.md

//获取版本更新内容
while read line
do
//# OLD_IFS=“$IFS”
arr=($line)
// # IFS=“$OLD_IFS”
export CHANGE_LOG=${CHANGE_LOG}${arr[0]}$"</br>"
done<${path}

echo "bundleVersion=="${bundleVersion}


9.png

(10)读取发布环境变量,在程序中创建一个Environment.txt,记录构建环境。只有一个参数0或者1,0表示测试,1表示正式。
同时配置scheme参数(FLOW_DISTRIBUTION_ENV)以及钉钉提示标题(FLOW_DINGTALK_MESSAGE)

//获取环境变量
path=${FLOW_CURRENT_PROJECT_PATH}/Environment.txt
read number <${path}
if [ "$number" = "0" ]; then
//测试版本
else
//正式版本
fi

10.png

(11)编译正式版本:配置好参数即可。不需要改变脚本内容

11.png

(12)fir.im 上传插件正式版


12.png

(13)记录正式版下载地址

13.png

(14)钉钉推送消息
首先要建立钉钉办公群,然后配置钉钉机器人。复制钉钉机器人的token到全局变量。

16.png

FLOW_DINGTALK_MESSAGE:上面设置的钉钉标题
CHANGE_LOG:更新日志
FLOW_STEP_RESULT_URL:下载地址

14.png

发布后的效果

17.png

(15)完后后,把构建情况发给相关人员邮箱

15.png

至此,我们完成了Coding + flow.ci +fir.im持续集成。

七. 未来还有待完善的工作
仔细观察就可以发现,这个持续集成还缺少持续集成测试,没有提供自动化测试模块。后续会加入自动化测试测试。
而且,钉钉推送的消息只能安装信息,没有bug提交功能,后续会完善。

最后
以上就是我关于Coding + flow.ci +fir.im持续集成的一次实践经验。分享给大家,如果里面有什么错误,欢迎大家多多指教。

推荐阅读更多精彩内容