Xcode 9 Bot集成后XCS_PRODUCT路径IPA缺失,如何获取正确路径?
解决Xcode 9 Server Post Script中获取有效IPA路径的问题
我在Xcode 9配置CI Bot的时候也遇到过完全一样的问题,折腾了好一阵子才找到解决办法,先帮你理清问题根源,再给出可行的解决方案:
为什么会找不到对应的Integration文件夹?
主要有两个原因:
- 权限限制:Xcode Server是用系统用户
xcodeserver运行的,/Users/xcodeserver/Library/Caches/目录对普通用户(就是你在Finder里登录的账号)是没有访问权限的,所以你在Finder里看不到这个文件夹,但脚本在Xcode Server的运行上下文里是可以正常访问的。 - 缓存自动清理:Xcode 9的Server会在集成流程完全结束后,自动清理临时缓存目录。如果你的Post Trigger是设置在Post-Integration阶段运行,此时缓存已经被清理,
XCS_PRODUCT指向的路径自然就失效了。
可行的解决方案
1. 调整Trigger的运行时机
把你的Post Trigger设置为Post-Export阶段(而不是Post-Integration)。这个阶段是在IPA导出完成后、缓存清理前执行的,此时XCS_PRODUCT变量指向的路径100%有效,脚本可以直接读取或上传IPA文件。
2. 使用更稳定的环境变量
除了XCS_PRODUCT,Xcode 9 Server还提供了XCS_EXPORTED_PRODUCTS_DIR变量,它指向导出产品的根目录。你可以用这个变量来拼接IPA路径,稳定性更高:
# 获取目录下的IPA文件(假设只有一个IPA) IPA_FILE=$(ls "$XCS_EXPORTED_PRODUCTS_DIR" | grep -E "\.ipa$") IPA_PATH="$XCS_EXPORTED_PRODUCTS_DIR/$IPA_FILE" # 验证路径是否存在 if [ -f "$IPA_PATH" ]; then echo "找到IPA文件:$IPA_PATH" # 这里写你的上传逻辑 else echo "未找到IPA文件" fi
3. 手动验证路径(用于排查问题)
如果你想在Finder里确认IPA的存在,可以通过终端切换到xcodeserver用户访问目录:
# 切换到xcodeserver用户(需要管理员密码) sudo su - xcodeserver # 导航到ENV里显示的路径 cd /Users/xcodeserver/Library/Caches/XCSBuilder/Integration-51c2cf4d7b95c0c4a4f948f23001620e/ExportedProduct/ # 查看文件 ls
执行完这些命令就能看到IPA文件了,退出xcodeserver用户只需输入exit即可。
4. 避免缓存清理的影响(适合Post-Integration阶段)
如果必须在Post-Integration阶段运行脚本,可以先把IPA复制到一个普通用户能访问的共享目录,防止缓存被清理后丢失:
# 提前创建共享目录(给xcodeserver用户权限) SHARED_DIR="/Users/Shared/XcodeServerIPAs" mkdir -p "$SHARED_DIR" chown xcodeserver:staff "$SHARED_DIR" # 复制IPA到共享目录 cp "$XCS_PRODUCT" "$SHARED_DIR/$(basename "$XCS_PRODUCT")" # 之后就可以从共享目录读取文件上传了 UPLOAD_PATH="$SHARED_DIR/$(basename "$XCS_PRODUCT")"
内容的提问来源于stack exchange,提问作者Toseef Khilji
相关产品推荐
相关产品推荐

