因团队配合需要其他团队需要对我们团队的项目拥有打包权利,借此机会干脆整个项目都用Jenkins打包,省去一些麻烦,也能提升一些效率。
环境:Linux 系统:CenterOS 7
在安装Jenkins之前,请确保服务器上以安装JDK,并配置全局的Java环境变量。因为Jenkins是依赖Java环境的。
服务器上安装Jenkins。Jenkins官网教程Jenkins安装插件:Credentials Binding、Git、 GitLab Plugin/GitHub(根据自己需求)、Gradle、RVM由于平时工作开发一般都是Windows或者Mac电脑,很少有用Linux系统进行Android开发的。
所以打包需要的一些源码和环境是需要准备的。这里有一个快捷的方法就是将完整的项目(包含运行时文件:.gradle、.idea、build等)上传到GitLab上,然后Jenkins拉取完整项目,此时只需要gradle运行环境就可以了,但这里极其不建议这样做。原因有以下:
运行时的文件是跟当时环境有很大关系,所以上传之后容易出现不可预料的运行错误(这个经历过SVN+Eclipse的小伙伴应该懂)。如果项目的SDK版本有更新或引入的库引入了之前没有的SDK版本,那么就需要再次上传运行时文件。上传运行时文件,只能单人操作,其他人不能在进行代码上传到该分支或代码合并。而且因为运行时文件是实时变动的,所以就需要上传完Jenkins后将所有运行时文件删除,不然很容易出现代码冲突。所以我们采取很好的方式就是用SDKManager去自行在服务器上安装SDK,这样如果有更新,我们只需把服务器上没有安装的SDK版本,根据版本号将其安装即可。省去很多麻烦,也更优雅一些。
Android SDK Manager官网
向下拉倒最下找到这个部分,将对应的管理工具下载到服务器上。然后解压。
SDK Manager文档
根据文档安装需要的SDK版本。
Gradle官网
Gradle的安装很很简单,按照文档里按照即可。
2. 点击右侧的Configure System菜单。
找到Global properties。勾选Environment variables。添加Android SDK的根目录作为环境变量。变量名称:ANDROID_HOME
勾选Invoke Gradle,根据项目选择已创建的Gradle Version(在Global Tool Configuration中创建的),然后点击更多信息按钮。 将此项勾选,后面会提到。
存档文件(可选) 这个文件可以是具体的文件名,也可以是如图所示的通配符格式的。点击最底下的Save按钮进行保存。
构建项目。点击Build Now按钮。 点击这个构建记录。然后点击左侧菜单,Console Output菜单。 如果页面最后显示这几行文字说明,项目打包已经成功。 如果页面最后显示这几行文字说明,项目打包失败。往上看可以看到失败的具体原因,根据具体原因去分析是什么问题。这里说两个比较常见的问题:
项目中配置了buildToolsVersion一定要删掉,因为服务器上的版本未必一直。还有一些配置的问题也可以在本地进行打包测试。在AndroidStudio命令行中输入命令gradlew Release命令进行打包,确保打包问题再在Jenkins上面进行打包。这个也是比较常见的错误,错误内容如下所示: * What went wrong: Execution failed for task ':imageeditlibrary:compileReleaseLibraryResources'. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade > 90 exceptions were raised by workers: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource compilation failed AAPT: \data\Jenkins\.jenkins\workspace\Demo\imageeditlibrary\build\intermediates\compiled_local_resources\release\out: error: 系统找不到指定的文件。 (2).这个问题是Android打包检查命令报的错误,文件路径过长导致找不到文件。首先确保如下图所示的勾选已经勾选。 如果上图的已经勾选,还是报这个错误,那就说明我们的项目目录过深,需要更改。
回到项目主页,点击项目左侧菜单栏,点击Configure菜单。 点击更多按钮。 填写新的比较短的项目路径。 点击最底下的Save进行保存,然后重新点击Build Now菜单。再次查看此次日志输出就会发现打包成功。
我们打完包肯定不是就在服务器上放着,需要给测试或产品等相关人士下载测试和使用的。目前有三种实现方式:
上传到自有服务器,生成二维码进行下载。上传到蒲公英平台。上传到fir平台。第一种方式比较麻烦还需要对文件进行维护,这里就不过多介绍了,就是写个脚本将文件上传到服务器,服务器返回一个访问地址,然后将这个地址转换成二维码显示,或者写一个前端页面,来优雅的显示这个二维码。
这里主要介绍上传蒲公英和fir上有什么注意事项。
首先得有个蒲公英账号,不用多说。蒲公英官网 同时需要进行实名验证,如果账号没有进行实名验证或验证信息不全,则无法上传成功的。 蒲公英文档 这里有一点需要注意就是蒲公英Jenkins插件升级之后,会有两个插件版本进行选择,这里我们选择v2,根据官方文档解释是v1版本上传失败的概率比较大。 其他的根据文档进行填写即可,只需要一个APIToken即可。
需要账号,需要实名验证。fir官网 fir官方文档(用处不是很大) fir-cli GitHub地址
由于不知道什么原因,官方将Jenkins插件进行了下架处理,改用钩子的方式进行上传。可能觉得插件的这种方式让用户用的太方便太舒服,用钩子的这种方式可能很多人不是很会配置,网上的文章也比较少介绍这种方式,所以还可以堂而皇之的收取些咨询费用。因为 阔以阔以。秀,真的是秀。
fir上传的注意事项是,它是依赖Ruby环境的,你也可以本地安装好Ruby,或者用Jenkins插件RVM。
RVM用法总结 RVM实用指南
这里fir-cli的要求是2.4之后的版本。如果是用插件的话需要在项目的Configure里的Build Environment下面勾选下图所示。 版本号大于2.4就好。个人更推荐本地安装Ruby环境这样更方便些,这种方式它每次都需要检索Ruby,不是特别方便。
然后在Build分类下面增加一个Execute shell。
#!/bin/bash --login gem install fir-cli source /etc/profile fir login firApiToken fir publish app/build/outputs/apk/envOpen/release/app-envOpen-release.apk [-c --changelog=firChangedLog ]将命令中的firApiToken、firChangedLog换成你自己的APIToken和更新日志就可以了。
有的时候我们可能需要打包不同分支的代码,也可能需要上传到fir或蒲公英上面去,但是这个更新内容每次都需要在Configure里面去更改很是不方便,而且并不是每个打包人都有这个权限可以更改项目的Configure,因为这个Configure一旦出问题,整个项目就会打包失败,还是很有影响的,而且也可能出现删库跑路。
所以权限的赋予还是很重要滴。那么想动态的去设置这些就没有办法了么?答案当然是有的,不然Jenkins也太low了哈。
那么如何操作呢?
假设我们有这个两个需求:
动态的切换上传的fir账号。动态的设置应用的更新日志。在Configure里构建项目是参数化的并添加参数。 这里我们添加两个参数的分类,一个是Credentials Parameter,另一个是String Parameter。第一个是用来切换fir上传的APIToken用的,第二个是用来记录更新日志用的。
第一个参数呢,首先是命名,这个随意哈。其次呢,需要选择凭证的类型,这里选择Secret Text类型,是否是必须的,是否有默认值,这个都是根据实际情况去设置的。 如果没有凭证,那我们就添加一个凭证。 这里可以设置该凭证的作用域和种类,这里我们选择Secret Text。Secret就是fir官网的APIToken,ID就是显示的名词(词能达意是最好的),描述根据需要看是否填写。填写完之后点击下面的Add按钮就添加成功了。 这个是我的一个设置,该参数是必须的,并且有默认值。
第二个String Parameter的设置就直接放图了,比较简单。 字符串的设置有两个,一个是单行显示,一个是多行显示。这个根据自己需求去选择哪个。我这里选择单行显示,因为是内部人用的,所以没那么多更新日志需要展示。
参数配置完之后,还有一个小注意事项,就是第一个参数是凭证,所以我们在选择的时候,实际上是选择的凭证ID,但我们真正想要的其实是密文,所以还需要一个小小的设置。如下图。 然后再更改一下fir的命令就可以,如下:
#!/bin/bash --login gem install fir-cli source /etc/profile fir login ${firApiToken} fir publish app/build/outputs/apk/envOpen/release/app-envOpen-release.apk [-c --changelog="${firChangedLog}" ]至此参数化打包也配置完成了,在配置Jenkins参数化打包的时候可能会遇到很多问题,遇到问题解决问题,保持好心态。小编在配置时就差点心态崩了,问题太多,解决办法也比较少,所以写文记录一下。