美文网首页MobDevGroupAndroid框架工具
Android-解放双手告别测试-使用Jenkins自动化打包

Android-解放双手告别测试-使用Jenkins自动化打包

作者: 橘子周二 | 来源:发表于2017-02-13 15:33 被阅读16777次

如果你并不急于放到服务器上,只是想玩玩这个东西。你可以先下载好这两个下文用到的包。
下载Tomcat9.0.zip
下载Jenkins.war

先看一下最后效果图:
Jenkins上和邮件中效果-


.png
.png

主要步骤可分为三个步骤

  • 环境配置
  • 安装插件
  • 构建项目
    作为移动端项目为了效益最大化,我们还需要使用
  • 自定义参数配置
  • 二维码生成
  • 构建成功发送邮件,提供二维码图片

一 、Jenkins配置步骤

step.1 安装

准备一个tomcat版本不要太低,6.0以上。
下载最新版的Jenkins-war包。下载地址https://jenkins.io
将war包放入tomcat下的wabapps目录下,启动tomcat。
在地址栏输入localhost:8080/jenkins。

step.2 安装所需插件

按照下面的插件列表,搜索并勾选下载安装。务必不要缺失,造成后续配置缺少参数选项和部分功能缺失。
必要的插件列表:
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

</p>
9.Git plugin
10.GIT server Plugin
11.Gradle Plugin
12.Git Parameter Plug-In
</p>
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
如果你使用的SVN 还需要安装
Subversion Plug-in
Subversion Release Manager plugin

</p>插件比较多,保证网络状态良好否则个别容易失败,需要重新安装。

step.3 Jenkins配置-重点
  • 3.1 环境配置:
    进入:系统管理→Global Tool Configuration
    找到 JDK、Gradle、Git 三个模块。
  • JDK :
    别名=随意。
    JAVA_HOME=即环境变量中JAVA_HOME中的内容
  • Gradle:
    别名=随意
    GRADLE_HOME= gradle的安装目录路径xx/gradle\gradle-2.14.1

可以直接配置android studio 安装目录中的gradle


gradle1.png

如果你使用android studio 直接更新过gradle,他们在 系统盘\users\用户名\.gradle\wrapper\dist目录下。
gradle可以配置多个,兼容不同编译版本。

  • Git
    Name=别名
    Path to Git executable = git.exe文件的全路径(d:\progran files\Git\bin\git.exe)

  • 3.2 全局属性配置

sdk.png

** 需要和环境变量中的sdk路径相同**

  • 3.3 打包配置
    新建→构建一个自由风格的软件项目,进入到新建项目后,填写名称及说明。
    • 找到→源码管理,选择对应的代码管理工具,我这里使用的是git
      填写信息如图
      git2.png
      使用git还需要添加认证,即账号登陆,点击Add输入git账号信息
      git2.png
    • 选择→构建插件,我们准备的是gradle,所以选择 Invoke Gradle script
      选择配置的gradle的版本,在 taks 栏输入 命令:clean assembleRelease --stacktrace --debug
      点击保存!
  • 3.4 无属性构建
    点击立即构建,在 build history可看到任务执行。
    任务前有个蓝色小圆点,如果项目构建失败,任务前的小圆点为红色,构建成功依然为蓝色。
    同时在Console Output中可查看构建日志, 日志最后出现Finished: SUCCESS,即构建成功。
    如果出现 Finished:Failed构建失败,日志内容比较多,直接全局搜索error查看报错信息。
    进入→工作空间中可看到和工程目录一样的结构,找到apk包。

以上就完成了简单的部署和构建。但还不是我们的最终目的。如果你你只是为了给项目组提供Jenkins工具使用,以上部署和测试就算ok了。
下面是移动端自己必须掌握的,Jenkins自定义参数配置,和二维码生成。


step.4 自定义属性配置

使用自定义属性,我们需要使用到gradle文件和properties文件
配置需要使用的自定义属性
.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

.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'
}

上面我们配置了、渠道包、签名文件、版本号、apk命名、apk输出文件夹,在.properties文件中需要 一 一 与之对应。
下面我们进入到Jenkins对上述参数进行对应配置。

找到 参数化构建过程选项→打勾

params1.png
选择→添加参数
  • 选项参数使用 Choice
  • 字符输入参数使用 String Parameter
  • 时间参数使用 Dynamic Parameter
    在添加参数时,配置Name的值必须与.properties文件中定义的参数名称相同。
    我们需要用到的仅这三个,具体输入如下图。
    Choice
Choice.png

Dynamic Parameter

图片.png

String Parameter

String.png

将需要的参数按类别添加即可。

参数引用
找到上面我们使用Gradle 插件的 Invoke Gradle script
修改tasks命令,应用上面的参数,并勾选Pass job parameters as Gradle properties选项。如下图。

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

另外提一点,更换名称。因为原命名只是构建编号,没有识别度。相信你从无参构建时就想更换了。

图片.png

进入项目配置找到→构建环境→勾选Set build Name 设置参数

图片.png

重新打包,如上图我们使用了BUILD_NUMBER 自带参数,以及 APPNAME、APP_VERSION、BUILD_TYPE ,最后效果如下图。

图片.png

二、生成二维码

这里必须用到Python这个陌生的语言。第一次接触python,虽只用到冰山一角,但也体会到了他插件化集成的便捷性。

** step.1 准备工作**:

  • 为tomcat 配置文件下载路径
    进入tomcat安装目录→conf→server.xml文件,在Host节点中添加如下配置。
      <Context  reloadable="true" docBase="E://JenkinsApk" crossContext="true"         path="/JenkinsApk"/>
  • 下载安装Python和pip,依次配置环境变量。
    Python的安装及pip插件工具的安装,直接参照此博客即可:python 安装步骤博客

  • 安装图片支持插件Pillow和二维码生成库qrcode
    Pillow 就是Python Imaging Library(PIL)的进化版。Pillow由于更新版本的问题,使用普通插件安装命令可能会失败。在安装Pillow之前,确保pip能正常使用,最好是先随便找一个包安装一下。然后命令行输入 pip list 检查是否安装成功。

    安装Pillow
    命令1:pip install Pillow (失败)
    命令2:pip install -I --no-cache-dir -v Pillow (成功)
    至于为什么失败,解释颇多也不想深究。暂且都记上多试试。
    安装qrcode 命令:pip install myqr

    qrcode这个库还是初略看一下比较好,在README文件中有详细的安装使用说明。
    下载中途如果失败, 重新输入命令执行即可,网络不稳定容易出现超时,他没有自动重连机制。
    安装完成后,在Jenkins中配置Python全局变量。这样我们才能使用Python的脚本命令,入下图。
    进入 →系统管理 →系统设置 找到 Enviroment variables

Paste_Image.png
step.2 生成二维码

进入项目→构建→增加构建步骤,选择Execute windows batch command,填写qrcode生成二维码的命令

Paste_Image.png

上述命令中使用到的$参数,是通过动态拼接指定对于的apk文件。
生成一个jenkins_app.png的二维码图片,输出路径为 -d之后的路径。
此时点击保存,再重新构建一次,在配置目录下应该能找到生成的二维码图片了。

** step.3 展示二维码**
找到构建后操作 → 增加构建后操作步骤→Set build description
使用html标签引用我们的二维码图片和apk文件即可,当然这里我们依然需要动态拼接地址,来锁定目标。

Paste_Image.png

完整代码-

![](http://localhost:8080/JenkinsApk/${BUILD_TIME}/jenkins_app.png) <br>
 <a href='http://localhost:8080/JenkinsApk/${BUILD_TIME}/${APPNAME}-v${APP_VERSION}-${PRODUCT_FLAVORS}-${BUILD_TYPE}.apk'>�点击下载-V${APP_VERSION}.apk</a>

OK!大功告成,保存再次打包。就能得到文章开头我们贴图的效果了。
**PS:对于二维码和apk的存放路径,需要预先定义好。为了清晰这里使用时间参数BUILD_TIME 作为文件夹区分,二维码图片则只需要用同一名称。
所以apk下载地址:xx/download/2017-02-10-15-25/apk参数拼接名称.apk
二维码图片地址:xx/download/2017-02-10-15-25/jenkins_app.png
**


三、发送通知邮件

Jenkins自带了邮件通知功能,但是不太好用。跟着老司机的建议使用Email Extension Plugin来做。

step.1 配置
进入→系统管理→系统设置→邮件通知
填写如下配置

Paste_Image.png
内容填写完成后,勾选通过发送测试邮件测试配置填写接受邮箱进行测试,如果成功会收到一封如下的邮件。 Paste_Image.png

如果失败,在下面会输出红色异常信息,根据异常修改配置再测试直到成功。
这里直接使用了公司邮箱服务器,一次就通。
之前使用smtp.qq.com测试一直失败,SSL协议勾选,端口465。如果有同学配置好了,希望能在下方评论或者私信我下。

**step.2 配置邮件内容 **
找到 Extended E-mail Notification 高级,填写配置信息。上面的测试通过,只需要抄上来就好了。

Paste_Image.png
下面是邮件内信息的拼接参数,我这里只是一个我喜欢的模板,个人喜好和项目组要求可随意修改参数 Paste_Image.png
配置内容搞定,下面进入项目中对邮件配置进行引用。
step.3 添加邮件通知

进入→配置构建后操作增加构建后操作步骤Editable Email Notification,填写如下配置

  • 接收者
    我在顶部的自定义参数中设置 有 EMAIL参数,所以这里引用即可。你也可以直接在这里填写邮件地址,一个或者多个。


    Paste_Image.png
  • 发送者和邮件内容
    下面发送者为,Jenkins 管理员邮箱
    Subject 和 Content 都是引用我们在系统设置中的配置内容。


    Paste_Image.png

保存重新构建就大功告成了。
如果遇到问题欢迎下方评论区留言,有留必回。( - - 我也是多亏了其他博主为我解惑)


此篇是在我部署发布完成后,回头再写的。遇到问题还不少。
比如,代码中gradle 中的版本 和Jenkins上选择的Gradle版本如果不一样有时会打包失败。python 安装 PIL失败,使用qrcode库时按照博主的命令无法执行等。

也有其他方式,使用curl 命令行上传到蒲公英(用curl 很久了,但是上传到蒲公英总是返回空数据 大写尴尬),将返回信息打印到日志输出,使用正则匹配到二维码图片连接,但这种方式远不如本文本地生成二维码来的利索和便利,而且保证了每一个apk都有一个唯一的二维码。


十分感谢以下博客的分享:
Android Jenkins+Git+Gradle持续集成-实在太详细
利用Jenkins玩转Android自动打包发包
windows下面安装Python和pip终极教程

相关文章

网友评论

  • 56e9c42628b5:What went wrong:
    Could not compile build file '/root/.jenkins/jobs/APK_TEST/workspace/app/build.gradle'.
    > startup failed:
    build file '/root/.jenkins/jobs/APK_TEST/workspace/app/build.gradle': 56: unexpected token: + @ line 56, column 56.
    APPNAME+"-v"+APP_VERSION + - + variant.
    ^

    1 error
    老铁 这个是什么原因呀?
  • Vander丶:博主,我设置邮件通知,在全局配置里面都测试成功了,为什么在Job里面就一直是发送异常

    提示:SendFailedException message: 553 authentication is required

    猛调一下午,还是找不到原因.心态炸了,有遇到这个错误的小伙伴,欢迎解答.
  • 侯大虎虎:那个博主,我有一个小小的请求,能否把你用的Dynamic Parameter Plug-in发我一份?我这个版本已经搜索不到这个了,说是安全原因不让用了。。。 我邮箱13261209796@163.com
    橘子周二:@侯大虎虎 抱歉。。。我的早就不在了 你到论坛翻一翻应该有人有
  • 7ace6f285208:楼主有试过使用android studio3.0也就是classpath 'com.android.tools.build:gradle:3.0.0'来
    配合jenkins自动构建吗,看日志是会在build时出现mergeResource错误,把插件版本降成2.x版本就没问题,郭大神的https://www.jianshu.com/p/55efb9407fa2这篇文章也只是绕了过去,没解决这个问题
    橘子周二:@柏_d340 对于4.1版本的gradle确实有诸多变化,我在4.1也遇到比较多问题。比如对kotlin的支持问题比较多。最后我往上调到了4.3版本。出错几率下降了不少,你不妨试试
    7ace6f285208:@_RANGO 已经试过了,单独gradle打包是没问题的,具体过程郭神在那篇文章里面也有写,基本确定是3.0插件变化导致的
    橘子周二:这个错误与jenkins没有必然性,你尝试用gradle 命令行去打包看看。
  • Shawpoo的:smtp.qq.com我测试成功了,就是在用户名那填写邮箱的时候没有后缀就可以了。
    橘子周二:@Shawpoo :+1: 3q
  • 耿直boy:我的jenkins 没有这个选项Pass job parameters as Gradle properties
    橘子周二:@耿直boy 抱歉,我很难帮你分析啦。我也不知道具体什么情况
    耿直boy:@_RANGO 我参考网上的插件配置,一一对应之后还是没有那个选项
    橘子周二:@耿直boy 我也蛮久没有碰这个了jenkins比较老了。但是找不到参数配置项,无非就是插件没有安装好,或者环境变量没有配好
  • KT_11:学习一下,感谢分享:+1:
    橘子周二:@Klay_ :smile: 很开心能帮到你
  • Rtia:您好,请教个问题:我用Jenkins打包成功了,可是打出来的apk不是保存到我指定的Jenkins目录下。
    也就是说if("true".equals(IS_JENKINS))这个判断返回的是false。可是我参数化构建的有写IS_JENKINS这个字段,且与gradle.properties里面是一致的。,请问是什么原因,非常感谢~
  • 2de49878ced2:请问IS_JENKINS参数在什么时候会变成"true",没有看到您在哪里有重新赋值。望解答。
    橘子周二:@2de49878ced2 jenkins 里的gradle插件环境变量配好了吗
    2de49878ced2:@_RANGO Invoke Gradle script 时没有Pass all job parameters as Gradle properties 选项,只有Pass all job parameters as System properties和Pass all job parameters as Project properties,是哪里出错了吗
    橘子周二:@2de49878ced2 上面截图只是示例部分参数类型,你按照你想要的来配置就可以了
  • b402d8a45f4e:看了好几篇文章 还是你这个最靠谱了
    橘子周二:@lzcmagic :relaxed: 能帮到你很开心
    橘子周二: @lzcmagic 我也是看着前辈学习后记录的呀😋
  • 任珉豪:楼主 还是之前的技术小细节没有解决掉,有没有联系方式,私聊你
    橘子周二:@2de49878ced2 勾选Pass job parameters as Gradle properties 将会在构建时侵入gradle文件,修改对应属性
    2de49878ced2:请问IS_JENKINS参数在什么时候会变成"true",没有看到您在哪里有重新赋值。望解答。
    橘子周二: @任珉豪 你到diycode论坛发帖子吧,贴上图。或许我可以帮你分析
  • 570cb87f4094:您好,build成功,但是apk安装不了,提示解析软件包出错,您知道是什么原因么?
    570cb87f4094:@_RANGO 不小呢,比本地Studio构建的,稍微大个半兆
    橘子周二: @大渝余文乐 apk文件损坏了,看apk文件是不是特别小。
    这样的问题我建议你先自己百度一下哦
    570cb87f4094:是release版本的,我本地用studio构建release版本是可以成功的
  • 任珉豪:参数动态化构建问题,ci平台 choise了相应的参数,但是buildConfig 文件的字段没有改变成功是什么问题,需要注意哪几个点?
    侯大虎虎:我这360浏览器参数是可以传递过去,但是换到chrome和火狐参数都无法传递
    橘子周二: @任珉豪 猜测原因如下:
    1-没有在.gradle文件中设置.properties文件中的参数配置。
    2-在jenkins中选择的构建插件不对。
    3-jenkins中配置的参数名和项目中配置的不同。
    问题1 可参照我的另一篇文章,“Android配置环境套路 build.gradle + gradle.properties +BuildConfig.java+占位符”
    问题2 3 本篇中有详细步骤可以核对
  • 4d3bf4cac28c:'myqr' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    cmd中可以运行,有遇到的么?
    4d3bf4cac28c: @_RANGO 👌,周一去公司看一下,昨天弄一天没弄好😂😂😂
    橘子周二: @kailaisi 这个错误很普通,就是说找不到执行文件
    橘子周二: @kailaisi cmd可以运行说明安装成功了, 本地环境正确。检查过jenkins中的Python环境产量正确吗
  • zzl93:写的不错
  • f69308675ebf:大侠。求加qq 396558603. 目前在本机摸索的。tomcat➕Jenkins 链接远程gitlab服务器. Jenkins的Jdk gradle git都已經配置完成了 打一个简单的包是可以的 参数化配置搞了一部分。有一部分没有搞定。还有后续的还没尝试。目前觉得卡在 插件下载上。比如生成时间的参数插件安装不上。有的插件都找不到。求大侠知道
    _文森_:写的很详细,赞
    橘子周二:支持 md发帖,所以你可以直接帖图
    橘子周二::smirk: 你可以到这里发帖子哦
    https://www.diycode.cc/
  • 03b655eda1e4:Dynamic Parameter Plug-in 这个插件我怎么找不到额? help~~
    橘子周二:@水告非文 我具体不记得了,文章最上面给出了我使用的war 包下载地址:smiley:
    03b655eda1e4:@_RANGO 还是没,你是war开启后就直接能搜到这个插件? 你的Jenkins是哪个版本的呀?
    橘子周二:只搜索Dynamic Parameter试试 不要加 plug-in
  • 86a26a344df8:能加你QQ聊一下吗,我弄了好多遍还是没弄好了
  • Bo灬:爱死你了,明天我就试试

本文标题:Android-解放双手告别测试-使用Jenkins自动化打包

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