用 Jenkins 自动化构建 Android 和 iOS 应用

背景

随着业务需求的演进,工程的复杂度会逐渐增加,自动化的践行日益强烈。事实上,工程的自动化一直是我们努力的目标,能有效提高我们的生产效率,最大化减少人为出错的概率,实现一些复杂的业务需求应变。
场景如下,公司现在的测试人员每次需要测试新版本,都需要开发人员打包,放到ftp,测试人员然后从ftp上拷贝到本地(或者用手机的ES文件管理器),再安装。尤其临近发版的一周,几乎每天都要新版本。这样的话,有两方面的影响:第一,打断了开发人员的开发进度;第二,开发人员打包效率低下,尤其是ios,不顺的话,总是打的不对(可能是证书的问题)。
要解决这个问题,必须实现移动端应用的自动化构建。具体说来就是,使用持续集成(CI)系统jenkins,自动检测并拉取最新代码,自动打包android的apk和ios的ipa,自动上传到内测分发平台蒲公英上。(接下来,测试人员只要打开一个(或多个)固定的网址,扫描一下二维码,就能下载最新的版本了…)

环境

因为要编译ios,所以选择Mac OSX 10.11.1。
无论是哪个操作系统,jenkins的配置是一样的。

安装Jenkins

官网地址:http://jenkins-ci.org/

默认访问http://localhost:8080/, 可进入jenkins配置页面。

安装Jenkins相关插件

点击系统管理>管理插件>可选插件,可搜索以下插件安装

git插件(GIT plugin)
ssh插件(SSH Credentials Plugin)
Gradle插件(Gradle plugin) – android专用
Xcode插件(Xcode integration) – ios专用

新建Job

主页面,新建 -> 构建一个自由风格的软件项目即可。
对于类似的项目,可以选择 -> 复制已有的Item,要复制的任务名称里输入其他job的首字符会有智能提示。

配置git仓库

如果安装了git插件,在源码管理会出现Git,选中之后:
Repositories -> https://github.com/openproject/ganchai, 如果是ssh还要配置Credentials。
Branch -> */master,选定一个要编译的分支代码。
如下:
jenkins中配置git参数
如果是私有的仓库(比如git://xxxxx.git),点击Credentials – Add,弹出对话框,配置sshkey最简单了:
jenkins中配置git参数

配置自动拉取最新代码

在构建触发器中,有两种自动拉取代码并编译的策略:

  1. 设置Poll SCM,设置定时器,定时检查代码更新,有更新则编译,否则不编译(我暂时用的是这个)。
    jenkins中配置Poll SCM
  2. 也可以设置Build periodically,周期性的执行编译任务。
    jenkins中配置Poll SCM

关于定时器的格式,我只能从网上摘抄一段稍微靠谱一点的说明:

举两个例子:

配置gradle – android专用

请ios的朋友们请飘过.
如果安装gradle插件成功的话,应该会出现下图的Invoke Gradle script,配置一下:
jenkins中配置Gradle
${WORKSPACE}表示当前job下的workspace目录,主要是存放代码。更多的环境变量请参考文末附录。
这样,就能自动在project下的app的build/outputs/apk下生成相应的apk.
编译失败?可能要解决以下2个问题:

  1. gradle没配置环境变量。
    比如我在/etc/profile中配置一下GRADLE_HOME: 


  2. 找不到local.properties中sdk定义。
    因为一般来说local.properties不会添加到版本库。
    所以需要手动copy到${WORKSPACE}下的Project目录下(可参考自己Android Studio工程结构)。
    关于local.properties的定义,这里记录一下,做个备份: 


再编译一般就会编译成功,当然当那些第三方库需要重新下载的话,编译可能会很慢。

配置xcode – ios专用

请android的同学们飘过。
安装Xcode插件后,可看到如下图界面,并配置:
jenkins中配置Xcode编译
这里有两个地方需要注意。

  1. 签名
  2. 需要Shared Schema文件.

上传到蒲公英平台

在官网文档里有说明,通过linux平台上传app的关键代码

具体来说,

这样就完成一个app上传到蒲公英了。

实际上,我们可能会面对更复杂的场景,比如上面的${version}, 而version定义于build.gradle如下:

得想办法读到versionName, 然后拼出最终的文件名,这样下次版本升级了之后也能动态的上传app到蒲公英了。

这是android的apk上传过程,相应的,ios是上传ipa,方法是一样的,不再赘述。

小结

把开发人员发布版本的工作自动化之后,如此一来,方便了测试人员随时拉取并构建最新版本,更解放了开发人员自己的发版本的工作,一个字,善!

附录

jenkins中定义的那些环境变量:

1 5 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部