前言

app 提测阶段,需要实时更新apk供测试人员测试。开发人员去实时打包,肯定浪费人力。
如果测试人员打包呢,又会有限制,毕竟不是每位测试都懂代码!真没有办法了吗?

环境:

Jenkins ver. 2.60.3

发布到 linux ,以下下环境是在linux 下配置的


这里只介绍打包完成后,apk如何上传到蒲公英,并从蒲公英拉取二维码链接到本地,然后展示到jenkins 构建界面

Android jenkins 打包发布_jenkins

详情页面

Android jenkins 打包发布_二维码_02

1.首先进入项目配置界面

general 选下卡下 设置 –>项目名称,描述,构建方式(本例采用参数化构建,version-name,version-code对外开放给测试人员)etc。

Android jenkins 打包发布_android_03

2.切换源码管理配置源码路径

本例采用svn作为源码仓库,这里svn项目配置成动态可调整的

Android jenkins 打包发布_ci_04

3.选项卡切换到构建触发器选项

配置触发规则,根据具体需求动态配置如下五种触发规则

触发远程构建 (例如,使用脚本)

Build after other projects are built
Build periodically
GitHub hook trigger for GITScm polling
Poll SCM

本例配置为 Build periodically 规则为 50 7 * * 1-5 ,每天早上 7:50 ,周一~周五去自动打包发布。

4.选项卡切换到构建环境选项

Android jenkins 打包发布_json_05

5.选项卡切换到构建选项

配置gradle,配置打包脚本如下图

Android jenkins 打包发布_jenkins_06

选择 Execute Shell 设置打包发布脚本

注意:这里linux环境,和window 环境的脚本不太一样需要转换成相应平台的编码方式

蒲公英集成jenkins 文档入口 ​​https://www.pgyer.com/doc/view/jenkins​

我们这里写的脚本在蒲公英提供的shell脚本基础上增加拉取二维码链接,并保存到本地的步骤

#java -jar /usr/local/android/qrtools/QRcode.jar url=http://10.7.0.201:8080/jenkins/apk/npl-${APP_VERSION}-${Channel}.apk image=latestapk.jpg save=/root/.jenkins/workspace/npl_trunk/


# 脚本自动上传到蒲公英-拉取最新二维码

cd ..

cd updateshell

./needparameter.sh ../npl_trunk/app/build/outputs/apk

#./needparameter.sh /usr/tomcat/apache-tomcat-8.0.36/webapps/jenkins/apk


echo " start decode image ======================"

# use jq tools to download pgy image to local disk, get data from pgy.json

RESULT=$(jq -r .data.appQRCodeURL /root/.jenkins/workspace/updateshell/pgy.json)


curl -s $RESULT > /usr/tomcat/apache-tomcat-8.0.36/webapps/jenkins/apk/npl.png

# image File save path npl_trunk/npl.png

curl -s $RESULT > ${WORKSPACE}/npl.png

# delay one second

sleep 1

6. 选项卡切换到构建后操作选项

设置Archive the aritifacts 存档文件类型 需要插件

设置 set Build Description 需要插件,这个就是显示到build界面二维码设置入口

设置通知邮件 etc

这里着重介绍下shell脚本的编写,以及过程中遇到的问题

1.shell脚本解析蒲公英返回json串

2.如何存储json串到本地

3.根据解析出来的二维码图片,如何发起网络请求并下载二维码图片!

4.图片保存/读取

未解决问题

二维码链接想通过邮件形式发送给构建者,没能解决,邮件模板中不能读取到本地json串中内容!

个人想法:修改邮件模板,使用groovy脚本+jetty模板,将解析出来
的json串中二维码嵌入到邮件模中。

#!/bin/bash

#MAIN_MODULE AndroidStudio project directory under the main module
MAIN_MODULE="."
#The test address separately
#MAIN_MODULE="./app"
# pgy API account

PGYER_USER_KEY="蒲公英key"

PGYER_API_KEY="蒲公英Api"

#APK path
#APK_PATH="${MAIN_MODULE}/build/outputs/apk"
#Receive the external transfer apk path



APK_PATH=$1


echo "=============================================="
#echo "current path: `pwd`"
echo "APK_PATH=${APK_PATH}"

APK_LIST=`ls -t ${APK_PATH}`

echo "${APK_LIST}"

#ind the latest apk package

for APK_FILE in ${APK_LIST}; do
APK_NAME=${APK_FILE}
echo "apk file name= $APK_NAME File=$APK_FILE"
done

#-------------------------------------------------

if [ -n "$APK_NAME" ]; then # Determine whether is empty

echo "upload $APK_FILE pgy"
#upload pgy updateDescription(version descript)
RESULT=$(curl -F "file=@${APK_PATH}/${APK_NAME}" -F "uKey=${PGYER_USER_KEY}" -F "_api_key=${PGYER_API_KEY}" https://qiniu-storage.pgyer.com/apiv1/app/upload)


echo $RESULT > pgy.json

#-------------------send mail-------------------------
echo "send mail to" 279642707@qq.com

echo "${RESULT}" | mail -s "${APK_NAME} already unload pgy" 279642707@qq.com

#http://www.pgyer.com/apiv1/app/upload

fi

workspace 目录

Android jenkins 打包发布_ci_07

包含脚本

Android jenkins 打包发布_二维码_08

注:
APK_PATH=$1 接受apk编译出来apk路径的。这样一套脚本可以对所有项目使用

上面代码字面意思就是,根据传的apkpath,去循环路径下的apk,然后上传到蒲公英。这里需要配合build中的构建脚本,   assemblyDebug/Release

然后读取 RESULT(蒲公英平台返回的json串)

{
"code": 0,
"message": "",
"data": {
"appKey": "--------------",
"userKey": "-----------------",
"appType": "2",
"appIsLastest": "1",
"appFileSize": "15076147",
"appName": "\u8bfa\u79d2\u8d37",
"appVersion": "1.1.0",
"appVersionNo": "5",
"appBuildVersion": "19",
"appIdentifier": "--------------",
"appIcon": "f63573b31ed8ddd4df14dcc4da09060c",
"appDescription": "\n \u8bfa\u79d2\u8d37\u662f\u4e00\u6b3e\u57fa\u4e8e\u79fb\u52a8\u4e92\u8054\u7f51\u5168\u7a0b\u5728\u7ebf\u7533\u8bf7\u7684\u7f51\u7edc\u501f\u6b3eAPP\uff0c \u4e3b\u8981\u89e3\u51b3\u90fd\u5e02\u5e74\u8f7b\u767d\u9886\u4e0e\u84dd\u9886\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u7684\u5c0f\u989d\u501f\u6b3e\u9700\u6c42\u3002\u8bfa\u79d2\u8d37\u91c7\u7528\u4e92\u8054\u7f51\u5927\u6570\u636e\u65b9\u5f0f\uff0c\u5927\u5927\u7f29\u77ed\u4e86\u501f\u6b3e\u6240\u9700\u7684\u65f6\u95f4\uff0c\u65e8\u5728\u63d0\u4f9b\u4e00\u4e2a\u7b80\u5355\u65b9\u4fbf\u3001\u7075\u6d3b\u5feb\u6377\u7684\u501f\u6b3e\u65b0\u6a21\u5f0f\u3002\n",
"appUpdateDescription": "",
"appScreenshots": "9a6e655c02cdca2d83e141e3ae1d295d,ad25de9276b4633ec8d299827d3d6294,fb8e5a80514353a1bacc692a39866210,51ca54f8edaf6eba71e2b77264a14dfa,c76cf279c24fb40c30b3c4cdee3380a0,8a64c38cfdeb11cb4e9aa5fa31a60d98",
"appShortcutUrl": "6yS4",
"appCreated": "2017-12-06 10:42:46",
"appUpdated": "2017-12-06 10:42:46",
"appQRCodeURL": "https:\/\/www.pgyer.com\/app\/qrcodeHistory\/------------------"
}
}

保存到指定目录

echo $RESULT > pgy.json //当前目录

后面需要解析json,解析出 “appQRCodeURL”: “https:\/\/www.pgyer.com\/app\/qrcodeHistory\/——————”,拿到 appQRCodeURL去下载图片到本地

下面这段脚本放入到 needparameter.sh 中取执行,竟然报错。迫不得已拉出来执行,执行位置在build shell 中前面已经贴出来

echo " start decode image ======================"

# use jq tools to download pgy image to local disk, get data from pgy.json

RESULT=$(jq -r .data.appQRCodeURL /root/.jenkins/workspace/updateshell/pgy.json)


curl -s $RESULT > /usr/tomcat/apache-tomcat-8.0.36/webapps/jenkins/apk/npl.png

# image File save path npl_trunk/npl.png

curl -s $RESULT > ${WORKSPACE}/npl.png

# delay one second

sleep 1

注: 这里面使用linux平台 jq解析工具,语法查看 ​​https://stedolan.github.io/jq/​

下面处理就很顺利了。读取json,解析iappQRCodeURL链接,通过 curl 命令去服务器下载,存到指定位置。通过uri 路径写死。

注意以上脚本在升级gradle 后,jenkins 会有问题

原因是:

gradle 生成apk路径,由之前 app/build/outputs/apk/ ,变成了 app/build/outputs/apk/【release/debug】

相应修改地方:

1.一个是shell脚本 传参 由 ​​app/build/outputs/apk/​​​ —-> ​​app/build/outputs/apk/${Buid_type}​​​
2.修改生成 Archive the Artifacts —-> ​​/build/outputs/apk/ * /*.apk​​​ 增加一个通配符 ​​*​​​ 号
3.jenkins 解析不了html 路径url,这个只需要更改显示格式为 safeHtml 就可以了,具体路径 Configure Global Security–
Markup Formatter- safeHtml