Jenkins参数化构建(根据版本号构建)

4,054 阅读10分钟

前言

参数化构建目录

  • 根据版本号构建项目(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_REVISIONDefault Value默认值可以不写,Description描述信息,可以写上,描述一下填写这个参数的作用:

Extended Choice ParameterString 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来写,取assembleDebug中间的值。关于多渠道可以看Gradle productFlavors多版本打包 会对Task命令了解更透彻一些。

  • Description描述信息

使用BUILD_TYPE

上面配置好了参数,最后还是要拼接起来使用,组成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玩得愉快😊。

参考链接

jenkins根据版本号更新发布