安卓项目开发,打包,需要分开不同阶段,不同人员进行负责,这里我尝试使用jenkins进行相关的控制和打包配置。
一、 列表内容
Jenkins安装
软件环境:
windows系统
jdk
android sdk
gradle
以上系统相关的安装方法和环境变量设置暂不详述。
到jenkins官网下载对应的最新版本windows安装包,装完就可以直接用http://localhost:8080访问
官网地址
安装成功后,进入首页,用管理员账号登录。
1.首先进入系统管理,插件管理,把需要的插件先装了:
需要安装的插件列表:
Branch API Plugin
build timeout plugin
build-name-setter
Credentials Binding Plugin
description setter plugin
Dynamic Parameter Plug-in
Environment Injector Plugin
fir-plugin(可选)
Git plugin(可选)
GIT server Plugin(可选)
Gradle Plugin
Pipeline: Basic Steps
Pipeline: Build Step
Pipeline: Input Step
Pipeline: Nodes and Processes
Pipeline: Stage Step
Post-Build Script Plug-in
SSH Slaves plugin
Subversion Release Manager plugin(可选)
Timestamper
Workspace Cleanup Plugin
Subversion Plug-in(可选)
2.打开主Module的build.gradle,该步坑比较多,主要是用于打包时候生成的包的类型控制,证书配置等信息,建议把对应的证书信息,存储在环境变量中,然后在jenkins中配置相关环境变量,如果不做修改,在每次编译过程中,还需要重新修改。
具体文件内容如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.0"
defaultConfig {
applicationId "com.test"
minSdkVersion 14
targetSdkVersion 15
versionCode 28
versionName "1.6.0.28"
}
signingConfigs {
release {
storeFile file("$System.env.KEYSTORE_PATH")
storePassword "$System.env.STOREPASS"
keyAlias "$System.env.ALIAS"
keyPassword "$System.env.KEYPASS"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
repositories {
flatDir {
dirs 'libs' //this way we can find the .aar file in libs folder
}
}
lintOptions {
abortOnError false
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('libs/EventBus-2.4.0.jar')
compile files('libs/nineoldandroids-2.4.0.jar')
compile(name: 'recyclerview-v7-22.2.0', ext: 'aar')
compile files('libs/glide-3.7.0.jar')
compile files('libs/okhttputils-2_3_9.jar')
compile files('libs/okhttp-3.6.0.jar')
compile files('libs/okio-1.10.0.jar')
compile files('libs/pinyin4j-2.5.0.jar')
compile files('libs/sqlcipher.jar')
compile files('libs/commons-codec.jar')
compile files('libs/guava-r09.jar')
compile 'com.android.support:support-annotations:22.2.0'
// compile 'com.nineoldandroids:library:2.4.0'
compile 'com.android.support:support-v4:23.0.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:design:22.2.0'
}
二、配置Jenkins参数
回到主界面->系统管理->Global Tool Configuration: 配置好JDK与Gradle。由于我本地已安装好JDK与Gradle所以只需为其指定路径即可。
另外,全局属性->Environment variables 增加各个相关需要的一些环境变量,可以被后续编译的程序中调用。
三、然后回到主界面->新建->构建一个自由风格的项目->ok:
1.勾选上参数化构建过程,先点击Choice可为其配置可选参数。我的项目需要配置的可选参数有API环境、打包渠道、是否来自Jenkins打包的标识。
2.点击String Parameter,让使用者可以自定义显示在App上的版本号,方便测试。可以再添加一个可输入的标签,最后把这个标签加到构建页的构建名称中。
3.点击Dynamic Parameter,注入Groovy脚本,主要是生成时间戳。
4.如果是SVN用户可选择List SubVersion tags,然后写地址帐号密码等,这个选项可以让你选择打包SVN上不同版本的代码。如果是Git用户可参照http://birdinroom.blog.51cto.com/7740375/1404930 上面的配置来拉取不同的版本。
5.勾选源码管理中自己所用的管理工具Git或者Subversion,填写好相关信息,当然我们的地址是动态的,所以需要引用上一步所选择的版本,如图。(如果是Linux后面得加上/,不然拉取的其目录下的内容不包含TAG_SVN这个目录)
6.在构建环境中勾选上Set Build Name,主要是动态生成每次显示在构建页上的名称方便查看。
7.Build periodically H 9 * * 1-6代表每周一至周六上午九点中的某一时间自动build一次。点击每一项后面的问号有详细说明可根据需求自行设置。
8.在构建栏里面选择Invoke Gradle Script->选择配置好的Gradle Version->在Tasks中输入Gradle命令(没了解过的建议先看下Gradle的基本命令),我们先执行一个clean,然后开始编译,这时候就可以用引用上面配置的一些参数了,这里可以用-P命令把参数传入,也可以更方便的把下面的Pass jod parameters as Gradle properties勾选上,其实内部也是用-Pkey=Value的命令->在Root Build script中动态指定你项目的目录,为什么是动态的呢?这是因为我们上面提供了可选版本的功能,所以拉取的每个版本所放目录是不一样的,想要编译相应的版本就得动态指定编译目录。
9.选择刚刚系统设置中的gradle版本,clean build代表每次都clean了再build。可自行配置命令行
10.构建后可能需要发邮件或者获得apk下载,如下,选择Archive the artifacts并填写apk路径。
选择该project job-》左边“状态”-》最后一次成功的构建结果,并点击下载apk。
注意事项:
1、参数传递的时候Jenkins里面的参数名称需要与build.gradle里面的一致,不然没什么卵用。如:
2、在服务器上的SDK最好与你本地的一致,不然指不定编译的时候会少东西。如果服务器的环境与你本地环境不同就不能直接copy过去了,最好的办法是下载一个服务器环境的SDKManager或者直接用Android Studio,然后对照你本地SDK里面的数据挨个下载,完了再copy到服务器。
3、local.properties中sdk.dir需设置成ANDROID_HOME路径,默认代码中最好删去该项,该项配置在环境变量中,动态获取
4、build.gradle的compileSdkVersion、buildToolsVersion需与ANDROID_HOME中的SDK一致
5、build.gradle脚本中可能需要加上lintOptions选项。该内容需要增加在主model的build.gradle中,并非根目录的文件中。
android{
lintOptions {
abortOnError false
}
}