如何从 Xcode Bot 将自动化构建部署到 TestFlight?
Posted
技术标签:
【中文标题】如何从 Xcode Bot 将自动化构建部署到 TestFlight?【英文标题】:How do I deploy automated builds to TestFlight from an Xcode Bot? 【发布时间】:2013-10-24 01:06:38 【问题描述】:我花了很多时间用代码、屏幕截图等来格式化提到的博客,这在 Stack Overflow 上复制起来太费力了。也就是说,我认为社区会在这个领域需要一些帮助(我挣扎了很长时间才弄清楚),所以我发布了这个问题和相应的答案。如果你仍然认为这篇文章的意图是邪恶的,请发表评论,我会删除它!
问题是:如何使用 Bot 配置我的新 Xcode 服务器,以通过试飞持续集成并发送完成的构建给我的测试人员?对我来说,这似乎是 ios 世界中 CI 的圣杯,所以我花了很多时间来弄清楚。
该过程涉及一些手动工作,至少在初始版本中,Mavericks 中的 XCode 服务器软件似乎无法正确完成这些工作。我花了很多时间,甚至编写了一些脚本来弄清楚这一切并让它发挥作用,我很高兴分享结果。
为了增加这个问题的价值,我已经发布了您应该在下面的存档过程中运行的术后脚本。如果您需要更多信息,下面的我的博客链接提供了分步详细信息。
#!/bin/bash
#
# (Above line comes out when placing in Xcode scheme)
#
# Valid and working as of 10/29/2013
# Xcode 5.0.1, XCode Server
#
API_TOKEN="<Your TesFlight API Token>"
TEAM_TOKEN="<Your TestFlight Team Token>"
DISTRIBUTION_LISTS="<Comma separated TestFlight Distribution List Names for auto deploy>"
PROVISIONING_PROFILE="/Library/Server/Xcode/Data/ProvisioningProfiles/<your file name here>.mobileprovision"
#EXAMPLE:"/Library/Server/Xcode/Data/ProvisioningProfiles/DocLink_InHouse_2013.mobileprovision"
SIGNING_IDENTITY="<your provisioning profile name here>"
#EXAMPLE:"iPhone Distribution: Unwired Revolution, LLC."
# DO NOT EDIT BELOW HERE!
########################################
DSYM="/tmp/Archive.xcarchive/dSYMs/$PRODUCT_NAME.app.dSYM"
IPA="/tmp/$PRODUCT_NAME.ipa"
APP="/tmp/Archive.xcarchive/Products/Applications/$PRODUCT_NAME.app"
# Clear out any old copies of the Archive
echo "Removing old Archive files from /tmp...";
/bin/rm -rf /tmp/Archive.xcarchive*
#Copy over the latest build the bot just created
echo "Copying latest Archive to /tmp/...";
LATESTBUILD=$(ls -1rt /Library/Server/Xcode/Data/BotRuns | tail -1)
/bin/cp -Rp "/Library/Server/Xcode/Data/BotRuns/$LATESTBUILD/output/Archive.xcarchive" "/tmp/"
echo "Creating .ipa for $PRODUCT_NAME"
/bin/rm "$IPA"
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$APP" -o "$IPA" --sign "$SIGNING_IDENTITY" --embed "$PROVISIONING_PROFILE"
echo "Done with IPA creation."
echo "Zipping .dSYM for $PRODUCT_NAME"
/bin/rm "$DSYM.zip"
/usr/bin/zip -r "$DSYM.zip" "$DSYM"
echo "Created .dSYM for $PRODUCT_NAME"
echo "*** Uploading $PRODUCT_NAME to TestFlight ***"
/usr/bin/curl "http://testflightapp.com/api/builds.json" \
-F file=@"$IPA" \
-F dsym=@"$DSYM.zip" \
-F api_token="$API_TOKEN" \
-F team_token="$TEAM_TOKEN" \
-F distribution_lists="$DISTRIBUTION_LISTS" \
-F notes="Build uploaded automatically from Xcode Server Bot."
echo "TestFlight upload finished!"
我希望我花在它上的所有时间都能为社区集体拯救更多的人!
这里是链接:http://matt.vlasach.com/xcode-bots-hosted-git-repositories-and-automated-testflight-builds/
【问题讨论】:
我已经和作者谈过要让这篇文章更像“堆栈溢出风格”的帖子。请暂时停止举报或采取其他行动,让他有机会进行修改。 感谢您重新添加。希望修改得合适,对大家有帮助! 上述curl
命令在 Xcode 10(可能更早)中不起作用,您需要使用 altool
提交您的 TestFlight 并将二进制文件发布到 App Store
【参考方案1】:
这是一篇文章的链接,其中概述了如何创建 Xcode 机器人,连接到第 3 方 git 存储库,并自动将构建部署到 TestFlight:
http://matt.vlasach.com/xcode-bots-hosted-git-repositories-and-automated-testflight-builds/
希望对您有所帮助!请说出您的 cmets 或反馈意见。
【讨论】:
【参考方案2】:Xcode 12
使用 xcodebuild 命令行工具
1.创建分发证书
2.创建分发资料
3.添加“集成后脚本”
[试飞]脚本
# Remove & Copy assets
rm -r $XCS_SOURCE_DIR/Archive
cp -R $XCS_OUTPUT_DIR/ $XCS_SOURCE_DIR/Archive
# Upload to TestFlight
IFS=$'\n'
ARCHIVE_PATH=$(find $XCS_SOURCE_DIR$PRODUCT_NAME -name "BeBe.xcarchive")
IFS=$' '
IFS=$'\n'
PLIST_PATH=$(find $XCS_SOURCE_DIR$PRODUCT_NAME -name "exportOptions.plist")
IFS=$' '
xcodebuild -exportArchive -archivePath $ARCHIVE_PATH -exportOptionsPlist $PLIST_PATH -exportPath $ARCHIVE_PATH
4.在项目文件夹中添加“exportOption.plist”文件。
要导出 ipa 文件,您需要“exportOption.plist”文件。
exportOption.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<key>destination</key>
<string>upload</string>
</dict>
</plist>
5.运行你的机器人
6.检查您的构建
【讨论】:
这对我不起作用我收到错误“xcodebuild:错误:选项'-exportPath'需要一个参数”它说它是一个触发错误。有什么想法吗? echo $ARCHIVE_PATH (添加到 TestFlight 脚本) 你可以通过 echo 检查你的 exportPath 我编辑了 TestFlight 脚本 -exportPath $ARCHIVE_PATH // 删除了双空格 所以,ARCHIVE_PATH 找到了一个名为 BeBe.xcarchive 的文件。然后将其上传到 App Store Connect。但是我现在遇到的问题是它使用了我放置的 xcarchive 文件(抓取了一个随机文件并将其放置在路径位置并提交),而不是使用集成创建的实际 xcarchive 文件。那么如何将集成的 xcarchive 文件放在一个文件夹中,然后将其上传到 App Store connect?我认为您的回答可能不完整。或者我错过了什么。以上是关于如何从 Xcode Bot 将自动化构建部署到 TestFlight?的主要内容,如果未能解决你的问题,请参考以下文章
集成后的 Xcode 6 Bot 将 .archive 文件下载到位置
您如何配置 Xcode Server (Bot) 以仅保留 n 个最近的集成?