Android Jenkins 自动构建打包

本文打包是下载好的tomcat和jenkins的Jenkins.war包。Jenkins.war包安装Jenkins后在安装目录里面

官网下载Tomcat Apache
Jenkins官网下载War包

image.png

image.png

Jenkins入口地址、登录配置

Jenkins下载地址

  • 将下载后的Jenkins安装,安装之前需要安装JDK,然后安装Jenkins,安装之后打开安装后的Jenkins文件夹,里面存着jenkins.war包。将该文件挪到Tomcat里面的webapps文件夹下。
  • 启动Tomcat 服务,输入本地IP+端口(可自行设置),默认8080,或者localhost:8080打开网页看是否有Tomcat界面,能打开则Tomcat正常启动成功。再该地址后面加上/jenkins。比如:
    http://192.168.2.7:8080/jenkins/
  • 打开该地址后可以根据网页提示进行一系列的插件进行默认安装,有一个密码输入,根据该提示打开secrets目录下找到存放密码的文件复制粘贴即可。如果打不开,可复制一份修改为.txt格式。
    image.png

系统管理配置

  • 找到系统管理,设置全局配置,首先进行系统设置ANDROID_HOME也就是SDK配置,根据本地环境变量进行设有效路径,再设置全局工具配置,设置JAVA_HOME也就是JDK环境变量,所有的都指向本地,而不是从服务端下载,如果自行在自己电脑上测试,则不用勾选,如下图所示:
image.png
ANDROID_HOME
D:\androidstudio\sdk
image.png
gradle-4.4
C:\Users\cc\.gradle\wrapper\dists\gradle-4.4-all\9br9xq1tocpiv8o6njlyu5op1\gradle-4.4
image.png

新建任务,选择自由风格

image.png

参数化构建过程

image.png
image.png

image.png

image.png
image.png
image.png

image.png

image.png

image.png

image.png

image.png

image.png
clean
assemble${BuildEnvironment}${BuildFlavors}Release
--stacktrace
--info
image.png

image.png
E:\jenkins\Test\${BuildSVN}
image.png

image.png
BuildForPublish
BuildChannel
BuildOutputDir
BuildEnvironment
BuildFlavors
BuildForGrayLevel

构建项目:

image.png

image.png

image.png

Android工程需要注意事项

local.properties配置

image.png

gradle.properties配置

image.png

主工程Module下的build.gradle配置

  • 签名路径
image.png
  • 签名配置
image.png
  • 从jenkins服务端接收到消息,传递给gradle.properties中的变量对应的值,该值指向build.gradle文件,打包自行选择

image.png
  • 同一个手机安装不同包名相同功能的包

image.png
  • 生成APK

image.png

gradle.properties

#jenkins中用到的变量 这个文件用于接收Jenkins配置的变量,名字
#服务器环境接口
BuildEnvironment=Development_xcglcs_wanda_cn
#编辑渠道,开发IDE或者Jenkins
BuildChannel=AndroidStudio
#安装包输出目录
BuildOutputDir=D\://androidstudio/work/WDSGQMSTrunk/wanDa_SGQMS_Trunk/dev/release
#是否要进行发布
BuildForPublish=NO
#是否灰度环境
BuildForGrayLevel=false

build.gradle

//******应用程序ID,务必保证准确性,不得随意更改,最外层目录******
def final mineApplicationId = 'com.cc.sg'

def releaseTime() {
//打包时生成的命名时间
    return new Date().format("yyyyMMdd_HHmm")
}

//定义签名文件路径
def getReleaseKeyStoreFile() {
    if ("Jenkins".equals(BuildChannel)) {
        return file("F:/work/cc/cc.keystore")
    } else {
        return file("F:/work/cc/cc.keystore")
    }
}



android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'

    defaultConfig {
        applicationId "com.cc.sg"
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 11
        versionName '1.x'
        ndk {
            // 设置支持的SO库架构
            abiFilters 'armeabi', 'x86'//, 'armeabi-v7a', 'x86_64', 'arm64-v8a','AArch64'
        }

    }
    signingConfigs {
        config {
            keyAlias 'cc'
            keyPassword 'cccccc'
            storeFile getReleaseKeyStoreFile()
            storePassword 'cccccc'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            signingConfig signingConfigs.config
        }
        debug {
            signingConfig signingConfigs.config
        }
    }

.....省略

    //两个维度,一个接口环境,一个发布渠道
    flavorDimensions("environment", "pubchannel")

    //开发环境域名
    def  DevelopmentDomain = "域名xc.wd.cn/wd"
    //预发布环境域名
    def  PrepubDomain = "域名10.1x9.2x.5x:x0x0"
    //生产环境域名
    def  ProductionDomain = "域名app.wd.cn"

    productFlavors {

        Development_域名(方便识别环境) {
            dimension 'environment'
            buildConfigField "String", "BuildEnvironmentType", "\"Development\""
            buildConfigField "String", "BuildEnvironmentSubType", "\"\""
            buildConfigField "String", "BuildEnvironmentDomain", "\""+DevelopmentDomain+"\""
            buildConfigField "String", "BuildEnvironmentServerURL", "\""+DevelopmentDomain+"/interactedApi/dispatcher"+"\""
            buildConfigField "String", "BuildEnvironmentChannel", "\""+BuildChannel+"\""
            buildConfigField "String", "BuildForPublish", "\"NO\""
            buildConfigField "boolean","BuildForGrayLevel",BuildForGrayLevel//boolean类型
        }

        Prepub_域名(方便识别环境比如192_168.1.1){
            dimension 'environment'
            buildConfigField "String", "BuildEnvironmentType",  "\"Prepub\""
            buildConfigField "String", "BuildEnvironmentSubType", "\"\""
            buildConfigField "String", "BuildEnvironmentDomain", "\""+PrepubDomain+"\""
            buildConfigField "String", "BuildEnvironmentServerURL", "\""+PrepubDomain+"/interactedApi/dispatcher"+"\""
            buildConfigField "String", "BuildEnvironmentChannel", "\""+BuildChannel+"\""
            buildConfigField "String", "BuildForPublish", "\"NO\""
            buildConfigField "boolean","BuildForGrayLevel",BuildForGrayLevel
        }

        Production{
            dimension 'environment'
            buildConfigField "String","BuildEnvironmentType","\"Production\""
            buildConfigField "String","BuildEnvironmentSubType","\"\""
            buildConfigField "String","BuildEnvironmentDomain","\""+ProductionDomain+"\""
            buildConfigField "String","BuildEnvironmentServerURL","\""+ProductionDomain+"/interactedApi/dispatcher"+"\""
            buildConfigField "String", "BuildEnvironmentChannel", "\""+BuildChannel+"\""
            buildConfigField "String","BuildForPublish","\""+BuildForPublish+"\""
            buildConfigField "boolean","BuildForGrayLevel",BuildForGrayLevel
        }


        //********开发环境(applicationId不一样)******
        beta {
            dimension 'pubchannel'
            applicationId mineApplicationId + ".dev"
            manifestPlaceholders = [
                    UMENG_CHANNEL_VALUE: "beta",
                    app_icon           : "@drawable/ic_launcher_test",
                    app_name           : "@string/app_name",
            ]
        }
        //********生产环境(默认渠道)******
        general {
            dimension 'pubchannel'
            applicationId mineApplicationId
            manifestPlaceholders = [
                    UMENG_CHANNEL_VALUE: "general",
                    app_icon           : "@drawable/ic_launcher",
                    app_name           : "@string/app_name",
            ]
        }
    }

    if("Jenkins".equals(BuildChannel)){
        android.applicationVariants.all {
            variant ->
                variant.getPackageApplication().outputDirectory = new File(BuildOutputDir)
                variant.outputs.all {
                    output ->
                        if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                            // APK输出文件名规则
                            def releaseApkName = "cc_${defaultConfig.versionName}_" + variant.flavorName + "_" + variant.buildType.name + "_" + releaseTime() + "_" + "From"+BuildChannel+".apk"
                            outputFileName = releaseApkName
                        }
                }
        }
//    }else{
//        android.applicationVariants.all {
//            variant ->
//                variant.outputs.all {
//                    output ->
//                        def outputFile = output.outputFile
//                        if (outputFile != null && outputFile.name.endsWith('.apk')) {
//                            // 输出apk名称为WDSG__pro/dev_version_time.apk
//                            def fileName = "cc_${variant.productFlavors[0].name}_V${defaultConfig.versionName}_${releaseTime()}.apk"
//                            outputFileName = fileName
//                        }
//                }
//        }
    }

    useLibrary 'org.apache.http.legacy'

}

如何导出jenkins配置文件
Basic guide to Import and export jobs in jenkins and Selenium

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容