/ 技术

Jenkins+Github+Gradle+Android

也许题目换成《配置以Github作为源码仓库并用Gradle编译Android的Jenkins时遇到的坑》更恰当~ LOL~

网上教学贴很多,不一一列举了。也可以参考前一篇(BTW,我想说Subversion Release Plugin比自带的Subversion Plugin好用多了)。本文主要补充配置Github和Gradle容易遇到的问题。

重要的plugin:

  1. Git plugin

  2. 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_HOMEANDROID_HOME这两个环境变量需要提前设置好(可以在/etc/profile里面export,然后source /etc/profile即可);修改环境变量后需要重启jenkins;同时注意对应的目录,jenkins是否有访问权限;

增加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了。。。