ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于jenkins进行定制化开发

2026/8/2 19:09:48 拓冰建站 浏览量
基于jenkins进行定制化开发 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具起源于HudsonHudson是商用的主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写可在Tomcat等流行的Servlet容器中运行也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT构建工具有Maven、Ant、Gradle。目录环境配置创建构建任务生成APK生成二维码集成360加固集成蒲公英、Fir平台插件生成App BundleJenkins动态化参数介绍一键生成加固多渠道包脚本校验APK签名脚本插件1. 环境配置进入jenkins主界面系统管理-全局工具配置 进行配置包括 JDK,Git,Gradle,Maven等如下关于jdk的配置的设置。图1如上图给定一个别名通过下拉框选择相应的Jdk版本也可以通过FTP工具上传已经下载到本地的Jdk包。如下git配置需要指定一个本地已经下载好的路径。这种需要通过Ftp或者脚本提前下载指定版本的git工具。图2Gradle,Maven配置与jdk和git的配置雷同不做介绍。2. 如何创建一个构建任务生成apk需要新建一个构建任务这里构建一个自由风格的软件项目输入任务名称后就会自动创建一个构建项。图 3构建项包括 GeneralgitBucketJobNotifications源码管理构建触发器构建环境构建构建后操作。图4General可以设置一些项目介绍gitBucket未用到JobNotifications使用 UDP、TCP 或 HTTP 协议向定义的端点发送有关作业状态的通知设置同时并发构建数量源码管理配置关联不同的源码仓库gitsvnscms等构建触发器可以hook一些事件进行自动构建比如定时构建提交构建轮询scm构建等构建环境允许在构建之前进行一些操作比如更新lfs清除上一次构建缓存等构建指定构建脚本构建后操作主要配置构建后可以触发的操作如发布单元测试报告发送邮件通知发布工件到蒲公英fir等3. 生成apk基于步骤1步骤2只需要进行简单的配置即可打包apk如图5图5配置tasks clean debugDebug4. 生成二维码为了方便apk的下载安装将apk包的路径生成可直接下载的二维码图片。主要使用一个二维码生成的jar包。主要实现步骤:通过 jq工具解析gradle生成apk时的output-metadata.json获取apk名称进行输出找到输出的apk之后根据条件执行不同的逻辑比如加固。使用cp 命令将apk副本拷贝到指定目录然后通过QRcode.jar对目录中的apk路径生成二维码。在构建后操作 build description 插件指定二维码路径就可以在指定位置显示二维码。可以使用html调整二维码大小output-metadata.json{version:3,artifactType:{type:APK,kind:Directory},applicationId:com.codeview.takumi,variantName:debug,elements:[{type:SINGLE,filters:[],attributes:[],versionCode:1,versionName:1.0.0,outputFile:app-debug.apk}],elementType:File}使用方法需要用到 java -jar 命令java-jar/data/service/tomcat/QRcode.jar urlhttp://apk.android.reworldgame.com/apk/$JOB_NAME.apk image$JOB_NAME.jpg save/data/www/image # 使用二维码生成jar 生成二维码格式 java -jar 二维码生成jar路径 urlapk路径 imagexx.jpg save二维码地址tips 生成二维码的jar在java 8平台编译如果在java11 上不能运行。需要进行调整5. 集成360加固根据安全方面的考虑对在国内应用市场上线的apk上架app市场前做加固处理。选择360加固由于 360加固 助手提供命令行方式加固。#加固apk脚本 [参数1:加固apk 参数2加固apk输出路径 参数3: 海外国内来区分使用的签名文件]if[$jiagu true];then dos2unix/data/360/360jg.sh#忽略空格差异造成无法执行脚本bash-ex/data/360/360jg.sh ${WORKSPACE}/app/build/outputs/apk/${VARIABLE}/*.apk ${WORKSPACE}/app/build/outputs/apk/ china 完整shell脚本#!/bin/bashBASE/data/360/jiagu/jiagu.jar BASE2/data/360/jiagu/#360加固账号NAME360账户 PASSWORD360密码 APK$1DEST$2flavor$3#chinaFlag/apk/china/#根据输出路径判断是国内分支还是海外分支#if[[$APK ~$chinaFlag]]#then#flavorchina#else#flavoroverseas#fi#签名文件根据输入flavor来区分echoflavor $flavorif[$flavorchina];then KEY_PATH#密钥路径KEY_PASSWORD#密钥密码ALIASkey0#别名ALIAS_PASSWORD#别名密码elif[$flavorSouthEastAsia];then KEY_PATH#密钥路径KEY_PASSWORD#密钥密码ALIAS#别名ALIAS_PASSWORD密码#别名密码elseKEY_PATH/data/360/sign/reworldoversea.jks#密钥路径KEY_PASSWORD#密钥密码ALIAS#别名ALIAS_PASSWORD#别名密码fiecho------ 打包签名详情! ------echo使用的签名文件路径 $KEY_PATHechoApk包路径 $APKecho加固包输出路径 $DESTiecho------ running! ------cd$BASE2#java -jar ${BASE} -versionjava-jar ${BASE}-login ${NAME}${PASSWORD}java-jar ${BASE}-importsign ${KEY_PATH}${KEY_PASSWORD}${ALIAS}${ALIAS_PASSWORD}java-jar ${BASE}-showsign#java -jar ${BASE} -importmulpkg ${BASE2}/空渠道.txt #根据自身情况使用#java -jar ${BASE} -importmulpkg ${BASE2}/空渠道.txt #根据自身情况使用java-jar ${BASE}-showmulpkg java-jar ${BASE}-showconfig java-jar ${BASE}-jiagu ${APK}${DEST}-autosign#java -jar ${BASE} -pkgparam ${BASE2}/哈哈.txtecho--------finish------------tips:${WORKSPACE} 占位符方式可以获取jenkins默认本地变量和通过参数化构建设置的自定义变量6. 集成蒲公英fir平台插件发布到蒲公英和fir内测平台通过以上两个平台提供的快速发布插件可快速集成这里提供一种回显蒲公英平台生成二维码到jenkins的方案发布到蒲公英平台之后返回的json串格式如下{code:0,message:,data:{appKey:c2c6568526071a91d8ce0dfb596b894f,userKey:2b50d762a0957feaf481346938eba78e,appType:2,appIsLastest:1,appFileSize:259772621,appName:Reworld,appVersion:1.0.0,appVersionNo:1,appBuildVersion:1,appIdentifier:com.codereview.reworldsea,appIcon:5ff42e3dc70e4deffb8c0f48a3703dc2,appDescription:,appUpdateDescription:,appScreenshots:,appShortcutUrl:DrpS,appCreated:2021-11-25 14:29:00,appUpdated:2021-11-25 14:29:00,appQRCodeURL:https:\/\/www.pgyer.com\/app\/qrcodeHistory\/8273db84803bcb78f617c58c7d60f623ae20a25839d7efe9b90ea4788bba07f7}}shell脚本在将apk发布到蒲公英之后对返回的结果json串中appQRCodeURL的值进行解析。# 脚本文件 pgyUpdate.sh#!/bin/bash#MAIN_MODULE AndroidStudio project directory under the main moduleMAIN_MODULE.#The test address separately#MAIN_MODULE./app# pgy API accountPGYER_USER_KEY蒲公英userkeyPGYER_API_KEY蒲公英api key#APK path#APK_PATH${MAIN_MODULE}/build/outputs/apk#Receive the external transfer apk pathAPK_PATH$1echo#echo current path: pwdechoAPK_PATH${APK_PATH}APK_LISTls-t ${APK_PATH}echo${APK_LIST}#ind the latest apk packageforAPK_FILE in ${APK_LIST};doAPK_NAME${APK_FILE}echoapk file name$APK_NAMEFile$APK_FILEdone#-------------------------------------------------if[-n$APK_NAME];then# Determine whether is emptyechoupload$APK_FILEpgy#upload pgy updateDescription(version descript)RESULT$(curl-Ffile${APK_PATH}/${APK_NAME}-FuKey${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 testqq.com# echo ${RESULT} | mail -s ${APK_NAME} already unload pgy testqq.com# #http://www.pgyer.com/apiv1/app/uploadfi构建块中添加执行发布到分发平台的shell脚本即可#发布到蒲公英if[$pgy true];then cd/data/pgyupdate./pgyUpdate.sh ${WORKSPACE}/app/build/outputs/apk/${VARIABLE}/fifir类似不赘述7. 生成App BundleAAB格式为上架google play需要与生成apk区别点在于构建方式不同。构建之后的处理与apk类似。构建块中添加执行发布到分发平台的shell脚本即可if[bundle$packageType];then cd/data/www/aab/# typeset -l lowerBuildChannel${Build_channel}# typeset -l lowerBuildType${Build_type}lowerBuildChannel${Build_channel,}lowerBuildType${Build_type,,}aabDir${WORKSPACE}/app/build/outputs/bundle/${lowerBuildChannel}${Build_type}aabName${aabDir}/app-${lowerBuildChannel}-${lowerBuildType,}.aabecho$aabNamecp${aabDir}/*.aab/data/www/apk/$JOB_NAME.aab java-jar/data/service/tomcat/QRcode.jar urlhttp://apk.android.reworldgame.com/apk/$JOB_NAME.aab image$JOB_NAME.jpg save/data/www/imageexitfi8. jenkins动态化参数介绍参数构建是实现jenkins动态构建的基础。8.1 字符参数图6如上图在需要用到的地方使用${App_VERSION_CODE}既可以取出来2406值来使用8.2选项参数图78.3布尔参数图88.4动态选择参数图98.5 最终构建任务样式一键生成加固多渠道包脚本脚本逻辑介绍对等待加固的apk使用360加固包提供的脚本jar文件进行加固然后针对生成的加固包执行wallet.jar 多渠道脚本,基于加固包生成多个渠道的apk文件提供给对应渠道进行上架。echooffecho push apk to here ::需要加固的apk路径set/p APK nulsetAPK_VERSION1setAPK_FLAVOR1setremain%APK%setindex0 :loopfor/ftokens1* delims_%%a in(%remain%)do(if%index%1(setAPK_FLAVOR%%a)if%index%2(setAPK_VERSION%%a)set/a indexindex1 rem 将截取剩下的部分赋给变量remain其实这里可以使用延迟变量开关setremain%%b)::如果还有剩余,则继续分割ifdefined remain goto :loopsetAPK_FLAVOR%APK_FLAVOR:~0,7%echo%APK%echoAPK_VERSION%APK_VERSION% APK_FLAVOR%APK_FLAVOR% ::加固配置setSRTC:\360\jiagusetNAME360账户setPASSWORD360账户密码 cd%SRT%echocurrent path %cd%if%APK_FLAVOR%oversea(echo oversea setBASEC:\360\haiwai\jiagu\jiagu.jar ::密钥路径setKEY_PATH./jsk/reworldoversea.jks ::密钥setKEY_PASSWORD密码 ::别名setALIAS别名 ::别名密码setALIAS_PASSWORD别名密码 ::输出加固包路径setDEST./海外/%APK_VERSION%echo本次使用印度签名)elseif%APK_FLAVOR%southEa(echo SouthEastAsia setBASEC:\360\southEastAsia\jiagu\jiagu.jar ::密钥路径setKEY_PATH./jsk/xxx.jks ::密钥密码setKEY_PASSWORD密码 ::别名setALIAS别名 ::别名密码setALIAS_PASSWORD别名密码 ::输出加固包路径setDEST./东南亚/%APK_VERSION%echo本次使用东南亚签名)else(echo china setBASE./jiagu.jar ::密钥路径setKEY_PATH./jsk/test.jks ::密钥密码setKEY_PASSWORD密码 ::别名setALIAS别名 ::别名密码setALIAS_PASSWORD别名密码 ::输出加固包路径setDEST./国内/%APK_VERSION%echo本次使用china签名)echo%BASE% jiagu apk output path :%DEST% md%DEST%echo------ jaigu running! ------java-jar%BASE%-version java-jar%BASE%-login%NAME%%PASSWORD% java-jar%BASE%-importsign%KEY_PATH%%KEY_PASSWORD%%ALIAS%%ALIAS_PASSWORD% java-jar%BASE%-showsign java-jar%BASE%-showmulpkg java-jar%BASE%-showconfig java-jar%BASE%-jiagu%APK%%DEST%-autosignecho------ jaigu finished! ------echo------ start rename ------cd%DEST%echocurrent path %cd%for%%i in(./*.apk)do(echo%%i|findstrjiagunul (echofind jiagu apkecho%%i|findstrsignnul (echofind signed apkcopy%%ireworld.apkgoto loop2))):loop2echo------ end rename ------echo------ start walle ------cd%SRT%echocurrent path %cd%setCHANNEL_PATH%DEST%/%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% java-jar./walle-cli-all.jar batch-f./walle临时渠道.txt%~f1%DEST%/reworld.apk%CHANNEL_PATH% ::统计目录下文件个数 cd%CHANNEL_PATH%echocurrent path %cd%setcount0for%%i in(./*.apk)doset/a count1echo------channel file count:%count%------echo------ end walle ------Pause10. 校验apk签名脚本脚本介绍针对加固之后apk签名与正确签名进行比对避免海外国内市场apk签名错用。echooffecho push apk to here ::需要加固的apk路径set/p APK nulecho apk path is%APK% echo push flavor to here echo1:chinaecho2:overseaecho3:southAsiaset/p APK_FLAVOR_TYPE nulif%APK_FLAVOR_TYPE%1(setAPK_FLAVORchinasetAPK_DEFINE_SHA1bd67d0933ec6a40fb)elseif%APK_FLAVOR_TYPE%2(setAPK_FLAVORoverseasetAPK_DEFINE_SHA15e33c207b8621a5a8bc458eb)elseif%APK_FLAVOR_TYPE%3(setAPK_FLAVORsouthAsiasetAPK_DEFINE_SHA1478550704adff0a1a89)else(setAPK_FLAVORunKnowsetAPK_DEFINE_SHA1unSet)echo choice flavor is%APK_FLAVOR% setSIGNER_INFO_PATHtemp_singer.txtsetLINE_SHA1_FLAGSHA-1 java-jar.\apksigner.jar verify--print-certs%APK% %SIGNER_INFO_PATH% call :read_apk_signer_sha1%SIGNER_INFO_PATH% :read_apk_signer_sha1for/ftokens1,2 delims:%%a IN(%1)do(echo%%a%%becho%%a|findstr%LINE_SHA1_FLAG% nul setAPK_SHA1%%b):del_leftif%APK_SHA1:~0,1% setAPK_SHA1%APK_SHA1:~1%goto del_leftecho%APK_DEFINE_SHA1% echo%APK_SHA1% if%APK_SHA1% equ%APK_DEFINE_SHA1%(echo SHA1 is right )else(echo SHA1 is wrong )pause11. 插件1.jenkins 下载地址2. 动态选择插件