基于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. 动态选择插件

相关新闻

【软件】【vs】Visual Studio编译c语言程序

【软件】【vs】Visual Studio编译c语言程序

1、创建新项目2、搜索c,选择“空项目”3、输入项目名称,和项目要存放的位置:4、VisualStudio资源管理器中的源文件右键选择:添加-->新建项-->c文件(.cpp),将文件命名成.c文件即可&#xf…

2026/8/2 19:10:07 阅读更多 →
DirectShow图像处理实战:从Filter Graph架构到实时边缘检测实现

DirectShow图像处理实战:从Filter Graph架构到实时边缘检测实现

1. 项目概述:为什么DirectShow在图形图像处理中依然值得深挖? 如果你在Windows平台上用Visual C搞过音视频开发,或者处理过摄像头采集、视频播放、格式转换这些活儿,那“DirectShow”这个名字对你来说肯定不陌生。它是一套微软在…

2026/8/2 19:10:07 阅读更多 →
Unity GPU骨骼动画插件实战:破解2D割草游戏万人同屏性能瓶颈

Unity GPU骨骼动画插件实战:破解2D割草游戏万人同屏性能瓶颈

1. 项目概述:当2D割草游戏遇上万人同屏的挑战如果你正在开发一款2D割草游戏,脑子里想的肯定是满屏的敌人、华丽的特效和丝滑流畅的战斗体验。但现实往往是,当屏幕上同时出现几百个敌人时,帧率就开始断崖式下跌,手机发烫…

2026/8/2 19:09:07 阅读更多 →

最新新闻

Open WebUI技术架构解析:构建企业级AI平台的完整指南

Open WebUI技术架构解析:构建企业级AI平台的完整指南

Open WebUI技术架构解析:构建企业级AI平台的完整指南 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI作为一款开源自托管AI平台&…

2026/8/2 19:54:35 阅读更多 →
Godot引擎FPS游戏开发:物理碰撞、摄像机控制与性能优化实战

Godot引擎FPS游戏开发:物理碰撞、摄像机控制与性能优化实战

1. 项目概述:当你的FPS游戏在Godot里“卡壳”了做独立游戏,尤其是第一人称射击(FPS)这种对性能和手感要求极高的类型,选Godot Engine绝对是个充满挑战又极具性价比的决定。我见过太多开发者,包括我自己&…

2026/8/2 19:54:35 阅读更多 →
从0到1掌握C++ Streams:新手必备的函数式编程库入门教程

从0到1掌握C++ Streams:新手必备的函数式编程库入门教程

从0到1掌握C Streams:新手必备的函数式编程库入门教程 【免费下载链接】Streams Lazy evaluation in C - http://jscheiny.github.io/Streams/ 项目地址: https://gitcode.com/gh_mirrors/str/Streams C Streams是一个强大的函数式编程库,它通过延…

2026/8/2 19:54:35 阅读更多 →
hexo-theme-inside开发者指南:插件开发与贡献代码的快速入门

hexo-theme-inside开发者指南:插件开发与贡献代码的快速入门

hexo-theme-inside开发者指南:插件开发与贡献代码的快速入门 【免费下载链接】hexo-theme-inside 🌈 SPA, Flat and clean theme for Hexo https://blog.oniuo.com/theme-inside 项目地址: https://gitcode.com/gh_mirrors/hex/hexo-theme-inside …

2026/8/2 19:54:35 阅读更多 →
ChatGPT+Notion+飞书≠高效协作!真正起效的AI协作引擎,藏在这4个隐性协议里

ChatGPT+Notion+飞书≠高效协作!真正起效的AI协作引擎,藏在这4个隐性协议里

更多请点击: https://kaifayun.com 第一章:ChatGPTNotion飞书≠高效协作!真正起效的AI协作引擎,藏在这4个隐性协议里 工具堆叠不等于能力升级。当团队把ChatGPT嵌入Notion、再同步到飞书多维表格时,常陷入“数据在流转…

2026/8/2 19:54:35 阅读更多 →
CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号

CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号

CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号 【免费下载链接】coffeecatch CoffeeCatch, a tiny native POSIX signal catcher (especially useful for JNI code on Android/Dalvik) 项目地址: https://gitcode.com/gh_mirrors/co/coffeecatch …

2026/8/2 19:53:34 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →