本篇博客是《Jenkins之自动进行360加固》的后续。在分享完如何使用Jenkins实现自动加固后,本篇博客将继续分享使用Jenkins自动生成热修复补丁的实现过程。
背景及思路
项目使用git-flow分支模式,而热修复采用的是阿里的移动热修复Sophix方案,并且项目启用了混淆。因此,我的思路很简单:
- 在构建正式环境的Apk之前,修改混淆规则
-applymapping...
,使其与对应版本的混淆符号映射一致。 - 在构建正式环境的Apk之后,增加热修复阶段,进行热修复补丁生成。
- 热修复补丁生成之后,将补丁文件与一些git提交信息通过邮件发送出来。
- 以上步骤仅对
hotfix/
开头的分支有效。
应用混淆规则
约定
在之前的博客中,我们会把加固包对应的原apk及mapping文件发送出来。**我们约定,在加固包上架之后,把apk及mapping文件提交到项目的release
文件夹中,再打上tag。**这样,当我们需要生成热修复补丁时,则可以方便地找到对应版本的原apk及mapping文件。
我们再约定,在app模块的混淆规则文件proguard-rules.pro
中,添加一条规则,但是默认情况下注释掉,只在需要生成补丁时才启用它:
#-applymapping ...
Jenkins的配置
接下来,修改Jenkins中的job配置,添加或勾选Fetch tags
一项,确保在拉取代码时把tag也给拉取下来。如下:
编写替换脚本
然后,编写脚本文件进行混淆规则的替换。考虑到热修复的相关文件可能会比较多,我在buildsystem下新建了一个文件夹hotfix
,然后再在这个文件夹下添加修改混淆规则的脚本apply-rules.sh
,内容如下:
#!/usr/bin/env bash
cd `dirname $0`/../../
projectDir=`pwd`
gitTag=`git describe --tags --abbrev=0 | sed "s/[^0-9\.].*//"`
ruleFile="$projectDir/`find release -name "mapping*$gitTag*.txt"`"
unix=false
case "`uname`" in
Darwin* )
unix=true
;;
esac
# sed 替换标识符说明: `#`会出现在规则文件中;`/`会出现在路径中;`@`会出现在Jenkins工作空间中。
if [ "$unix" = "true" ]; then
sed -i "" "s!.*applymapping.*!-applymapping $ruleFile!g" $projectDir/app/pro