Jenkins自动化打包

本文章主要是记录在Mac端集成Jenkins打包流程,包含了Tomcat搭建、Jenkins搭建、shell脚本编写三大块。其中生成下载二维码、集入第三方加固、修改apk包名等额外操作都是在shell脚本中完成的。

Tomcat搭建

1.安装

Tomcat官网链接:http://tomcat.apache.org ,Mac电脑要下载tar.gz包。
解压后更改文件夹名并放到合适的目录,比如改名为Tomcat,然后放置用户目录下(cd ~)

2.终端开启服务

打开终端,进入Tomcat的bin目录,cd ~/Tomcat/bin
授权: chmod 755 *.sh
开启服务: ./startup.sh
关闭服务: ./shutdown.sh

3.验证

浏览器访问“localhost:8080”,看到Tomcat界面,说明成功了

Jenkins搭建

一、安装

Jenkins官网下载链接:https://jenkins.io/download/
注意:下载.war包

下载完成后,将war包放到Tomcat的webapp下,然后启动Tomcat就会自动生成一个跟war包名称一样的文件夹,这里默认是jenkins。之后在浏览器访问localhost:8080/jenkins就可以访问jenkins了。

第一次访问jenkins的时候会开启安装流程

1.输入密码,此密码的文件路径已提供,在终端中cat此路径就能看到。

2.点击推荐安装,之后会自动安装插件

3.进入创建jenkins用户的界面,如果不想填可以使用admin默认账号。

4.安装完成就进入jenkins主页了。

二、完善Jenkins配置

1.进入系统设置,在环境变量里添加SDK和Python3。(我这里添加Python3是因为shell脚本中用到了python)

2.进入全局工具配置,配置JDK、Git、Gradle

3.进入插件管理,安装一些必要的插件:

Build Name Setter: 修改build名称
description setter plugin: 设置build的描述
Git Parameter Plug-In: 添加显示选择git分支的界面的插件

安装完成后重启下jenkins就能使用了。

三、开始创建项目

输入名称

开始参数化构建

参数化构建后

配置git源码管理,输入仓库URL和ssh凭据

创建ssh凭据,ssh密钥使用项目git中配置的,这里需要注意的是,使用的ssh不能设置密码,否则jenkins添加的时候会报权限异常。

接着在构建环境中设置build后的名称

下面就是核心的构建配置了,首先选择gradle版本,然后输入需要执行的gradlew命令

gradlew命令可以在Android Studio中看到,我们每次编译运行项目就是调用了这些命令

最后一块是构建后操作,主要是为了自定义显示Build后的信息,包括打包的分支号、环境、二维码下载等。

Description展开内容:

apk install package qrcode

download apk
download tinker backup zip file

标签展示的效果如下图:

我们在写上面的Description和后面编写shell脚本的时候需要用到很多环境变量,我们可以在增加构建步骤中选择执行shell,然后看到jenkins为我们提供了完善了环境变量表:

到这里,我们就完成了最基本的jenkins构建打包功能。但是我们使用jenkins的目的肯定不是为了单纯地构建打包,而是将整个发包流程在jenkins中一键完成,来解脱繁琐的重复操作。下面就是通过编写shell脚本来执行生成二维码、保存bakApk文件、第三方加固、apk包重命名等操作。

shell脚本编写

1.生成二维码

创建新目录,并将打好的包移到这里

if [ ! -d "${WORKSPACE}/output" ];then 
    mkdir ${WORKSPACE}/output
fi 
    mkdir ${WORKSPACE}/output/${BUILD_NUMBER}
    # 将打好的包移到新的目录中
    mv ${WORKSPACE}/app/build/outputs/apk/${BUILD_TYPE}/*.apk ${WORKSPACE}/output/${BUILD_NUMBER}/${JOB_NAME}_${BUILD_NUMBER}.apk

一开始我们需要在终端中去了解jenkins的目录结构,通过命令cd .jenkins/进入jenkins目录,ls查看文件夹,找到workspace。jenkins构建的项目都在这里,apk在app/build/outputs/${BUILD_TYPE}/中,这里的BUILD_TYPE即debug或release。
在知道apk的位置后我们需要将apk移到workspace/output目录,在移动前我们先创建一级文件夹用来区分每次的构建,文件夹名可以使用BUILD_NUMBER。

安装qrcode库

qrcode库可以方便的将apk转换为二维码,安装方式和使用方式Github上都有详细的介绍,这里就不说了。
这里是链接https://github.com/sylnsfar/qrcode

# 生成二维码(myqr后跟下载链接, -n output-filename  -d output-directory)
myqr ${JENKINS_URL}download/${JOB_NAME}/output/${BUILD_NUMBER}/${JOB_NAME}_${BUILD_NUMBER}.apk -n ${JOB_NAME}_${BUILD_NUMBER}.jpg -d ${WORKSPACE}/output/${BUILD_NUMBER}

2.备份bakApk文件

此动作是为了热修复tinker保留补丁备份文件

cd ${WORKSPACE}/app/build/bakApk
zip -r ${JOB_NAME}_${BUILD_NUMBER}_tinker_backup.zip ./*
mv ${JOB_NAME}_${BUILD_NUMBER}_tinker_backup.zip ${WORKSPACE}/output/${BUILD_NUMBER}/${JOB_NAME}_${BUILD_NUMBER}_tinker_backup.zip

切换到bakApk目录,压缩并移动文件至之前创建保存apk的那个文件夹。

3.使用360第三方加固

360官网有命令行示例,以下是示例

# 使用360加固
# 只有在打release包并选择了使用360加固的条件后才会开始加固
if [[ "${REINFORCE_WITH_360}" = true && "${BUILD_TYPE}" = "release" ]];then 
    echo "360 reinforce begin"
    # 切换到360的jiagu目录下
    cd /Users/xxx/360jiagubao_mac/jiagu
    # 登录
    java -jar jiagu.jar -login username password
    # 导入签名信息
    java -jar jiagu.jar -importsign keystore文件的路径 storePassword keyAlias keyPassword
    # 导入渠道信息
    java -jar jiagu.jar -importmulpkg 渠道文件
    # 开始加固
    java -jar jiagu.jar -jiagu apk文件路径 加固后输出路径 -autosign -automulpkg
    echo "360 reinforce finish"
fi  

REINFORCE_WITH_360参数是在参数化构建过程中添加一个布尔值参数设置的名称。

到此,我们就完成了360加固,包括分渠道和签名的操作。之后我们还可以写个重命名的python脚本来方便改名称,最后将所有apk包压缩放至上面的保存apk的那个文件夹统一管理。

我们的shell脚本基本就完成了,在jenkins构建的时候就会自动执行shell脚本。

这时我们再来回顾下构建后操作Description中的标签,就会明朗很多:

apk install package qrcode

download apk
download tinker backup zip file
download protected apk zip file

这里有两点需要补充下,
一是要正确显示html标签需要去jenkins的全局安全配置中设置标记格式器,见下图

二是我们生成的${JENKINS_URL}download需要在Tomcat中的server文件中配置下。打开Tomcat/conf/server.xml文件,在Host标签中加入:


这样我们就将整个构建过程中的产出放到download下,例如二维码图片文件、原始apk、bakApk文件以及加固后的渠道包等。然后通过我们在Description自定义标签后在build history中就可以看到最终成果:

到此一套Jenkins打包流程就完成了,此文章演示的在本机上进行的操作,真正的公司项目肯定是不能打包到自己的Tomcat上的,区别就是向运维申请专门的IP来加载Jenkins,剩下的就是路径的不同,其他步骤都是一致的。

你可能感兴趣的:(Jenkins自动化打包)