zoukankan      html  css  js  c++  java
  • Android Jenkins+Git+Gradle持续集成

    首先到Jenkins的官网下载https://jenkins.io,安装jenkins不再赘述
    然后是插件安装如下
    注意:列表中为主要插件,而Jenkins的插件是有依赖关系的,安装一个插件可能要先安装它依赖的插件,否则会安装失败。在可选插件勾选列表中的插件即可,依赖插件会自动下载,是不是很棒。

    Git plugin
    Gradle Plugin
    Email Extension Plugin
    description setter plugin
    build-name-setter
    user build vars plugin
    Post-Build Script Plug-in
    Branch API Plugin
    SSH plugin
    Scriptler
    Dynamic Parameter Plug-in
    Git Parameter Plug-In
    在线没有的插件可以去找离线包

    接着安装打包需要的工具 安卓 sdk gradle git
    1.下载Android SDK
    http://tools.android-studio.org/index.php/sdk/ 我下载的是:android-sdk_r24.4.1-linux.tgz

    2. 解压Android SDK
    将android-sdk_r24.4.1-linux.tgz文件复制到Linux 文件系统中的某个目录,我的是目录是/usr/local/
    执行命令解压:
    tar -zvxf android-sdk_r24.4.1-linux.tgz
    3.配置环境变量
    在文件/etc/profile末端添加如下两行:
    export ANDROID_HOME=/usr/local/android-sdk-linux
    export PATH=$ANDROID_HOME/tools:$PATH
    android-sdk-linux是你解压后的文件名,tools一定要这样写,是里面文件夹的名称

    执行命令文件立马生效
    source /etc/profile
    4.安装所有包
    android update sdk --no-ui
    或者查看序列号
    android list sdk --all
    结果
    1- Android SDK Tools, revision 24.1.2
    2- Android SDK Platform-tools, revision 22
    3- Android SDK Build-tools, revision 22.0.1
    4- Android SDK Build-tools, revision 22 (Obsolete)
    5- Android SDK Build-tools, revision 21.1.2
    6- Android SDK Build-tools, revision 21.1.1 (Obsolete)
    7- Android SDK Build-tools, revision 21.1 (Obsolete)
    8- Android SDK Build-tools, revision 21.0.2 (Obsolete)
    9- Android SDK Build-tools, revision 21.0.1 (Obsolete)
    10- Android SDK Build-tools, revision 21 (Obsolete)
    11- Android SDK Build-tools, revision 20
    12- Android SDK Build-tools, revision 19.1
    13- Android SDK Build-tools, revision 19.0.3 (Obsolete)
    14- Android SDK Build-tools, revision 19.0.2 (Obsolete)
    15- Android SDK Build-tools, revision 19.0.1 (Obsolete)
    16- Android SDK Build-tools, revision 19 (Obsolete)
    17- Android SDK Build-tools, revision 18.1.1 (Obsolete)
    18- Android SDK Build-tools, revision 18.1 (Obsolete)
    19- Android SDK Build-tools, revision 18.0.1 (Obsolete)
    20- Android SDK Build-tools, revision 17 (Obsolete)
    21- Documentation for Android SDK, API 22, revision 1
    22- SDK Platform Android 5.1.1, API 22, revision 2
    23- SDK Platform Android 5.0.1, API 21, revision 2
    24- SDK Platform Android 4.4W.2, API 20, revision 2
    25- SDK Platform Android 4.4.2, API 19, revision 4
    26- SDK Platform Android 4.3.1, API 18, revision 3
    27- SDK Platform Android 4.2.2, API 17, revision 3
    按序列号安装

    android update sdk -u --all --filter 1,2,3,5,11,12,22,23,24,25,26,27,28,29,88,89
    后面如果打包报错再来按序号安装所需版本

    gradle安装及使用
    到官网下载 https://gradle.org/install/
    2、解压安装包到目录

    /root/A
    3、打开环境文件

    sudo vim /etc/profile
    4、写入环境变量:

    export GRADLE_HOME=/root/A/gradle-2.0
    export PATH=$GRADLE_HOME/bin:$PATH
    5、环境变量生效

    source /etc/profile
    6、检查结果

    gradle -v
    出现版本信息即为正确
    Gradel的使用:
    查看当前工程支持的操作任务

    gradle tasks
    清理工程

    gradle clean
    编译项目debug版本 ,并输出到output目录

    gradle assembleDebug
    编译项目release版本 ,并输出到output目录

    gradle assembleRelease
    代码检查及测试

    gradle check
    编译项目并执行检查及测试,即assemble + check

    gradle build

    然后在jenkins上配置工具的路径
    1 设置全局环境变量

    主要有三个全局环境变量,JAVA_HOME,ANDROID_HOME,GRADLE_HOME

    点击系统管理-系统设置,找到全局属性,勾选enviroment variables,分别添加这三个环境变量。主要添加变量路径要和你系统的保持一致。



    然后是 工具路径 点击系统管理-Global tool configuration



    最后开始打包
    打包
    1.创建项目
    距离开始打包又近了一步,接下来就开始创建新项目了,点击首页的新建,进入下图界面

     

    给自己的项目起个名字,然后选择构建一个自由风格的软件项目,点击OK按钮,进入项目的配置界面。

    2.项目配置
    直接选择源码管理tab或者向下滚动找到源码管理,如图;

    选中Git选项,会出现上图的界面,配置Git项目的URL,我测试用的是Github项目,并且传输协议选择的是HTTP,需要选择Credentials选项,选择通行证,第一次需要点击Add添加通行证,如图:

    Kind种类选择默认的Username with password,然后在Username和Pasword处分别输入Git账户的用户名和密码,然后滚动到下方点击Add,然后在Credentials中选择我们刚才添加的通行证。
    接着滚动到构建Tab,点击添加构建步骤,然后选择Invoke Gradle script,如图:

    然后配置构建时的Gradle版本,和需要执行的任务,如图:

    这个Tasks是先clean工程,然后打包所有渠道的Release版本,这是Gradle的命令,不多说了。然后点击保存按钮,马上就可以打包了。
    3.开始构建
    点击左侧菜单栏的立即构建,开始构建项目,这时候Build History版块会出现构建任务列表,点击进入可以查看构建详情页

    又很多菜单可以选择来查看状态,点击Console Output来查看构建输出的日志,所有的信息都会显示,日志最后输出Finished: SUCCESS即构建成功。

    成功之后,返回项目地址就可以点击工作空间,在app的build目录下面查看apk生成情况。

    以上就是Jenkins打包最简单的配置,我知道大家想要的不止这些,更精彩的还在后面。

    定制想要的功能
    1.参数化构建
    在我们打包的时候,我们大多时候不想只是简简单单打一个版本的包,我们想通过配置一下参数,来满足一些需求,比如根据渠道打不同版本的包、根据Tag打不同的包等,下面就来说一下Jenkins参数化构建。

    在我们项目中需要配置的选项有:版本(Release 或 Debug),版本号,渠道包,根据Tag打包。另外我们还需要加上打包途径,AS打包还是Jenkins打的包,还要加一个时间戳。所有的参数列出来了,下面就配置Jenkins的参数化构建吧~

    在Jenkins项目主页选择配置,进入配置页,在General tab将参数化构建过程选中,如图:

    接下来就可以添加参数了,下面我先列出参数表格:

    参数名 参数类型 参数值列表
    BUILD_TYPE Choice Release or Debug
    IS_JENKINS Choice true
    PRODUCT_FLAVORS Choice Xiaomi 、Wandoujia等
    BUILD_TIME Dynamic Parameter 2016-12-21-11-11
    APP_VERSION Choice 1.0.0、1.0.1等
    GIT_TAG Git Parameter tag1.0.0等
    下面直接放我的配置截图:

    配置完参数还不算完,我们要在下方构建时候引用,首先找到构建标签处,将Tasks属性值修改为:
    clean assemble${PRODUCT_FLAVORS}${BUILD_TYPE} --stacktrace --debug
    其中${PRODUCT_FLAVORS}和&{BUILD_TYPE}分别对应上面的参数名。配置如图:

    看了图大家肯定留意到了红色框内的选项而且很好奇吧,这个选项是APP_VERSION、IS_JENKINS、BUILD_TIME需要用到的,因为这三个参数需要注入到Android项目中的配置一样,而红色框中的这个选项可以帮我们侵入到gradle.properties文件中替换值,并且build.gradle文件能够直接引用gradle.properties文件中的属性,所以起到了侵入的效果。下面分别是我的gradle.properties和主项目的build.gradle文件全代码:

    //gradle.properties
    
    
    #sec:decoupled_projects
    #org.gradle.parallel=true
    APP_VERSION=1.0.1
    IS_JENKINS=true
    BUILD_TIME=''
    
    //build.gradle
    
    apply plugin: 'com.android.application'
    def getDate() { 
    def date = new Date() 
    def formattedDate = date.format('yyyy-MM-dd-HH-mm') 
    return formattedDate
    }
    def verCode = 14
    android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.0" 
    defaultConfig { 
    applicationId "com.zyyoona7.autobuildtest" 
    minSdkVersion 15 
    targetSdkVersion 23 
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    multiDexEnabled true 
    versionCode verCode 
    versionName APP_VERSION 
    } 
    signingConfigs { 
    signingConfig { 
    //由于本地打包使用的是本机上的KeyStore 
    //而Jenkins打包用的是服务器上的KeyStore 
    //两个路径不一样 
    if("true".equals(IS_JENKINS)){ 
    storeFile file("服务器上KeyStore的路径") 
    }else { 
    storeFile file(STORE_FILE_PATH) 
    } 
    keyAlias KEY_ALIAS 
    keyPassword KEY_PASSWORD 
    storePassword STORE_FILE_PASSWORD 
    } 
    } 
    buildTypes { 
    release { 
    minifyEnabled true 
    zipAlignEnabled true 
    shrinkResources true 
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    signingConfig signingConfigs.signingConfig 
    } 
    debug { } 
    } 
    dexOptions { 
    javaMaxHeapSize "2g" 
    } 
    //渠道Flavors 
    productFlavors { 
    wandoujia { 
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] 
    } 
    xiaomi { 
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] 
    } 
    } 
    //修改生成的apk名字及输出文件夹 
    applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
    //新名字 
    def newName 
    //时间戳 
    def timeNow 
    //输出文件夹 
    def outDirectory 
    //是否为Jenkins打包,输出路径不同 
    if ("true".equals(IS_JENKINS)) { 
    //Jenkins打包输出到服务器路径 
    timeNow = BUILD_TIME 
    //BUILD_PATH为服务器输出路径 
    outDirectory = BUILD_PATH 
    //AutoBuildTest-v1.0.1-xiaomi-release.apk 
    newName = 'AutoBuildTest-v' + APP_VERSION + '-' + variant.productFlavors[0].name + '-' + variant.buildType.name + '.apk' 
    } else { 
    //本机打包输出在本机路径 
    timeNow = getDate() 
    outDirectory = output.outputFile.getParent() 
    if ('debug'.equals(variant.buildType.name)) { 
    newName = "AutoBuildTest-v${APP_VERSION}-debug.apk" 
    } else { 
    //AutoBuildTest-v1.0.1-xiaomi-release.apk 
    newName = 'AutoBuildTest-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:25.0.0' 
    testCompile 'junit:junit:4.12'
    }
    

      

    这样在Jenkins打包的时候上面三个参数就会随着选择变化而变化了。

    GIT_TAG参数使用配置,只需在源码管理处的Branch引用改为$GIT_TAG引用参数名,如图:

    参数配置完毕,看一下主页面的效果吧,现在立即构建选项变成了_ Build with Parameters_,完成图:

    提示:

    如果选中了GIT_TAG中的任意版本都无法取消选中,只能刷新;
    构建后操作 

    将apk放在nginx的下载目录下nginx 即开启 autoindex on 即可

    jenkins配置如下

    测试人员即可从网址下下载所需apk了

    如果没有服务器的 给大家福利阿里云的优惠券

    https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=twka3s4r

  • 相关阅读:
    工具函数(代码块的大小,代码块起始地址,提升进程权限)
    在共享DLL中使用MFC 和在静态库中使用MFC的区别
    虚拟机检测绕过总结--不定时更新
    OSGI原形(.NET)
    iOS开发技术分享(1)— iOS本地数据存储
    将JSON映射为实体对象(iOS篇)
    灵活的路由(上)
    github开源项目
    EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态
    实体能否处于非法状态
  • 原文地址:https://www.cnblogs.com/jinbiaof/p/9626368.html
Copyright © 2011-2022 走看看