前言:
首先很高兴大家来阅读王某人这篇文章,我干肯定大部分公司的发版流程是这样的,android程序员小李打出各渠道包,发给运维小胡,小胡将个渠道包上传各大应用市场,就这样送审了。。。
我们反过来想一想,程序员小李的工作有意义吗,首先肯定耽误它手头的工作吧,对于公司来说程序员的时间就是金钱,还有如果哪一天程序员小李脑子发热了,忘记改debug参数了,忘记改versioncode值了,这些后果谁来承担呢?
不要怕,下面我们就来认识下今天得主人公,Jenkins+Gradle;
Jenkins简介
Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时Jenkins能实现监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。Jenkins的前身是Hudson,是一个可扩展的持续集成引擎。
Jenkins安装与配置
下载地址
http://mirrors.jenkins-ci.org/war/latest/jenkins.war
安装
将下载的jenkins.war包直接放到tomcat下的webapps目录下,然后启动tomcat即可安装完成,接下来登录:http://localhost:8080/jenkins就能进入jenkins系统页面,在此不说tomcat如何配置环境变量。
编码问题
当你进入jenkins系统管理页面,会出现如图提示,可修改tomcat的server.xml配置,在Connector 标签添加上 URIEncoding=”UTF-8”。
配置
点击“系统管理” –> “Configure Global Security”
首先先添加一个administer用户作为超级管理员,全部权限都打勾,如图admin用户。保存,重启。用刚刚添加的超级管理员作为账号名注册一个账号,即可拥有超级管理员权限。
JDK、Gradle如果系统环境变量配置好的话就不用再配置,用默认的就行。
邮件通知
点击“系统管理”–> “系统设置”
Jenkins Gradle插件安装
点击“系统管理”–> “管理插件” –> “可选插件” 选中Gradle plugin插件安装重启即可。
Jenkins新建任务
点击“新建”
选择“源码系统”
- Repository URL: svn 的 的地址,如果输入的地址需要输入用户名和密码,将自动跳出红色的提示信息,点击”enter credential” 进入设置svn 用户名。
注: 这里的svn地址不能使用域名,要用实际IP,要不然会一直授权不通过;
选择“构建触发器”
来到了这一步,实属不易,这里就是我们的天堂,就能完成“每当svn上项目版本更改后,我就自动构建,然后跑一次单元测试,当然也可以改成每天一次或者每小时一次来监控svn上项目版本更改情况。”
Build periodically:周期进行项目构建(它不关心源码是否发生变化)
Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作,这里我选择它。
选择“日程表”
第一个参数代表的是分钟 minute,取值 0~59;
第二个参数代表的是小时 hour,取值 0~23;
第三个参数代表的是天 day,取值 1~31;
第四个参数代表的是月 month,取值 1~12;
第五个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
如H/5 * * * * 表示的就是每5分钟检查一次源码变化。
选择 “构建”,添加“Invoke Gradle script”
Switches :即gradle 后面所接的命令。上面相当于执行gradle clean build命令。
构建后操作:构建失败可以发送邮件通知
gradle 介绍
简介
Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具。现在已是android的默认构建工具了。
Gradle环境变量配置
从官网下载gradle-**.zip解压到本地,设置环境变量GRADLE_HOME,将%GRADLE_HOME%\bin加入到Path中即可。
从官网下载gradle-1.0-all.zip解压到本地,设置环境变量GRADLE_HOME,将%GRADLE_HOME%\bin加入到Path中即可。
进入cmd,输入 gradle -version看到如下界面,说明配置成功
android build.gradle配置
apply plugin: 'com.android.application' def releaseTime() { return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("GMT+08:00")) } android { compileSdkVersion 23 buildToolsVersion '23.0.3' dataBinding { enabled = true } defaultConfig { applicationId "com.walid.mizar" testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" /* Android 4.0 */ minSdkVersion 14 targetSdkVersion 23 multiDexEnabled true versionCode 20 versionName "1.3.0" } lintOptions { checkReleaseBuilds false abortOnError false } packagingOptions { exclude 'AndroidManifest.xml' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'pom.properties' } signingConfigs { release { storeFile file('xiaobai.keystore') storePassword 'xiaobai0824' keyAlias 'xiaobai' keyPassword 'xiaobai0824' } } buildTypes { release { signingConfig signingConfigs.release jniDebuggable false debuggable false //代码混淆开关,一定要注意现在已经使用minifyEnabled代替runProguard了 minifyEnabled false shrinkResources true zipAlignEnabled true shrinkResources false proguardFile 'proguard-project.txt' applicationVariants.all { variant -> variant.outputs.each { output -> def apk = output.outputFile if (apk != null && apk.name.endsWith('.apk')) { def fileName = "kangxiaobai_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk" output.outputFile = new File(apk.parent + "/package", fileName) } } } } } // 友盟多渠道打包 productFlavors { Official {} SanLiuLing {} HuaWei {} Baidu {} NineOneMarket {} AnzhuoShiChang {} YingYongBao {} WanDouJia {} Xiaomi {} MeiZu {} LeShangdian {} Anzhi {} TaoBao {} ZhongYiDong {} Others {} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } dexOptions { incremental false preDexLibraries = false jumboMode = false javaMaxHeapSize "4g" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
问题介绍:
在Jenkins中利用Gradle编译项目时,可能会出现以下错误
Could not load Logmanager "org.apache.juli.ClassLoaderLogManager" java.lang.ClassNotFoundException: org.apache.juli.ClassLoaderLogManager at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
原因 :
Jenkins的Gradle Plugin拷贝所有Tomcat的环境变量到Gradle的JVM中,因此Gradle在使用JAVA_OPTS 作为合法参数时可能机会有下面这些问题
解决办法:
打开Tomcat bin目录下catalina.bat,注销下面代码:
- set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"
- set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%"
环境变量配置问题
Failed to notify ProjectEvaluationListener.afterEvaluate(), but primary configuration failure takes precedence. java.lang.RuntimeException: SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
原因:
没有找到ANDROID_HOME的环境变量
解决办法:
1.Go to Jenkins > Manage Jenkins > Configure System
2.Check “Environment variables”
3.add name: ANDROID_HOME, value -> your android sdk dir
4.click “add”
5.SCROLL DOWN CLICK SAVE
如果你忘记了你admin的密码
jenkins admin用户密码存在文件:
C:\Users\admin\.jenkins\secrets\initialAdminPassword
svn路径带域名授权问题
error : https://code.text.cn/sourcecode/android/mizar/branches/xiaobai-mizar-1.3.0.0
right : https://120.00.00.00/sourcecode/android/mizar/branches/xiaobai-mizar-1.3.0.0
结语
希望这篇文章对IT同胞们会有所帮助,如果可以的话,帮忙点个赞哦~