Android基于Jenkins+Git+Gradle+七牛云+QR-Code实现自动打包、上传七牛云并生成二维码

  题目很长,本篇文章内容也如题目所示,介绍工作中借助自动化手段,提高团队间工作效率的一种很好的方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

  对于移动端的开发和测试,一般流程是测试人员向移动端开发人员要测试包,开发通过本地IDE(Android开发一般是Android Studio)打好包后通过各种媒介传给测试人员。测试人员拿到包后开始测试,一但发现bug,会通知开发人员修改,然后再重复上面的过程。

  为了简化工作流程,提高效率,可以选择jenkins做持续集成。将jenkins部署在服务器上,通过jenkins实现app自动化打包。这样一来,开发人员每次只需将代码提交到版本控制系统(如git)的远程代码库上,测试人员可以根据自己需求和时间使用jenkins进行自动打包。实现开发与测试的“解耦合”。

  网上关于Android开发Jenkins部署的文档有很多,不过绝大部分文档都是上传蒲公英等网站,这些网站能自动生成下载二位码并返回,可以减少部署难度,网上可参考的资料也更多,推荐优先选择这些网站。但是如果你在的公司并没有用蒲公英(比如我目前的公司),而是用的七牛云等没有返回二维码只是可以生成下载链接的网站,那么这篇文章或许能够帮到你更多。
  ♨ 综上所述,没钱就要多努力,人丑就要多读书。

  特别提示,下面的内容可能图比字多,因为配置这种东西我认为还是图更能说明问题。

1. Jenkins部署

  这部分网上资料太多了,本人也是按照网上的教程一步一步配的。这里就不一一复制粘贴写了。可以自行百度,也有几个推荐的网址:

1.1 推荐安装插件

  • Branch API Plugin
  • build timeout plugin
  • build-name-setter
  • Credentials Binding Plugin
  • description setter plugin
  • Dynamic Parameter Plug-in
  • Environment Injector Plugin
  • fir-plugin(可选)
  • Git plugin(可选)
  • GIT server Plugin(可选)
  • Gradle Plugin
  • Pipeline: Basic Steps
  • Pipeline: Build Step
  • Pipeline: Input Step
  • Pipeline: Nodes and Processes
  • Pipeline: Stage Step
  • Post-Build Script Plug-in
  • SSH Slaves plugin
  • Subversion Release Manager plugin(可选)
  • Timestamper
  • Workspace Cleanup Plugin
  • Subversion Plug-in(可选)

(不一定都能用上,反正我是能装的都装了)

2. JDK、androidSDK、androidNDK等配置

回到主界面->系统管理->全局属性: 配置好JDK(NDK)与PYTHON。
注意:
1. 相关配置需要Overall权限,在 系统管理-ConfigureGlobal Security 里配置账户权限。
2. 这里的键需要和服务器环境变量内的Android SDK/NDK目录的键一致。

2.1 安装Gradle

点击系统管理-Global tool configuration

  gradle可以直接用服务器的安装地址(如果服务器已安装),也可以选择自动安装,自动安装jenkins在第一次打包的时候回会自动下载,因此第一次打包时间会很长。
♨ 这里有个小问题,如果gradle勾选自动安装,勾选框的上面name这个输入框尽量以后不要改动,亲自入坑测试发现仅仅改动name后,下一次打包时会从新下载gradle(原因是自动安装的目录名就是配置的的name,改动name相当于改了安装路径,gradle会在新的安装路径下重新下载安装)。

3. 创建项目并打包

前面主要是在配置环境,环境搭好下面就可以配置项目了。

3.1 创建项目

回到主界面->新建->构建一个自由风格的项目->ok:

3.2 git配置

进入到刚创建的项目中点击“配置”,找到“源码管理”,选择“Git”。

3.3 构建–Invoke Gradle script

Gradle Version:选择系统管理里配置的gradle-name
Tasks:填gradle构建命令:clean是打包之前清除一下上一次编译记录。assembleRelease 或者assembleDebug,对应AS里release和debug版的包
其他请自行百度gradle构建命令
Pass job parameters as Gradle properties:如果需要参数化构建,需要勾选。参数化构建内容在下面一节。

3.4 参数化构建

  参数化构建的主要功能是将jenkins里配置的参数注入到Android项目中的配置里,而勾选Pass job parameters as Gradle properties这个选择框可以帮我们侵入到gradle.properties文件中替换相同名称变量的值。达到入侵的效果。

  由于build.gradle文件能够直接引用gradle.properties文件中的属性,因此入侵的参数如果要在build.gradle中使用的话可以直接调用。然而我们有些入侵的参数需要在java代码里用到,这就需要用到defaultConfig里面的buildConfigField方法。

上面一大波操作可能有点令人窒息,上干货:

3.4.1 先是参数配置

勾选参数化构建流程,选择添加参数:

可选的参数类型有很多,这里只介绍Choice ParameterDynamic Parameter。其他参数类型可自行尝试。

Choice Parameter:是单选参数,配置时列出所有参数,用换行隔开,如下图:

  配置完成后点击保存,回到项目页面,点击Build with Paramters,可看到刚刚配置的单选效果。开始构建后,所选择的值就会被注入到gradle.properties文件中替换相同名称变量的值。如下图:

Dynamic Parameter:这个参数的值会根据你添加的Groovy脚本自动生成。配置方式如图:

其他的参数以及使用方法请自行查阅。

3.4.2 jenkins入侵参数的调用

  我们知道参数化构建是将jenkins配置的参数侵入到gradle.properties文件中替换相同名称变量的值。因此,第一步就是要在Android项目下的gradle.properties文件中写入相同名称和初始值。

构建成功后,这里的EXAMPLE的值就会被jenkins上配置的EXAMPLE多选框选中的值替换。因此在程序中可以像使用gradle.properties中的参数一样使用入侵的参数。

build.gradle中调用gradle.properties的参数:
build.gradle中可以直接可以调用gradle.properties中被jenkins修改过值的参数。这里以SDK_VERSION相关参数为例,如下图:
gradle.properties:

build.gradle:

java代码中调用gradle.properties的参数:
Java代码中调用gradle.properties文件里的参数需要build.gradle文件做一个桥梁,具体就是在build.gradle文件里调用buildConfigField方法。如下图:

这里的buildConfigField就是自定义一个常量,第一个参数表示类型,第二参数表示常量名,第三个参数传入的是值。这里${EXAMPLE}就是传入的gradle.properties里EXAMPLE变量的值。通过这个方法Gradle就会在BuildConfig这个类中加入常量API_HOST,如下图:

通过jenkins构建之后BuildConfig类里的的API_HOST的值就会被jenkins中配置的EXAMPLE的值替换。

下一步,在java代码里中调用BuildConfig.API_HOST,取到jenkins配置的变量的值:

1
public static String LOGIN_URL = BuildConfig.API_HOST

参数注入在实际工作中还是有很多用途的,比如可以用来配置不同环境、修改某些参数等等。

4. 七牛上传

4.1 编译并安装七牛插件qiniu-plugin

  经过上面几步出神入化的微操之后,我们已经可以在jenkins服务器上进行打包了,下面就是要将打好的apk上传到七牛云上,方便各位大佬下载(管开发要安装包的都是大佬,反正我是这么认为的)。

  将apk上传七牛云有几种方法,Python好的同学可以自行研究下命令行上传。这里介绍一种老少皆宜的方法:使用七牛插件上传。但是,目前在七牛开发者中心-Jenkins七牛插件中已经找不到相关插件了,不过在万能的github上还可以找到源代码:https://github.com/ipy/qiniu-plugin

推荐一个网址可以参考:http://blog.csdn.net/fengshi_sh/article/details/50669754
但是该网址里面的很多代码有误,这里亲测并修改了:

下载好源码后,建议修改QiniuPublisher.java文件

  • 1 注释掉System.console().printf(profile.getName() + "/n")
  • 2 在第107行

    1
    2
    3
    //String keyPath = path.getRemote().replace(wsPath, "");
    //String key = keyPath.replace(File.separator, "/");
    String key = path.getName();
  • 3 由于java8环境,还要修改pom.xml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    diff --git a/pom.xml b/pom.xml
    index 0f577be..4d7c73d 100644
    --- a/pom.xml
    +++ b/pom.xml
    @@ -13,7 +13,7 @@
    <parent>
    <groupId>org.jenkins-ci.plugins</groupId>
    <artifactId>plugin</artifactId>
    - <version>1.509.4</version>
    + <version>1.554.1</version>
    </parent>

    <groupId>org.6wind.jenkins</groupId>

修改完成后,就可以编译了,步骤如下:

在”终端”里执行

1
2
3
4
5
6
7
brew install maven 
cd /Users/apple/Downloads/qiniu-plugin-master //进入源码文件夹
export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n"
mvn hpi:run //会运行起一个模拟环境
^q //退出该模拟环境,
mvn clean //删除target,第一次无需执行这个
mvn package //打包生成Tagret,新生成的.hpi文件就在target下

最后,将编译好的.hpi导入jenkins插件: 系统管理–管理插件–高级–上传插件
然后在增加操作后步骤选项框里就能看到上传到七牛的选项了!

4.2 七牛设置项(系统管理–系统设置)

Accesskey/Secretkey 值可在七牛账户中查看,对应AK和SK

4.3 配置上传到七牛的相关参数

增加构建后造作步骤—>上传到七牛

选择上传到七牛后显示如下:

需填写的内容:
七牛配置项:系统设置-七牛-设置项名称
文件路径:需要上传的文件路径
要上传到的 bucket:上传到七牛的空间(文件夹)名称
勾选“构建失败则不上传”

上传成功后,七牛官方给出的反馈日志如图

构建后在jenkins构建项目的Console Output里能看到相关日志,证明上传成功。

5 生成七牛下载链接和二维码

最终效果如下图,构建完成后会显示在项目主页的构建历史里。

5.1 生成七牛下载链接

  由于请求七牛的返回值里没有具体链接,只有目标资源的最终名字。而七牛的bucket文件夹一旦创建,这个bucket的外链默认域名是固定的,因此七牛的链接需要手动把bucket下载链接拼上。(目前七牛bucket文件夹生成的临时域名需要绑定自定义域名,但是在这里并不影响我们的配置,配置了的话换成自定义域名就好。)

链接的展示需要用到:构建后操作—Set build description
在这个插件里写好的链接会出现在此项目主页的构建历史里。

  使用这个插件之前,需要到系统配置—安全配置中,将MarkUp Formatter修改为Safe HTML,这样展现的二维码和链接才能显示成H5标签,否则会显示成文本。

接下来配置Set build description。

  • 第一行是正则表达式,这里的”key”:”(.*)”是用来匹配七牛返回链接里的”key”:””的值。
  • 第二行是显示的h5代码,这里是生成了能点击的链接,\1表示引用上面正则里的第一个值。

构建成功后生成这样的下载链接:

5.2 生成下载链接的二维码

  由于七牛并不像蒲公英等网站能自动生成二维码,因此需要自己手动去生成

  在gradle版本升级到了4.1以上的时候,由于每次生成文件目录是一样的,而gradle又执行了clean命令,因此每次执行打包命令时output下的目录都会被清理(但是可以节省空间),因此用本地apk的路径生成二维码不太合适。这里选择将七牛的下载链接生成二维码,保证可控时间内链接都有效,而且可以外网访问。

  按照正常逻辑来讲,应该是先上传七牛之后再生成七牛下载链接的二维码,毕竟没有上传的时候下载链接应该是不存在的。但是,由于生成二维码需要用到Execute shell这个插件,而这个插件在jenkins中是在“构建”这个模块下配置的,而七牛上传插件是在“构建后操作”这个模块下配置的。如图所示:

  也就是说,在上传七牛以前就要生成下载链接二维码!!!

  是的,就是这种令人窒息的操作。方法其实很简单,这里还是用了那个小技巧:七牛的bucket(文件夹)一旦创建,这个bucket的外链默认域名是固定的。

  也就是说,七牛的下载链接在上传七牛以前我们就能自己拼好(上传的文件名是自己定义的),二维码因而也可以在上传之前生成。

下面是具体配置:

需要用到pythonqrcode这个库。

第一步:下载安装Python和pip
windows和Ubuntu安装方式有点区别,请自行百度。

命令行输入:pip list 检查是否安装成功

第二步:安装Pillow
由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。

命令行输入:pip install Pillow

第三步:安装qrcode

命令行输入:pip install myqr

第四步:Jenlins中配置Python环境变量

进入 →系统管理 →系统设置 找到 Enviroment variables

第五步:生成二维码指令
进入项目→构建→增加构建步骤,选择Execute shell(Ubuntu),或者Execute windows batch command(windows),填写qrcode生成二维码的python命令:

格式如下:
myqr apk下载链接 -n 二维码命名 -v 1 -l L -d 二维码存储路径
具体指令含义详见: https://github.com/sylnsfar/qrcode

第六步:展示二维码

构建后操作 → 增加构建后操作步骤→Set build description
在原有七牛下载链接上添加刚才二维码保存的图片路径:

最后点击保存。

在项目页面点击

大功告成!!!!

Powered by Hexo and Hexo-theme-hiker

Copyright © 2018 - 2023 TEN-Z'S BLOG All Rights Reserved.

访客数 : | 访问量 :