Jenkins部署Android篇3之构建完整Android自动化流程
- Jenkins部署Android篇-1.Mac安装Jenkins
- Jenkins部署Android篇-2.Jenkins使用Github的Webhooks
- Jenkins部署Android篇-3.构建完整Android自动化流程
- Jenkins部署Android篇-4.Pipeline流水线
前面的章节完成了环境的搭建, 并且利用WebHook监听Github的分支变化. 接下来针对构建过程和结果的完善.
增加构建类型选项
之前构建命令assembleDebug是写死. Jenkins构建也只能构建Debug类型. 而正式开发中可能需要3个或者更多的BuildType类型来控制全局的不同常量.例如
- Debug: 测试环境: true, Log开关: true
- Sandbox: 测试环境: false, Log开关: true
- Release: 测试环境: false, Log开关: false
- AutoLogin: 自动登陆账户等..
新建一个任务.
- General 添加了一个构建前的选项参数里面设置了三个build环境(Release为默认值)
- 源码管理 添加Repository URL 设置分支
- 构建 这里assemble的命令变成了动态.
设置之后就可以应用, 保存.回到新建任务页码可以看到构建的时候出现了选项.
选个Release测试一下, 别忘了在项目代码中app/build.gradle文件中添加对应的buildTypes类型.
测试结果:
添加Android签名
现在Jenkins可以自由的控制部署不同环境的安装包. 但是生成的包都是未签名的. 之前我们都是把signingConfigs {sign {…}} 放在build.gradle文件中, 相关的密码信息也存在项目代码中. 更好的做法应该分离开来. 签名文件和相关信息由自动化管理, 这样更加安全合理.
1.添加Android sign插件
系统管理 -> 插件管理 -> 可选插件 -> 搜索: Android Signing Plugin -> 安装
2.上传keyStore文件
系统管理 -> Manage Credentials -> 全局凭据 -> 添加凭据 -> 安装
- 选择Certificate类型
- 上传jks签名文件
- 输入签名文件密码
- 添加描述
- 确定
在Job中添加sign插件
回到Job的配置页面. 点击 构建 -> 选择当前区域的增加构建步骤 -> Sign Android APKs
- keyStore: 如果只有一个凭据就默认选择了.
- APKs to Sign: 对什么文件进行签名
- 两个checkBox表示是否用于最终显示
重新构建Job, 查看工作空间, 已经有了签名的apk
可以测试一下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选项
在项目代码的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”
如果注入成功,最终名字应该是如上.
如果想追加时间: 可以使用Date Parameter Plugin插件添加
美化build任务名称(可选)
默认的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配置
再次运行项目, 结果如下:
上传蒲公英
上传蒲公英, 生成下载地址, 生成二维码图片, 方便邮件推送给其他人.
安装蒲公英插件Upload to pgyer
回到job的配置页面, 选择构建后操作, 添加Upload to pgyer with apiV2
- api_key: 填写蒲公英的api_key
- scandir: 要上传的apk的目录
- file wilcard: 要上传的文件名
当上传之后, 蒲公英提供了一系列参数供我们使用. 如下:
那我们可以给build任务, 继续丰富展示内容.
添加set build description插件description setter plugin
在upload 上传任务之后, 再添加set build description的构建后操作步骤
- Description:
保存之后, 进入系统管理 -> 全局安全配置 -> 标记格式器为:SafeHtml
保存, 运行任务. 此时任务历史就变成这样了
邮箱通知 Editable Email Notification
Editable Email Notification 设置邮件通知, 如果没有插件搜索插件Email Extension
这里不用自带的Email通知, 直接下载插件. 因为要通知, 所以肯定需要一个发送者邮件. 这里以163为例子.
首先登陆163邮箱, 开启SMTP
如果是首次开启, 那么就不需要点击新增授权密码, 因为首次开启的时候会给一个Token, 如果已经开启过, 那么点击新增授权密码, 保存Token密码.
回到Jenkins -> 系统管理 -> 系统配置
- 系统管理员邮箱: 填写邮箱的全路径
- SMTP Server: 163邮箱固定为: smtp.163.com
- SMTP Port: 465
- 凭据: 点击添加, 创建Username with password类型, 用户名是邮件全路径, 密码为授权的Token.
- 邮件后缀: 163为 @163.com
然后保存, 回到job配置中, 选择构建后操作, 添加Editable Email Notification
- 要发送的邮箱, 每个邮箱直接用英文,号隔开
- 追加一些蒲公英返回的字段, 更多的模板代码可以在网上找到.
应用名称: ${buildName} <br>
应用版本: ${buildVersion} <br>
应用大小: ${buildFileSize} <br>
扫码下载: <br>
<a href="${appBuildURL}"><img src="${appQRCodeURL}" width="118" height="118"></a> <br>
$DEFAULT_CONTENT
- 添加一个发送邮件的触发时机, 点击Add Trigger选择Success. 添加发送人Recipient List, 就是当Build成功的时候给list中的邮件发送.
列表中的收件人是这个样子