前言
参数化构建目录
- 根据版本号构建项目(svn)
- 设置构建渠道版本
- 构建后文件过滤
- 结束语
- 参考链接
这一篇是利用Jenkins进行Android自动化构建
的姊妹篇,前者主要介绍了Jenkins如何搭建,以及如何配置Android的环境;这一篇主要介绍如何利用参数化构建,让Jenkins自动化构建有更多可能性。搭建Jenkins的环境还是Mac系统,版本控制工具是svn,一些命令上的使用和Windows系统有一定区别,文章中会指出;下面我们开始可玩性很高的参数化构建。
根据版本号构建项目(svn)
根据上篇,我们知道可以通过svn地址构建项目,但是根据地址获取到的项目,一般都是最新版本,就是最新提交的代码版本,有时候项目中新添加了一个功能,我们也把项目提交了,但是这个时候老板说:这个新功能先不上,按之前的版本打包,这个功能下次再上。那这时候我们就不能拉取最新的代码,应该选择上一个版本,或者更往前的版本,那在Jenkins中我们应该怎么选取svn的版本号呢?
Extended Choice Parameter插件
插件安装
Extended Choice Parameter这个插件在默认情况下没有安装,需要我们在插件管理中自行进行安装,操作步骤如下:

在首页Manager Jenkins找到插件管理项,点击Manage Plugins选项,进入插件管理界面。

按照上面的步骤操作:
- 1、选择Available标签
- 2、在搜索框输入Extended Choice Parameter
- 3、勾选搜索到的插件
- 4、点击下载并重启jenkins
等插件下载完成后,就可以在我们要构建的项目中使用它进行版本的选择了。
插件应用
接着我们来看看这个插件怎么应用。首先找到我们的项目,找到配置项:

点击配置,就可以看到项目中之前设置项,我们在General配置中进行操作:

勾选This project is parameterized选项,接着在Add Parameter中选择我们安装的Extended Choice Parameter插件

选中后就可以看到Extended Choice Parameter相关的很多参数可以配置。我们先看第一部分:

命名和展示设置
- 首先填写Name,名字可以随便写,这个名字我们在后面配置中还会使用到
- Description,是描述信息,我们可以写上获取这个参数的用途,在后面构建内的过程中会在界面上展示
- 在Basic Parameter Types配置中
- Parameter Type指的是参数的选择类型,点击下拉箭头可以看到有单选、多选、选择框、按钮选择等很多选项,可以按照自己的需求进行选择,我们这里是用来选择构建的- svn版本号,所以我们选择- Single Select选项
- Number of Visible Items是指在界面上显示可选的条目数,这里写10,表示供我们选择的版本数是10个
- Delimiter是获取每个版本号用什么符号间隔,这里写的是英文模式下的- ,逗号;(我尝试了用英文的- .句号,获取到版本号展示出的是横向排列的,- ,逗号是竖向排列,等会在构建的时候可以看到)
获取版本号
下半部分的Choose Source for Value配置就是如何获取svn的版本号,这里提供的方法有四种:
- Value直接写入想要构建的版本号,这个需要在构建前每次都要进入项目配置重新编写数据
- Property File读取属性文件,没尝试过
- Groovy Script编写Groovy脚本获取
- Groovy Script File通过Groovy代码文件获取
因为这个插件是支持Groovy语言的,所以这里我们选择Groovy脚本获取,一是可以自动的获取版本版本号,二来相对于写配置文件,脚本更简便一些。获取svn版本号的脚本如下:

脚本内容:
def cmd=[“/bin/bash”,”-c”,”svn log 项目的svn地址 | grep -E r[0-9] | cut -b 2-6 | head”].execute().text.readLines()
简单解释一下脚本的意思:
- svn log 项目的svn地址 从svn获取log项目的提交日志,有兴趣的小伙伴可以打开终端尝试一下,获取到的是项目的所有日志

- 接着 grep -E r[0-9]是对日志的第一次过滤,匹配以r开头包含数字0-9的字符;grep命令支持部分的正则表达式可以匹配到我们想要的内容,加上grep命令后,获取到日志,是以字母r开头的一整行日志,并不是我们最终想要的版本号,需要再次过滤

- cut -b 2-6在一行日志的基础上再进行过滤,从第- 2个字符开始到第- 6个字符结束进行剪切;因为是获取版本号,我们需要将- r字符过滤掉,从第二个字符开始是我们的版本号,因为我举例的项目最新的版本是五位数,所以最多是到第六位,截取后获取到的字符串就是我们的版本号;这个数字需要根据项目提交记录来具体设置,比如一个新项目的最新版本号是- 1000,那么命令就需要改成- cut -b 2-5,如果是- 100就改成- cut -b 2-4,以此类推

- 最后head命令,就是限制展示的条数,如果不写具体的数字,默认是10条,如果想只展示5条,需要将命令改成head -5,这样就可以获取到我们想要版本号了,我们在命名和展示设置中的Number of Visible Items设置的为10,所以脚本中的head也设置为默认

- 后面的execute().text.readLines()是执行Groovy脚本,以文本的形式输出一行。
整个脚本运行完成,会获取10条版本号数据供我们选择,Parameter Type设置的为单选,我们选择其中的一个就可以将选取的值赋值给我们命名的name字段SVN_REVERSION,我们先保存看一下效果。
特别提醒:
这里说一下这个脚本只在Mac系统上好使,如果用的Windows系统需要更换findstr相关的过滤命令,但是我尝试了好久,搜索了很多教程,不管是用findstr命令过滤、安装下载grep命令,或者是使用Python脚本,在Windows系统上还是没能成功的实现过滤,最后使用了一种手填的方式实现,才解决了问题,在下面也会简单介绍一下手动的方法,如果有知道在Windows系统如何编写Groovy脚本过滤的朋友请告诉我,感谢!
构建选择版本号
保存完以后,回到项目的首页,这时候可以看到我们界面上的Build Now变成了Build with Parameters

点击Build with Parameters选项

我们在插件的配置部分填写的信息和设置都展示在了界面上,描述信息、展示十条数据、name等。点开下拉框就可以选择想要构建的版本号了;到了这一步根据版本号构建项目还没有结束,因为这里只是展示以及获取到了SVN_REVISION版本号,并没有在构建时使用,如何将版本号应用在构建过程呢?
构建过程添加版本号
点击配置,找到Source Code Management选项,将版本号配置在Repository URL选项,添加的形式是@$你的name,我们这里命名的是SVN_REVISION,所以在在Repository URL选项中的配置为:svn地址@$SVN_REVISION

保存配置,再次点击Build with Parameters选项,构建成功的项目,就是按照我们选择的版本号进行构建的了。
如果不确定自己构建出来的项目,是否是按照版本号进行构建的,可以打开此次构建项目的控制台日志,日志中,可以看到构建的版本和日志信息。

如果日志输出的版本号和你选择的一致,则说明配置正确,如果始终是最新的版本号(默认最新),则需要检查配置是否正确,祝你成功😊。
String Parametre手动填写版本号构建(Windows系统)
上面我提到了,在Windows系统上,进行了多次尝试;改成findstr命令也好,下载grep命令也罢,亦或是使用Python脚本获取也好,就是不能实现自动获取svn版本号(摔)。但是部署的Jenkins环境转移到了Windows系统上,不得不用,所以只能另辟蹊径了(有知道如何智能获取版本号的小伙伴,务必分享一下获取流程啊);
我们在上一步知道,最后应用版本号的时候是在Repository URL上追加的获取到的版本号,前面界面的大部分内容也是如何智能的获取,但是现在我们没有办法智能获取,只能手动填写,如果查看svn的提交记录,也是可以看到这个版本号的,把想要打包的版本号,直接追加到Repository URL后面也是可行的,跟智能获取的效果一模一样,但是如果这样直接写的话,每次构建都需要先改一下版本号,感觉有点麻烦,这里介绍一种稍微稍微简便一些的方法(没办法了☹️)。
利用参数化构建,还是进入到配置项,之前选择的是插件Extended Choice Parameter,这次换成String Parametre

在添加后的界面上填写信息,name我们还是写SVN_REVISION,Default Value默认值可以不写,Description描述信息,可以写上,描述一下填写这个参数的作用:

Extended Choice Parameter和String Parametre两个选择其中一个就可以,如果可以智能的 获取到版本号,那么就选前者,否则就选后者。
填写完信息别忘了在Repository URL添加上svn地址@$SVN_REVISION。保存回到项目首页,点击Build with Parameters选项,这时候界面变成了下面这样:

每次构建前,需要我们查看svn的日志,将需要的 版本号填写在空白处,这样构建出来的项目,也是按照填入的版本号构建的。
设置构建渠道版本
介绍完了根据版本号构建项目,再来说说如何进行多渠道打包,上篇文章在Build选项中介绍的Task命令assembleDebug,构建出的包是测试包,如果想要打正式包呢,就需要将命令修改成assembleRelease,那如果项目分了付费版和免费版,或者分了海外版和国内版等等,这时候我们该怎么去进行呢,每次构建之前进来修改Task命令吗?这时候还是需要参数化构建来救场。
Choice Parameter
这次在配置中的选项是Choice Parameter

在界面上填写我们需要的信息:

- name定义一个名字,后面要用
- Choices可选择的参数值,这里的值,就是多渠道版本配置中的值;这里要说的是变量的值要注意区分大小写,遵守驼峰命名规则,因为我们这里写好的值,最后要拼接成- Task命令,如果我们选择的是- Free,那么最后拼接成的- Task命令就是- assembleFreeRelease,之所以这里要大写是有原因的。举个例子,打开项目的- build.gradle文件中- productFlavors写的是小写的- free,那到了- jenkins这里怎么就要变成大写呢,因为是’AS’帮我们自动拼接好,打开项目右上角的- Gradle,进入到- app--Tasks--other就可以看到我们要运行的- Task命令都自动拼接变成了首字母大写;

但是在jenkins中并没有这种待遇,需要我们自己进行拼接,所以要区分大小写,在Choices中写值时,可以打开AS照着其中的Task来写,取assemble和Debug中间的值。关于多渠道可以看Gradle productFlavors多版本打包 会对Task命令了解更透彻一些。
上面配置好了参数,最后还是要拼接起来使用,组成Task命令,我们滑到下面Build选项,将命令assembleDebug改成assemble${BUILD_TYPE}Debug

保存回到项目首页,点击构建,可以看到如下:

这样我们选择自己需要的渠道进行构建就可以了。
构建后文件过滤
最后再说一个,我们构建完的项目是在Work space中,需要通过Build文件层层的进入,才可以找到我们打包后的apk或者aar文件,我们可以通过Post-build Actions选项,在构建完成后做一些工作,比如apk文件的过滤;具体操作如下:

在Add Post-build Actions中选择Archive the artifacts

接着在Files to archive中编写,如果是过滤apk文件就写上**/*.apk,如果是过滤aar文件就改写成**/*.aar,再次构建项目,完成后,点击运行成功的编号:

就可以在Status标签下看到我们已经过滤好的文件,点击即可下载。(截图是过滤的aar文件)

结束语
参数化构建的内容暂时先说这么多,以后有写的技巧或者解锁新功能,再更新,祝大家jenkins玩得愉快😊。