JenKins 是什么?
理解:是一个集成各种插件,通过配置、管理 的本地Web,去自动化打包Android、IOS的工具。
整体流程
插件配置——————》系统设置 sdk HOME 和路径 ,全局设置JDK、GRADLE 、GIT 的本地路径 交由JenKins 管理(即Jenkins通过上步安装的插件 配置好 就可以管理本地的gradle了)新建一个任务————》动态构造自定义本地参数写入build。gradle ——————》配置git 或svn 路径(下载源码到jenkins 好接管编译)——————————》配置gradle 及task (编译命令和编译写入构造好的参数)——》设置编译的版本名称————》构建项目 ——————控制台看log ——————》自定义的输出apk路径 找到打出的apk包
环境变量配置:其实就是将本地计算机的配置 在JenKins上面配置一遍,Jenkins 通过插件就可以自己去管理了。原本studio 通过gradle 编译的android 项目在jenkins上处理了。
本文截图及源码下载链接如下:
http://download.csdn.net/detail/jxmy_1989/9756479
apache 的官网 http://tomcat.apache.org/
下载Tomcat9.0.zip
Jenkins的官网下载 https://jenkins.io
下载Jenkins.war
解压 Tomcat9.0.zip
将 Jenkins.war 放到 其解压后的webapps的目录下
解压后的tomcat的bin目录下 点击startup.bat 启动tomcat (shutdown.bat 停止tomcat)
打开本地浏览器
http://localhost:8080/jenkins/
然后注册用户名密码。
这时候会出现 一个文件夹路径 拷贝到C盘 打开此文件夹 ,会出现数字密码。将其复制到 下面密码框即可。
1.Branch API Plugin
2.build timeout plugin
3.build-name-setter
4.Credentials Binding Plugin
5.description setter plugin
6.Dynamic Parameter Plug-in
7.Environment Injector Plugin
ANDROID_HOME
xx\sdk -----SDK 具体路径 (studio 引用的sdk绝对路径)
3. 设置项目名
进入项目配置找到→构建环境→勾选Set build Name 设置参数
注意和上面配置参数名一致 如我们使用了BUILD_NUMBER 自带参数,以及 APPNAME、APP_VERSION、BUILD_TYPE
${BUILD_NUMBER}${APP_VERSION}
4. gradle 配置
注意和上面配置参数一致
这边对应设置gradle.properties文件 ,给build.gradle动态赋值 管理
找到上面我们使用Gradle 插件的 Invoke Gradle script
修改tasks命令,应用上面的参数,并勾选Pass job parameters as Gradle properties选项。
选择 gradle 上面配置的名称
task:clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE }
pass job parameters as gradle propertiers checbox 打钩
PRODUCT_FLAVORS
和BUILD_TYPE
即我们上面配置的参数,务必保持一致。
点击保存,回到项目首页。
就可以看到,原先的立即构建已经变成了Build with Parameter
点击参数构建,就可以看到如下上面我们配置的参数。
等待构建完成,前往在.Gradle文件中配置的路径中即可找到我们配置的命名apk。
APP_VERSION = 1.0.1
IS_JENKINS = false
BUILD_TYPE = debug
PRODUCT_FLAVORS = xiaomi
ALIAS_PASSWORD = android
STORE_PASSWORD = android
BUILD_PATH_JENKINS = E\:\\JenkinsApk
BUILD_PATH_LOCAL = D:\\AS_PROJECT\\TestJenkins
BUILD_TIME= 1970-1-1
APPNAME = JKApp
build.gradle 文件
apply plugin: 'com.android.application'
def getDate() {
def date = new Date()
def formattedDate = date.format('yyyyMMddHHmm')
return formattedDate
}
def verCode = 14
android {
//渠道Flavors
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
compileSdkVersion 23
buildToolsVersion "25.0.0"
signingConfigs {
release {
keyAlias 'androiddebugkey'
keyPassword ALIAS_PASSWORD
storeFile file('sinkkey.keystore')
storePassword STORE_PASSWORD
}
}
defaultConfig {
applicationId "zsw.testjenkins"
minSdkVersion 16
targetSdkVersion 23
versionCode verCode
versionName "1.0"
versionName APP_VERSION
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.release
}
}
//修改生成的apk名字及输出文件夹
applicationVariants.all { variant ->
variant.outputs.each { output ->
//新名字
def newName
//时间戳
def timeNow
//输出文件夹
def outDirectory
//是否为Jenkins打包,输出路径不同
if ("true".equals(IS_JENKINS)) {
//BUILD_PATH为服务器输出路径
timeNow = BUILD_TIME
outDirectory = BUILD_PATH_JENKINS
//JKApp-v1.0.1-xiaomi-release.apk
newName = APPNAME+"-v"+APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'
} else {
//本机打包输出在本机路径
timeNow = getDate()
outDirectory = BUILD_PATH_LOCAL
newName = APPNAME+"-v"+APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk'
}
output.outputFile = new File(outDirectory+"/"+timeNow, newName)
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:23.0.0'
testCompile 'junit:junit:4.12'
}
AndroidManifest.xml 文件
private void readMetaDataFromApplication() { try { ApplicationInfo appInfo = this.getPackageManager() .getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);Constants.UMENG_CHANNEL= appInfo.metaData.getString("UMENG_CHANNEL");} catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }