前言
app 提测阶段,需要实时更新apk供测试人员测试。开发人员去实时打包,肯定浪费人力。
如果测试人员打包呢,又会有限制,毕竟不是每位测试都懂代码!真没有办法了吗?
环境:
Jenkins ver. 2.60.3
发布到 linux ,以下下环境是在linux 下配置的
这里只介绍打包完成后,apk如何上传到蒲公英,并从蒲公英拉取二维码链接到本地,然后展示到jenkins 构建界面
详情页面
1.首先进入项目配置界面
在 general 选下卡下 设置 –>项目名称,描述,构建方式(本例采用参数化构建,version-name,version-code对外开放给测试人员)etc。
2.切换源码管理配置源码路径
本例采用svn作为源码仓库,这里svn项目配置成动态可调整的
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.选项卡切换到构建环境选项
5.选项卡切换到构建选项
选择 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 目录
包含脚本
注:
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