你是否曾经厌烦过手动构建移动端应用程序的繁琐过程?每次修改代码后都要重新编译、打包、签名,再上传至应用商店,这一系列操作不仅费时费力,还容易出错。
如果你也有这样的困扰,那么恭喜你,今天我们将介绍一种解决方案:使用Jenkins自动构建移动端App。
实现案例
一个基于Jenkins 进行开发的自动构建系统,使用专门的机器负责所有App的构建任务,目的是解决简化打包流程。
目前公司项目已接入。系统根据不同项目主要分为两种类型的任务:
-
一种是 iOS/Android 内测分发的构建任务;
-
另一种则是iOS构建好后直接上传到 TestFlight/AppStore 的构建任务。
整体流程:
iOS内测分发构建任务流程:
选择想要构建的任务 -> 选择需要构建的分支 -> 点击开始构建 -> 系统自动拉取项目代码 -> 自动下载相关依赖项目后进行整体项目的集成 -> 编译构建打包 -> 将生成的ipa包上传到OSS服务器存档 -> 上传到蒲公英平台 -> 根据生成的ipa包相关基本信息、下载安装地址与途径以钉钉形式发送。
AppStore上传构建任务流程:
选择想要构建的任务 -> 选择需要构建的分支 -> 点击开始构建 -> 系统自动拉取项目代码 -> 自动下载相关依赖项目后进行整体项目的集成 -> 编译构建打包 -> 将生成的ipa包上传到OSS服务器存档 ->上传到TestFlight/AppStore -> 上传到蒲公英平台 -> 根据生成的ipa包相关基本信息、下载安装地址与途径以钉钉形式发送。
Android内测分发构建任务流程:
选择想要构建的任务 -> 选择需要构建的分支 -> 点击开始构建 -> 系统自动拉取项目代码 -> 自动下载相关依赖项目后进行整体项目的集成 -> 编译构建打包 -> 将生成的apk包加渠道 -> 上传阿里云进行加固 -> 加固包重新签名 -> 上传到OSS服务器存档 -> 上传到蒲公英平台 -> 根据生成的apk包相关基本信息、下载安装地址与途径以钉钉形式发送。
实现步骤
安装jenkins
先安装JDK,然后下载最新的war包,打开终端,进入到war包所在目录,执行命令:
java -jar jenkins.war --httpPort=8080
http://localhost:8080
-
Git插件
-
Git 参数化构建插件(Git Parameter)
-
Gradle 插件 (Gradle plugin) - Android 专用
-
Xcode 插件 (Xcode integration) - iOS 专用
-
Jenkins 输出日志文字颜色插件(AnsiColor)
iOS Job自动构建设置
编译打包之前干了什么?
修改版本号以及build号
PlistBuddy 是 Mac 系统中一个用于命令行下读写 plist 文件的工具。可以用来读取或修改 plist 文件的内容/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString
APPVERSION""APP_VERSION" "APPVERSION""{project_infoplist_path}"
bundleShortVersion=(/usr/libexec/PlistBuddy−c"printCFBundleShortVersionString""(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "(/usr/libexec/PlistBuddy−c"printCFBundleShortVersionString""{project_infoplist_path}")
build号(一个版本对应一个json文件,内容为
{"BuildNumber": 99, "BuildVersion": "2.0.0"} 每次编译打包前递增build号,然后修改
Info.plist的build号
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BuildNumber" "${project_infoplist_path}"
bundleVersion=(/usr/libexec/PlistBuddy−c"printCFBundleVersion""(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "(/usr/libexec/PlistBuddy−c"printCFBundleVersion""{project_infoplist_path}")
编译打包
-
清理:xcodebuild -workspace "WORKSPACE"−scheme"{WORK_SPACE}" -scheme "WORKSPACE"−scheme"{TARGET_NAME}" -configuration 'Release' clean
-
编译:xcodebuild archive -workspace "WORKSPACE"−sdkiphoneos−scheme"{WORK_SPACE}" -sdk iphoneos -scheme "WORKSPACE"−sdkiphoneos−scheme"{TARGET_NAME}" -archivePath "./build/${XCARCHIVE}" -configuration 'Release' -arch "arm64"(-archivePath:设置项目的归档路径)
-
导出ipa:xcodebuild -exportArchive -archivePath "./build/XCARCHIVE"−exportPath"./build/{XCARCHIVE}" -exportPath "./build/XCARCHIVE"−exportPath"./build/{IPAPATH}" -target "TARGETNAME"−exportOptionsPlist"{TARGET_NAME}" -exportOptionsPlist "TARGETNAME"−exportOptionsPlist"{EXPORTOPTIONSPLIST}" -allowProvisioningUpdates-exportArchive:导出ipa
-exportPath:导出ipa文件的路径
-exportOptionsPlist:文件导出时的配置信息
-allowProvisioningUpdates:允许xcodebuild与苹果网站通讯,进行自动签名,证书自动更新,生成
上传appstoreXcode 11 之后已不再提供 Application Loader,改用 xcrun altool 上传 ipaaltool 可以 --validate-app 验证和 --upload-app 上传
验证:
/usr/bin/xcrun altool --validate-app -f ${IPANAME} -t ios --apiKey C7RL3QD397 --apiIssuer 69a6de97-9460-47e3-e053-5b8c7c11a4d1 --verbose
apiKey 和 apiIssuer 需要登录开发者网站,打开 用户和访问->密钥->然后新增密钥
成功会提示:No errors validating archive at ...
上传:
/usr/bin/xcrun altool --upload-app -f ${IPANAME} -t ios --apiKey C7RL3QD397 --apiIssuer 69a6de97-9460-47e3-e053-5b8c7c11a4d1 --verbose
如下图所示,表示上传成功
小提示:
每次 TestFlight 发布测试都会询问你的 app 有没有使用加密技术,勾选完后才能测试。这时可以在 Info.plist 添加 ITSAppUsesNonExemptEncryption 为 false 就可以了。
ITSAppUsesNonExemptEncryption 下次打包上传,接收到 App Store Connect 邮件 has completed processing 就能自动发布测试了。
上传oss
发送钉钉
将截图所示数据拼接之后发送钉钉
Android Job自动构建设置
渠道包
解压之后,META-INF文件夹下写入文件kpl_channel_{channel}(我们目前是这样做的)
签名
官网介绍:
zipalign 是一种归档对齐工具,可对 Android 应用 (APK) 文件提供重要的优化。
其目的是要确保所有未压缩数据的开头均相对于文件开头部分执行特定的对齐。
具体来说,它会使 APK 中的所有未压缩数据(例如图片或原始文件)在 4 字节边界上对齐。这样做的好处是可以减少运行应用时消耗的 RAM 容量。
按着有利于系统处理的排列方式,对我们apk中的资源文件进行排列,提高资源的查找速度,从而去提高应用的运行效率。
zipalign 4 {old_apk_path} {new_apk_path} 对齐
zipalign -c -v 4 {new_apk_path} 检测是否对齐成功
apksigner sign --ks {jks_path} --ks-key-alias {ks_key_alias} --ks-pass pass:{ks_pass} --key-pass pass:{key_pass} --v1-signing-enabled true --v2-signing-enabled true {new_apk_path} 签名
--ks //签名证书路径--ks-key-alias //生成jks时指定的alias--ks-pass //密码--key-pass //签署者的密码,即生成jks时指定alias对应的密码
最后
这篇文章主要介绍了自动构建的整体思路,以及Jenkins设置。
分开APP主要通过蒲公英,但实际使用中,上传蒲公英可能比较耗时,其实可以去除上传蒲公英,只上传OSS然后通过OSS下载链接生成二维码,这样能减少上传耗时步骤。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。