与 Xcode Bot 的持续集成

Posted

技术标签:

【中文标题】与 Xcode Bot 的持续集成【英文标题】:Continuous integration with Xcode Bots 【发布时间】:2013-10-29 05:34:30 【问题描述】:

我想使用 Xcode 机器人进行持续集成。我已经安装了 OSX Mavericks 和 Server(版本 3)。我能够使用 Xcode 5.0.1 创建机器人。虽然集成它成功地执行了分析测试,但最终的集成结果总是失败。

集成失败。意外的内部服务器错误。有关更多详细信息,请参阅集成日志。`

我不了解服务器错误日志中的任何内容。由于某些 wiki 服务相关错误,它失败了。

谁能帮帮我?

Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:233 7e026310 +0ms] didReceiveData
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:246 7e026310 +2ms] connectionDidFinishLoading
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:172 7e026310 +0ms] Out of runloop; request completed
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceProxy.m:79 7e026310 +0ms] Received successful response.
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Info>: [CSConfig.m:55 7e026310 +0ms] Reading plist at /Library/Server/Wiki/Config/collabd.plist
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [XCSBuildHelper.m:97 7e026310 +0ms] Updating bot run with GUID fc16d3af-093e-44aa-8a40-ebfef45bbbd9
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [XCSBuildHelper.m:102 7e026310 +0ms] Updating bot run (fc16d3af-093e-44aa-8a40-ebfef45bbbd9): 
        guid = "fc16d3af-093e-44aa-8a40-ebfef45bbbd9";
        status = failed;
        subStatus = "internal-error";
    
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Info>: [CSConfig.m:55 7e026310 +0ms] Reading plist at /Library/Server/Wiki/Config/collabd.plist
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Info>: [CSConfig.m:55 7e026310 +0ms] Reading plist at /Library/Server/Wiki/Config/collabd.plist
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Info>: [CSRemoteServiceClient.m:151 7e026310 +0ms] Connecting to https://localhost:4443/svc to execute [https]RequestXCBotService.updateBotRun:(
        guid = "fc16d3af-093e-44aa-8a40-ebfef45bbbd9";
        status = failed;
        subStatus = "internal-error";
    )
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:159 7e026310 +0ms] Secure, async request
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:169 7e026310 +0ms] Before runloop; request pending
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:223 7e026310 +157ms] didReceiveResponse
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:225 7e026310 +0ms] response=<NSHTTPURLResponse: 0x7fd24a5a7980>  URL: https://localhost:4443/svc   status code: 200, headers 
        "Accept-Ranges" = bytes;
        "Content-Length" = 3700;
        "Content-Type" = "x-apple/msgpack";
        Date = "Tue, 29 Oct 2013 04:48:41 GMT";
        Status = 200;
        "X-Apple-collabd" = yes;
     
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:233 7e026310 +0ms] didReceiveData
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:246 7e026310 +0ms] connectionDidFinishLoading
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:172 7e026310 +0ms] Out of runloop; request completed
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceProxy.m:79 7e026310 +0ms] Received successful response.
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [XCSBuildHelper.m:108 7e026310 +0ms] Updating bot with GUID 4e122aa2-56dd-4e3a-ad6e-25be1a65e657
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [XCSBuildHelper.m:117 7e026310 +0ms] Updating bot with latest bot run GUID key
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [XCSBuildHelper.m:124 7e026310 +0ms] Updating bot (4e122aa2-56dd-4e3a-ad6e-25be1a65e657): 
        guid = "4e122aa2-56dd-4e3a-ad6e-25be1a65e657";
        latestFailedBotRunGUID = "fc16d3af-093e-44aa-8a40-ebfef45bbbd9";
        latestRunStatus = failed;
        latestRunSubStatus = "internal-error";
    
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Info>: [CSConfig.m:55 7e026310 +0ms] Reading plist at /Library/Server/Wiki/Config/collabd.plist
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Info>: [CSConfig.m:55 7e026310 +0ms] Reading plist at /Library/Server/Wiki/Config/collabd.plist
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Info>: [CSRemoteServiceClient.m:151 7e026310 +0ms] Connecting to https://localhost:4443/svc to execute [https]RequestXCBotService.updateBot:(
        guid = "4e122aa2-56dd-4e3a-ad6e-25be1a65e657";
        latestFailedBotRunGUID = "fc16d3af-093e-44aa-8a40-ebfef45bbbd9";
        latestRunStatus = failed;
        latestRunSubStatus = "internal-error";
    )
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:159 7e026310 +0ms] Secure, async request
Oct 29 10:18:41 AnilV-InetliMac.local xcsbuildd[11285] <Debug>: [CSRemoteServiceClient.m:169 7e026310 +0ms] Before runloop; request pending

【问题讨论】:

你使用什么样的存储库?我在使用普通的 SVN 存储库时遇到了问题。但我通过启用 svn+ssh 和公钥认证解决了这个问题。 @gamma 我正在使用托管的 SVN 存储库(需要密码验证)这是我公司提供的集中存储库 是的,设置差不多。唯一的方法是弄清楚如何使 svn+ssh 工作。我安装了一个 SSHService (Cygwin),为使用 Xcode 运行的用户和我的本地用户创建了 PublicKey auth 的身份验证方案。我还没有弄清楚如何使用密码验证来做到这一点。如果你愿意,我可以创建一个包含完整描述的答案 当然..你可以通过描述逐步设置svn + ssh工作的过程来发布答案 【参考方案1】:

问题似乎是XCode5 Bots不知道如何使用纯svn。你必须使用 svn+ssh。

[UPDATE] 你也可以使用 git ... 与你的 SVN 同步。工作流程略有不同,但效果很好。

我今天发现了这个:subgit

它完美集成到 GIT 和 SVN,您可以在 Xcode Server 中设置 GIT 存储库并使用 subgit 升级它们 - 它们都将保持同步。 (我花了大约半个小时才完全理解它是如何工作的)

最重要的是:10 人许可证(意味着通过 subgit 有 10 个协作者)是完全免费的(对于我的用例来说已经足够了)。

[PREVIOUS ANSWER] 我做了一个简单的解决方案,涉及 SVN 服务器机器上的 SSH 服务器。我觉得哪个都无所谓,但我目前正在使用 Cygwin。

在 /etc/sshd_config 你需要添加一个子系统

Subsystem "svnserve -t" /etc/svnserve-proxy

你需要创建文件/etc/svnserve-proxy

cat > /etc/svnserve-proxy
#!/bin/bash
svnserve -t -r <repository>

您必须分别修改svnserve 命令和repository。 在您的本地计算机上,您必须修改文件 ~/.subversion/config 并添加 [tunnels] 行:

[tunnels]
ssh = $SVN_SSH ssh -v -l <username> -s

username 是您要进行身份验证的用户的名称。 该解决方案快速而肮脏,并且不允许不同的用户进行身份验证。此外,Xcode 需要在本地机器和 Bot-Server 上使用相同的用户名。很有可能您必须创建一个 _teamsuser 主目录并在其中放置一个 subversion/config。

另一种方法是使用公钥(因为机器人服务器已经创建)然后您可以将它们放入 authorized_keys 并在前面放置一个命令:

command="svnserve -t -r <repository> --tunnel-user=<user>" rsa-ssh AAA

【讨论】:

我一直在尝试使用公钥进行此设置,但无法在 xcode 中创建机器人!我在设置 repo/帐户时遇到问题: Xcode -> Preferences -> Accounts tab 添加 repo 输入 svn+ssh 地址 Type Subversion 它要求输入用户名密码,但无处可放入密钥。在服务器设置方面,您实际上可以粘贴关键文本。当我点击添加时,它显示“正在验证凭据...”,然后在一个大的弹出窗口中显示 ssh 服务器横幅。 -更新 OMG 我删除了横幅及其身份验证 +1 用于更新答案并添加 subgit 路径。 git 也有 git svn 来做这件事。 atlassian.com/git/tutorials/migrating-overview【参考方案2】:

我遇到了类似的问题。就我而言,访问源代码存储库是个问题。 OSX 服务器有 DNS 问题,阻止它到达主机。您能否检查您是否能够访问您的源代码存储库?

【讨论】:

如何检查?你是如何解决你的问题的。我的存储库启用了代理,它需要身份验证。我已向 OSX 服务器提供了所需的凭据。我认为它能够访问存储库,因为集成仅在分析和测试后的最后阶段失败。最终结果总是失败 我明白了。您可以粘贴它在集成日志中显示的内容吗?在左侧选择最近的运行后,您将在机器人详细信息页面上找到它。【参考方案3】:

借助 Xcode 9,Apple 可以轻松地与 Xcode 机器人进行持续集成。

Xcode 服务器内置。持续集成机器人可以在任何带有 Xcode 9 的 Mac 上运行,无需安装 macOS 服务器。

我找到了一篇很好的文章,解释了如何使用 Xcode 9 进行配置。

Xcode9 - Xcode server comprehensive ios continuous integration

【讨论】:

以上是关于与 Xcode Bot 的持续集成的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Xcode Server bot 集成之前复制文件

执行持续集成时找不到头文件

与 Gerrit 和 Xcode Server 的持续集成

Xcode 项目的持续集成?

Xcode 持续集成——构建任何/所有分支

iOS持续集成大比拼:Xcode ServerJenkinsTravis和fastlane