美文网首页Android技术知识Android开发
Jenkins 自动化构建 Android 项目图文教程(二)

Jenkins 自动化构建 Android 项目图文教程(二)

作者: 拂晓是个小人物 | 来源:发表于2018-12-13 09:58 被阅读6次

    全文预计阅读时间:11分钟

    如果对 Jenkins 的搭建和简单构建 Android 项目还不熟悉的,可以查看下上一篇文章 Jenkins 自动化构建教程(一),有比较详细的介绍。

    本来第二篇要首先解决上篇的遗留问题,点击下载按钮直接下载对应的 apk 文件到本地?容我临时改变主意,毕竟这个只是锦上添花,调整下写的顺序,放到「参数化构建」之后再来解决这个问题。

    参数化构建

    什么是参数化构建呢?就是一些构建参数不是写死的,可以动态配置,从而构建出不同环境版本的产物。

    再看一眼要实现的参数构建页面:

    image

    话不多说,我们需要先配置项目「HelloJenkins」源码支持,比如打正式包需要的签名配置文件,打渠道包的一些配置,以及生成的 apk 的重新命名等等。贴一下 build.gradle 代码,相信不用解释了:

    apply plugin: 'com.android.application'
    def getDate() {
        return new Date().format('yyyyMMddHHmm')
    }
    def verCode = 2
    android {
        compileSdkVersion 27
        defaultConfig {
            applicationId "com.xialm.hellojenkins"
            minSdkVersion 21
            targetSdkVersion 27
            versionCode verCode
            versionName APP_VERSION_NAME
            resValue("string", 'app_version', APP_VERSION_NAME)
            // All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
            flavorDimensions "versionCode"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        signingConfigs {
            signingConfig {
                keyAlias KEY_ALIAS
                keyPassword KEY_PASSWORD
                storeFile file(STORE_FILE)
                storePassword STORE_PASSWORD
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.signingConfig
            }
    
            debug {
            }
        }
        
        // 少写 2 个只做演示
        productFlavors {
            yingyongbao {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
            }
            xiaomi {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
            }
            Ali {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
            }
        }
    
        // 修改生成的apk名字 AS3.2.1,AS3.0以下这里配置稍有不同   自行修改
        android.applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def newName
                def timeNow = getDate()
                if (variant.buildType.name.equals('debug')) {
                    newName = "HelloJenkins-v${APP_VERSION_NAME}-debug.apk"
                } else {
                    // newName = 'HelloJenkins-v' + defaultConfig.versionName + '-' + timeNow + 
                    // '-' + variant.buildType.name + '.apk'
                    newName = 'HelloJenkins-' + variant.flavorName + '-v' + APP_VERSION_NAME + '-' + 
                    timeNow + '-' + variant.buildType.name + '.apk'
                }
                outputFileName = newName
            }
        }
    
    }
    
    dependencies {
       ……
    }
    

    我把 APP_VERSION_NAME 和 签名信息配置在了 gradle.properties 文件中,就不贴出来。实际上项目的签名文件信息一般是不会直接加入到版本控制里边的,我们可以控制使用 Jenkins 构建的时候,动态的拷贝签名文件到指定的目录来进行打包。 这里因为是演示项目,直接跟随项目走了。

    这样我们可以用 AS 打包的时候控制版本,也可以通过 Jenkins 打包的时候,来指定具体的版本。

    下面说一下 Job 的配置:

    General -> 添加参数 -> 选项参数, 配置我们需要的参数

    image

    其它 「BUILD_FLAVOR」 「FLAVOR」都按这样配置好。

    配置 JENKINS_TIME,需要用到「Dynamic Parameter」插件; 添加参数 -> Dynamic Parameter

    image

    配置 APP_VERSION_NAME

    image

    最后一个比较重要的参数,需要用到Git Parameter插件,因为我用的版本控制为 git,这个插件可以很方便的让我们选取远程库上对应的 Branch or Tag 来构建。

    image

    参数化到此为止基本配置完毕。

    接下来修改配置打包 task 为打渠道包的命令,还知道在那里配置吧,就是构建的 task 配置:

    image

    这里当时碰到了一个坑,当我在构建的时候,我随便指定 「APP_VERSION_NAME」却没生效,一直都是项目原来的 版本号,后来发现是因为没有勾选高级里边的 Pass all job parameters as Project properties,这个意思就是说要使我们配置的参数化的参数作为源码项目的属性来用的。

    最后记得修改我们上传的 apk 的目录,直接引用我们声明好的全局变量; image

    Build History

    我们修改 Build History 更加好看些,构建环境 -> 勾选 Set jenkins user build variables,意味着使用 jenkins 自带的全局变量,同时修改 Build Name 如下: image
    #${BUILD_NUMBER}_${BUILD_FLAVOR}-${BUILD_TYPE}-v${APP_VERSION_NAME}-${NODE_NAME}
    

    保存,返回到 HelloJenkins 工程面板,参数化构建成功后就显示如下图:

    image

    点击下载对应的 APK 文件:

    我这里采用修改 Tomcat 静态目录的方式,指向一个目录,然后每次构建成功后,通过 shell 指令 ,把我们生成的 apk 拷贝到对应目录存档;

    添加 shell 指令

    设置 -> 构建 -> 增加构建步骤 -> 执行 shell 如图:

    image

    创建指定目录,并备份指定的 apk 文件,具体配置为:

    mkdir -p /Users/xialm/develop_wkspace/archiveData/apks/${JOB_NAME}/${BUILD_FLAVOR}/${BUILD_TYPE}/
    cp ${WORKSPACE}/app/build/outputs/apk/${BUILD_FLAVOR}/${BUILD_TYPE}/${JOB_NAME}-${BUILD_FLAVOR}-v${APP_VERSION_NAME}-${JENKINS_TIME}-${BUILD_TYPE}.apk /Users/xialm/develop_wkspace/archiveData/apks/${JOB_NAME}/${BUILD_FLAVOR}/${BUILD_TYPE}/${JOB_NAME}-${BUILD_FLAVOR}-v${APP_VERSION_NAME}-${JENKINS_TIME}-${BUILD_TYPE}.apk
    

    同时记得同步修改 build description (构建后操作 -> Set build description)

    <img src='http://127.0.0.1:8080/static/${JOB_NAME}/${BUILD_FLAVOR}/${BUILD_TYPE}/HelloJenkins_qrcode_${JENKINS_TIME}.png' width="150" height="150"><br><a href='http://127.0.0.1:8080/static/${JOB_NAME}/${BUILD_FLAVOR}/${BUILD_TYPE}/${JOB_NAME}-${BUILD_FLAVOR}-v${APP_VERSION_NAME}-${JENKINS_TIME}-${BUILD_TYPE}.apk'>点击下载-${appName}-v${appVersion}</a>
    

    修改静态目录:

    找到 Tomacat 所在目录 /Tomcat8/conf/server.xml 添加下面代码到 Host 节点,与 Valve 同级;

    <Context docBase="/Users/xialm/develop_wkspace/archiveData/apks" path="/static" reloadable="false"/>
    
    image

    重启 Tomcat,往静态目录随便放入一个文件,这里我放入一个 ase.apk,在浏览器里边访http://localhost:8080/static/ase.apk,如果能正常下载 ase.apk 文件,就说明配置上没有问题。

    好了,基于 Jenkins 的持续化集成到此为止,基本功能说的差不太多了。

    实际上这只能算是手动构建的,要想真正实现自动化构建,可以去配置自动拉取最新代码并构建,具体为:

    设置 -> 构建触发器
    有两种策略,任选其一即可:

    1. 设置 「轮询 SCM」 (Poll SCM)

      设置定时器,定时检查代码更新,有更新则构建,否则不构建

    2. 设置 「定时构建」(Build periodically)

      周期性的执行构建任务

    看图吧,这两种策略我用的不多:

    image

    后续可能会出一篇每次构建成功或失败,给相关开发或测试人员自动发送一封邮件通知的文章,后续也可能集成下网上流行的多渠道打包方案。

    终于写完了,话说我写了好久,尤其是这个截图感觉没处理好,压缩过了感觉还是很大,大家有什么好的方法可以告诉我哦。

    微信扫码关注,接收更多更全文章

    相关文章

      网友评论

        本文标题:Jenkins 自动化构建 Android 项目图文教程(二)

        本文链接:https://www.haomeiwen.com/subject/ogrmhqtx.html