Jenkins+Github+Gradle+Android
Posted
也许题目换成《配置以Github作为源码仓库并用Gradle编译Android的Jenkins时遇到的坑》更恰当~ LOL~
网上教学贴很多,不一一列举了。也可以参考前一篇(BTW,我想说Subversion Release Plugin比自带的Subversion Plugin好用多了)。本文主要补充配置Github和Gradle容易遇到的问题。
重要的plugin:
至于Github plugin之类的插件,自己看着办吧。
这里有几个容易出问题的地方
- 如何用Jenkins从Github获取代码:
建议使用Deploy keys
怎么用那?最好用.ssh/config
,可以参考这里。
需要注意的是,在创建ssh key的时候,需要
sudo -u jenkins ssh-keygen -t rsa -f .../jenkins/.ssh/id_rsa_project
加-u
来指定以jenkins身份创建key,加-f
就是为了方便多个ssh key(例如多repository)的时候好管理。
同时,创建出来的ssh key不要设置密码,因为jenkins对ssh key密码的支持不是特别好,会报public key permission错误(非访问权限问题)。BTW,虽然github提到deploy keys缺点时有说,这货一般为了方便不加密码;但通过command方式,用带密码的ssh key去访问github是没问题的。
当然Github还提供了一套更华丽的方式,叫Machine user,简单说就是单独申请一个账户(类似一个代理),把这个账户加到不同的repository里面作为只读的collaborator,再直接在这个账户里面加ssh key(而不用每个repository一个deploy key了),这样通过这一个machine user(代理)就可以访问多个repository了。
最后,这里去clone/pull代码的时候,有时候出报timeout的错误,解决方法有两种,一种是在该目录下,手动git clone –bare一个repository出来;再一种就是增加timeout时间:源码管理
-> Git
-> Additional Behaviours
-> Advanced clone behaviours
- 如何用Jenkins来run Gradle:
需要手动匹配gradle版本。在系统设置
里面新增Gradle安装
即可,不然在Invoke Gradle script
的时候,除了default
就没得选了。
JAVA_HOME
和ANDROID_HOME
这两个环境变量需要提前设置好(可以在/etc/profile
里面export,然后source /etc/profile
即可);修改环境变量后需要重启jenkins;同时注意对应的目录,jenkins是否有访问权限;
- gradle增加签名用的key的方式如下:
增加signingConfigs
,注意路径:
android {
signingConfigs {
releaseSignConfig {
storeFile file("../../../xxx/android.key")
storePassword "xxx"
keyAlias "xxx"
keyPassword "xxx"
}
}
buildTypes {
debug {
minifyEnabled false
signingConfig signingConfigs.releaseSignConfig
}
...
}
如果不希望把key/password直接写在gradle中(太直接了好么);可以换个方式(对,就是通过环境变量):
signingConfigs {
release {
storeFile file(System.getenv("KEYSTORE"))
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
之前版本是用runProguard true
来作为proguard的开关,
但是,自从android gradle plugin升到1.0以后,就要换成minifyEnabled true
了。如:
android {
buildTypes {
release {
minifyEnabled true
proguardFile getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
- 仅编译release版本
Build Task填:
clean check assembleRelease
因为:
build = check + assemble
assemble = assembleRelease + assembleDebug
如果对于proguard的结果有疑问的话,可以祭出dex2jar
反编译看看效果。
基本上就这些了。
现在就差。。一个能正常运行Jenkins又价格可接受的Server了。。。