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”。

配置

点击“系统管理” –> “Configure Global Security” 

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

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

邮件通知

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

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

  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同胞们会有所帮助,如果可以的话,帮忙点个赞哦~

时间: 2024-08-29 15:31:51

Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包的相关文章

android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753 [java] view plaincopy import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.apps.service.Player

【转】Android开发之旅:应用程序基础及组件

为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用程序组件 2.1.活动(Activities) 2.2.服务(Services) 2.3.广播接收者(Broadcast receivers) 2.4.内容提供者(Content providers) 因为这些内容比较理论,且没有用例子来说明,看上去会比较枯燥,我就把这几篇写得算比较短,方便大家吸收. 1

Android开发之Tween(补间动画)完全解析(下)

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734 在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章:Android开发之Tween(补间动画)完全解析(上),这篇文章将从代码的角度实现上篇文章的效果.如有疑问请留言,如有谬误欢迎批评指正. T

jenkins + Git 搭建持续集成环境

jenkins + Git 搭建持续集成环境 持续集成通过自动化构建.自动化测试以及自动化部署加上较高的集成频率保证了开发系统中的问题能迅速被发现和修复,降低了集成失败的风险,使得系统在开发中始终保持在一个稳定健康的集成状态.jenkins是目前广泛应用的持续集成工具,本文记录我使用jenkins+Git配置持续集成环境的整个流程以及踩到的坑(jenkins过程的坑往往不是在第一次配置,而是在配置结束后更改某些配置项的时候踩到). 总体流程如下: tomcat8.0下载地址:http://tom

基于 Jenkins 快速搭建持续集成环境

持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础.Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使持续集成变成可能.本文正是从持续集成的基本概念入手,通过具体实例,介绍了如何基于 Jenkins 快速搭建持续集成环境. 持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变

Android开发之JSON使用

Android开发之JSON使用 今天在论坛看到有不少朋友问关于json的问题,所以想写一篇关于android中使用json的博客. 首先 json是什么 JSON的全称是JavaScript Object Notation,从这里可以看到它源于JavaScript,它采用文本形式体现.比如 {"name":"zhangsan","age":20,"wife":"如花"} 这个简单表示了一个对象,在java

Android开发之bindService()侦听service内部状态

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之Fragment详解

Android开发之Fragment学习 1.简介: Fragment是Android 3.0引入的新API. Fragment代表了 Activity的子模块,因此可以把Fragment理解成Activity片段.Fragment用于自己的生命周期,也可以接受它自己的输入事件. Fragment必须被"嵌入" Activity中使用,因此虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制.例如,当Activity暂停时,

Android开发之SpannableString详解

在实际的应用开发过程中经常会遇到,在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等.一般情况下,TextView中的文本都是一个样式,对于类似的情况,可以借助SpannableString或SpannableStringBuilder对象来实现以上设置. SpannableString与SpannableStringBuilder都可以将某段文本设置成一个Span,在Android中,Span表示一段文本的效果,例如,链接形式.图像.带背景的文本等.只