Android Gradle JenKins SVN 自动化打包

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


step.1
JDK
JDK 7.0+

Gradle
Gradle 中文网 安装板或解压版 对应目录下的 gradle.xxx.zip 包


apache 的官网 http://tomcat.apache.org/

下载Tomcat9.0.zip

Jenkins的官网下载 https://jenkins.io
下载Jenkins.war


step.2

解压 Tomcat9.0.zip

将 Jenkins.war 放到 其解压后的webapps的目录下


step.3

解压后的tomcat的bin目录下 点击startup.bat 启动tomcat (shutdown.bat 停止tomcat)


step.4

打开本地浏览器

http://localhost:8080/jenkins/

然后注册用户名密码。


这时候会出现  一个文件夹路径  拷贝到C盘 打开此文件夹 ,会出现数字密码。将其复制到 下面密码框即可。


step.5 插件配置


进入 系统管理--》插件管理界面

可选插件 安装如下插件,这些插件之后会用到。 点击下载后在安装。下载成功后。关闭tomcat 在打开。在访问genkins 同上面step3 和step4. 在次进入 已安装即可查看到。

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

13.Pipeline: Basic Steps
14.Pipeline: Build Step
15.Pipeline: Input Step
16.Pipeline: Nodes and Processes
17.Pipeline: Stage Step
18.Scriptler
19.Workspace Cleanup Plugin
20.Post-Build Script Plug-in
21.Email Extension Plugin
22.SSH Slaves plugin
23.Timestamper
使用git安装如下

9.Git plugin
10.GIT server Plugin
11.Gradle Plugin
12.Git Parameter Plug-In
如果你使用的SVN 还需要安装
Subversion Plug-in
Subversion Release Manager plugin 


step.6 设置全局属性
系统管理--》进入设置全局属性



点击environment variables 选项 配置 SDK

ANDROID_HOME

xx\sdk     -----SDK 具体路径 (studio 引用的sdk绝对路径)



step.7 设置重点属性(理解就是在本地的名称 和其绝对路径)
系统管理--》进入 Global Tool Configuration

JDK  、gradle、git 环境变量配置

JDK 模块:

name:jdk_1.8  

home :复制jdk 在本地文件夹的绝对路径 xxx/jdk_1.8   

gradle模块:
注:引用 android studio 安装板或解压版 对应目录下的 gradle 即可
name: gradle-2.14.1  

home:复制jdk 在本地文件夹的绝对路径 xxx/gradle/gradle-2.14.1  

git模块也一样  使用svn 此模块就默认就好。


step.8 新建任务

点击新建任务
输入名称

Jenkins-》新建-》构建一个自由风格的软件项目-》
点击ok即可






step.9 配置项目
1. 自定义动态参数配置 
这边对应设置gradle .properties文件 ,给build.gradle动态赋值 管理


   找到  参数化构建过程选项→打勾
  • 选项参数使用 Choice  理解为下拉框多选
  • 字符输入参数使用 String Parameter 理解为一个字符串参数
  • 时间参数使用 Dynamic Parameter 理解为一个计算的js脚本
    在添加参数时,配置Name的值必须与.properties文件中定义的参数名称相同。











2. SVN 同步源码配置

源码 管理:选择具体的版本控制软件,并填写项目URL,如本人为svn,只需在Repository URL填具体项目svn地址,其它为默认。


会自动将svn代码下到jenkins 的workspace 目录下
C:\Users\...\.jenkins\workspace



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_FLAVORSBUILD_TYPE即我们上面配置的参数,务必保持一致。
点击保存,回到项目首页。
就可以看到,原先的立即构建已经变成了Build with Parameter
点击参数构建,就可以看到如下上面我们配置的参数。
等待构建完成,前往在.Gradle文件中配置的路径中即可找到我们配置的命名apk。

step.10 构建项目
立即构建  ----》 Build with Parameter




step.11 控制台查看log

  Console Output

step.12 APK编译到指定路径

step.13 source 对应

gradle. .properties文件

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  文件
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />


Application 文件
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        readMetaDataFromApplication();
    }

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() ; }



git 参考

 http://www.jianshu.com/p/915c1ae69144
http://www.open-open.com/lib/view/open1482371829772.html


你可能感兴趣的:(工具)