目录

Jenkins部署Android篇3之构建完整Android自动化流程

https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fraw.githubusercontent.com%2Fsromku%2Fbuild-android-jenkins%2Fmaster%2Fassets%2Fbuild-android-wip.png&refer=http%3A%2F%2Fraw.githubusercontent.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1649935615&t=43d7d98bdb16cd16c633d285d833a855

前面的章节完成了环境的搭建, 并且利用WebHook监听Github的分支变化. 接下来针对构建过程和结果的完善.

增加构建类型选项

之前构建命令assembleDebug是写死. Jenkins构建也只能构建Debug类型. 而正式开发中可能需要3个或者更多的BuildType类型来控制全局的不同常量.例如

  1. Debug: 测试环境: true, Log开关: true
  2. Sandbox: 测试环境: false, Log开关: true
  3. Release: 测试环境: false, Log开关: false
  4. AutoLogin: 自动登陆账户等..

新建一个任务.

1添加buildtype参数选项.png

2assemble动态.png

  1. General 添加了一个构建前的选项参数里面设置了三个build环境(Release为默认值)
  2. 源码管理 添加Repository URL 设置分支
  3. 构建 这里assemble的命令变成了动态.

设置之后就可以应用, 保存.回到新建任务页码可以看到构建的时候出现了选项.

3assemble结果展示.png

选个Release测试一下, 别忘了在项目代码中app/build.gradle文件中添加对应的buildTypes类型.

测试结果:

4assembleRelease.png

添加Android签名

现在Jenkins可以自由的控制部署不同环境的安装包. 但是生成的包都是未签名的. 之前我们都是把signingConfigs {sign {…}} 放在build.gradle文件中, 相关的密码信息也存在项目代码中. 更好的做法应该分离开来. 签名文件和相关信息由自动化管理, 这样更加安全合理.

1.添加Android sign插件

系统管理 -> 插件管理 -> 可选插件 -> 搜索: Android Signing Plugin -> 安装

2.上传keyStore文件

系统管理 -> Manage Credentials -> 全局凭据 -> 添加凭据 -> 安装

5addKeystore.png

  1. 选择Certificate类型
  2. 上传jks签名文件
  3. 输入签名文件密码
  4. 添加描述
  5. 确定

在Job中添加sign插件

回到Job的配置页面. 点击 构建 -> 选择当前区域的增加构建步骤 -> Sign Android APKs

6setSignPlug.png

  • keyStore: 如果只有一个凭据就默认选择了.
  • APKs to Sign: 对什么文件进行签名
  • 两个checkBox表示是否用于最终显示

重新构建Job, 查看工作空间, 已经有了签名的apk

7releaseApk.png

可以测试一下apk签名文件结果 下载apk, 解压, 打开META-INF文件夹找到 .RSA 结尾文件.

keytool -printcert -file RSA文件的路径 查看签名信息

动态设置输出apk文件名

对于output后的apk文件名, 一般都会自定义成项目名称+版本号+版本环境+时间.apk, 但这些都是在build.gradle代码写死的. 现在可以通过Jenkins的任务界面随意设置要生成规格格式.

原理: Jenkins任务构建时可以注入并替换gradle.property中的变量, 通过Android项目中的applicationVariants.all{} 预留占位字段达到由 Jenkins 控制输出文件名.

目标: 项目名称 + 版本号 + 版本环境 + 占位.apk 这里版本号, 版本环境, 项目内自动获取.

进入Jenkins的任务的配置, 追加3个参数. 并且在构建->Invoke Gradle Script->高级->勾选:Pass all job parameters as Project properties选项

8outputFiled.png

在项目代码的gradle.properties文件中添加三个字段:

APK_NAME = Code
IS_JENKINS = false
PLACE_HOLDER = ''

app/build.gradle文件中android{}域中添加自定义apk名称方法

// 定义编译生成的apk名格式
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def newName

        if ('true' == IS_JENKINS) {
            println("jenkins build ==> $BUILD_TIME")
            newName = "$APK_NAME-v${defaultConfig.versionName}-${variant.buildType.name}-${PLACE_HOLDER}-unsigned.apk"
        } else {
            if ('debug' == variant.buildType.name) {
                newName = "$APK_NAME-v${defaultConfig.versionName}-${defaultConfig.versionCode}-debug.apk"
            } else {
                newName  = "$APK_NAME-v${defaultConfig.versionName}-${defaultConfig.versionCode}-${variant.buildType.name}.apk"
            }
        }
        output.outputFileName newName
    }
}

“$APK_NAME-v${defaultConfig.versionName}-${variant.buildType.name}-${PLACE_HOLDER}-unsigned.apk”

如果注入成功,最终名字应该是如上.

9outputresult.png

如果想追加时间: 可以使用Date Parameter Plugin插件添加

美化build任务名称(可选)

10buildNameNormal.png 默认的build任务名称都是#1 #2这种

添加插件:

  • user build vars plugin 获取jenkins用户名及id,引用:${BUILD_USER}
  • Build Timestamp BUILD_TIMESTAMP
  • Build Name and Description Setter 在“构建环境”块中添加“set build name”设置在编译时"build history"中显示构建信息

修改Job配置

11buildNameSetting.png

再次运行项目, 结果如下:

12buildNameResult.png

上传蒲公英

上传蒲公英, 生成下载地址, 生成二维码图片, 方便邮件推送给其他人.

安装蒲公英插件Upload to pgyer

回到job配置页面, 选择构建后操作, 添加Upload to pgyer with apiV2

13upload1.png

  • api_key: 填写蒲公英的api_key
  • scandir: 要上传的apk的目录
  • file wilcard: 要上传的文件名

当上传之后, 蒲公英提供了一系列参数供我们使用. 如下:

14uploadVar.png

那我们可以给build任务, 继续丰富展示内容.

添加set build description插件description setter plugin

在upload 上传任务之后, 再添加set build description的构建后操作步骤

15setBuildDes.png

  • Description:

保存之后, 进入系统管理 -> 全局安全配置 -> 标记格式器为:SafeHtml

16safehtml.png

保存, 运行任务. 此时任务历史就变成这样了

17qrcode.png

邮箱通知 Editable Email Notification

Editable Email Notification 设置邮件通知, 如果没有插件搜索插件Email Extension

这里不用自带的Email通知, 直接下载插件. 因为要通知, 所以肯定需要一个发送者邮件. 这里以163为例子.

首先登陆163邮箱, 开启SMTP

18EmailSetting.png

如果是首次开启, 那么就不需要点击新增授权密码, 因为首次开启的时候会给一个Token, 如果已经开启过, 那么点击新增授权密码, 保存Token密码.

回到Jenkins -> 系统管理 -> 系统配置

20EmailSet2.png 19EmailSet1.png

  • 系统管理员邮箱: 填写邮箱的全路径
  1. SMTP Server: 163邮箱固定为: smtp.163.com
  2. SMTP Port: 465
  3. 凭据: 点击添加, 创建Username with password类型, 用户名是邮件全路径, 密码为授权的Token.
  4. 邮件后缀: 163为 @163.com

然后保存, 回到job配置中, 选择构建后操作, 添加Editable Email Notification

21EmailSet3.png22EmailSet4.png

  1. 要发送的邮箱, 每个邮箱直接用英文,号隔开
  2. 追加一些蒲公英返回的字段, 更多的模板代码可以在网上找到.
应用名称: ${buildName} <br>
应用版本: ${buildVersion} <br>
应用大小: ${buildFileSize} <br>

扫码下载: <br>
<a href="${appBuildURL}"><img src="${appQRCodeURL}" width="118" height="118"></a> <br>
$DEFAULT_CONTENT
  1. 添加一个发送邮件的触发时机, 点击Add Trigger选择Success. 添加发送人Recipient List, 就是当Build成功的时候给list中的邮件发送.

列表中的收件人是这个样子

23EmailSuccess.png