在Travis CI中持续构建Android项目

持续集成,单元测试,当你需要用到这些东西的时候,CI来了。

Travis CI,是一个专门为开源项目打造的持续集成环境,配合GitHub使用,赶脚非常好!另外还有GitLab CI(使用GitLab时候可能用到,官方如是介绍Let GitLab CI test, build, deploy your code),详见https://about.gitlab.com/gitlab-ci/。这里主要记录Travis CI。 开始使用很简单,不多介绍,详见http://ju.outofmemory.cn/entry/27581这篇文章。

对于GitHub上的开源项目,当你关联上Travis CI后,并且已经打开了相应的Repository的Service Hook开关,那么每次你的push、pull等操作就会触发相应的Service Hook,Tracis CI就会进行build等服务。

这里说一说.travis.yml文件,位于项目根目录下,Tracis CI进行相关集成操作时,就是根据此文件的配置进行,先看一看文件代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
language: android
android:
components:
# Uncomment the lines below if you want to
# use the latest revision of Android SDK Tools
# - platform-tools
# - tools
# The BuildTools version used by your project
- build-tools-22.0.1
# The SDK version used to compile your project
- android-22
# Additional components
- extra-google-google_play_services
- extra-google-m2repository
- extra-android-m2repository
- addon-google_apis-google-19
# Specify at least one system image,
# if you need to run emulator(s) during your tests
- sys-img-armeabi-v7a-android-19
- sys-img-x86-android-17
before_install:
install:
branches:
only:
- master
before_script:
script: ./gradlew assembleDebug

.yml是一种YAML格式的文件,主要用于告诉Travis CI应该做些什么操作。

• language说明项目的编译运行环境,此处为Android,支持的预言有Java、C/C++、JavasScript等,详细的戳:http://docs.travis-ci.com/user/languages/

• android中说明了当前Android项目的一些配置信息:比如有BuildTools version、SDK version、Additional components等信息,Travis CI提供Gradle、Maven、Ant等环境的支持。更多可参考官方文档:http://docs.travis-ci.com/user/languages/android/

• before_install告诉Travis CI在开始install你的项目之前要做些什么,比如可以chmod +x gradlew命令改变项目文件下gradlew文件的权限,sudo apt-get update更新软件包等。

• install用于安装软件包,如添加pip install -U PackageName安装某个软件包。

• before_script告诉Travis CI进行构建之前进行的操作。

• script构建某条命令,如执行./gradlew assembleDebug这条命令将执行Gradle脚本编译并打Debug包,与在Android Studio中类似。执行成功返回0,否则失败,同Unix返回值标准。

• branches指定要做持续集成的分支,可以有多个分支(添加多行即可)。

除了这些命令之外,还有类似after_successafter_failureafter_scriptbefore_deploy等很多步骤操作说明符,说明及使用见文档:http://docs.travis-ci.com/user/customizing-the-build/

完成了以上的操作,每次发起各种push、pull等请求时,Tracis CI就会对你的项目进行集成。

集成构建成功后,提示如下图:

在自己的Travis CI中,也可以看到信息,如下图:

成功↓

失败↓

 

使用过程中遇到的问题:

1. This job is running on container-based infrastructure, which does not allow...,如下图

这里提示的是关于使用sudo操作的相关提示,详见http://docs.travis-ci.com/user/workers/container-based-infrastructure/

2. 当我构建Android项目时,构建失败,打印的信息是/home/travis/build.sh line 41 ./gradle permission denied...

这个原因很折腾人,特别诡异,最终又上谷歌又上SO很久才解决。

因为我是在WIN7下进行的开发,在我的项目中gradlew文件的权限对于guest用户来说没有添加任何权限,而在Travis CI构建中,使用的是一个Linux VM的guest账户进行的,所以没有权限执行gradlew这个文件,从而报错。

解决办法:

a:在.travis.yml文件before_install中添加chmod +x gradlew,改变gradlew的访问权限,这个方法来自https://joerglenhard.wordpress.com/2013/10/01/using-travis-ci-with-gradle-wrapper/

b:从根源上解决问题,在原始的本地仓库中,就改变gradlew文件的权限,在提交上去。git中更改文件权限(添加可执行权限)命令:git update-index --chmod=+x filename(注意:chmod前面有两个 -)。具体可参考http://stackoverflow.com/questions/6476513/git-file-permissions-on-windows-7http://blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html

文中使用Travis CI集成示例项目:AndroidElasticView

参考:

http://docs.travis-ci.com/

http://ju.outofmemory.cn/entry/27581

https://joerglenhard.wordpress.com/2013/10/01/using-travis-ci-with-gradle-wrapper/

http://stackoverflow.com/questions/6476513/git-file-permissions-on-windows-7

http://blog.lesc.se/2011/11/how-to-change-file-premissions-in-git.html