[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包

前言: 


      首先很高兴大家来阅读王某人这篇文章,我干肯定大部分公司的发版流程是这样的,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”。

[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第1张图片


配置


点击“系统管理” –> “Configure Global Security” [置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第2张图片


[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第3张图片


首先先添加一个administer用户作为超级管理员,全部权限都打勾,如图admin用户。保存,重启。用刚刚添加的超级管理员作为账号名注册一个账号,即可拥有超级管理员权限。 

[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第4张图片

JDK、Gradle如果系统环境变量配置好的话就不用再配置,用默认的就行。

邮件通知

点击“系统管理”–> “系统设置”

 

Jenkins Gradle插件安装


点击“系统管理”–> “管理插件” –> “可选插件” 选中Gradle plugin插件安装重启即可。 



 [置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第5张图片

 


Jenkins新建任务


 点击“新建” 

 [置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第6张图片


选择“源码系统” 


[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第7张图片

  • Repository URL: svn 的 的地址,如果输入的地址需要输入用户名和密码,将自动跳出红色的提示信息,点击”enter credential” 进入设置svn 用户名。

        注: 这里的svn地址不能使用域名,要用实际IP,要不然会一直授权不通过;

选择“构建触发器”


来到了这一步,实属不易,这里就是我们的天堂,就能完成“每当svn上项目版本更改后,我就自动构建,然后跑一次单元测试,当然也可以改成每天一次或者每小时一次来监控svn上项目版本更改情况。”

[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第8张图片



  Build periodically:周期进行项目构建(它不关心源码是否发生变化)
  Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作, 这里我选择它

选择“日程表” 


[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第9张图片

     第一个参数代表的是分钟 minute,取值 0~59; 
     第二个参数代表的是小时 hour,取值 0~23; 
     第三个参数代表的是天 day,取值 1~31; 
     第四个参数代表的是月 month,取值 1~12; 
     第五个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。 
     如H/5 * * * * 表示的就是每5分钟检查一次源码变化。

选择 “构建”,添加“Invoke Gradle script” 


 [置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第10张图片


 

                 Switches :即gradle 后面所接的命令。上面相当于执行gradle clean build命令。


构建后操作:构建失败可以发送邮件通知 


[置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第11张图片


 [置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第12张图片

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开发之Jenkins+Gradle实现持续集成、apk多渠道打包_第13张图片


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,注销下面代码:

  1. set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"  
  2. 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同胞们会有所帮助,如果可以的话,帮忙点个赞哦~




你可能感兴趣的:([置顶] Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包)