Xcode Server bot运行自增build号pre-integration脚本报错如何解决
问题原因
- 报错本质是
pre-integration阶段的运行环境和本地Scheme构建阶段的环境不同:Xcode Server的pre-integration触发器执行时,Xcode还未开始解析项目构建设置,${PROJECT_DIR}、${INFOPLIST_FILE}这两个你用到的环境变量此时是空值。 - PlistBuddy读取空路径时会输出
Error Reading File: /报错文本,你把这段文本赋值给了buildNumber变量,后续做加法运算时相当于执行了Error Reading File: / + 1,所以日志才会出现你没写过的+1相关语法错误。 - 本地Scheme的构建后动作可以正常运行,是因为该阶段已经完成了构建设置解析,两个环境变量都有正确值。
解决方案
你需要使用Xcode Server pre-integration阶段默认提供的${XCS_SOURCE_DIR}环境变量拼接Info.plist的绝对路径,这个变量指向bot拉取的代码仓库根目录。
操作步骤
- 先确认Info.plist相对于你代码仓库根目录的路径,比如你的Info.plist存放在项目根目录下
MyApp/Info.plist,那相对路径就是MyApp/Info.plist - 替换为以下带容错逻辑的脚本,将示例的相对路径替换为你自己的实际路径:
#!/bin/sh # 替换为你的Info.plist相对于代码仓库根目录的路径 INFO_PLIST_RELATIVE_PATH="MyApp/Info.plist" INFO_PLIST_PATH="${XCS_SOURCE_DIR}/${INFO_PLIST_RELATIVE_PATH}" # 先检查文件是否存在 if [ ! -f "${INFO_PLIST_PATH}" ]; then echo "错误:Info.plist不存在,路径为${INFO_PLIST_PATH}" exit 1 fi # 读取build号 buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFO_PLIST_PATH}") # 校验读取结果是否为数字 if ! [[ "${buildNumber}" =~ ^[0-9]+$ ]]; then echo "错误:读取到的CFBundleVersion不是数字,值为${buildNumber}" exit 1 fi # 自增 buildNumber=$((buildNumber + 1)) # 写回plist /usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${buildNumber}" "${INFO_PLIST_PATH}" echo "build号已更新为${buildNumber}"
额外注意
如果你的项目开启了GENERATE_INFOPLIST_FILE配置(Xcode 13+新建项目默认开启),Info.plist是编译时自动生成的,你不能直接修改源码路径下的Info.plist,需要调整自增逻辑为修改Xcode项目的CURRENT_PROJECT_VERSION配置,对应修改脚本的操作对象为.xcodeproj或者.pbxproj文件即可。
内容的提问来源于stack exchange,提问作者user16777344
相关产品推荐
相关产品推荐

