Apple CI / Xcode 服务和 Jenkins

Posted

技术标签:

【中文标题】Apple CI / Xcode 服务和 Jenkins【英文标题】:Apple CI / Xcode Service and Jenkins 【发布时间】:2013-08-05 13:39:53 【问题描述】:

有没有办法/插件将新的 Xcode 服务和/或新的 Apple CI 与 Jenkins 集成?

为什么?

通过ssh 连接 Jenkins 服务器 + OSX 构建从站的一个主要问题是 单元测试不起作用,因为 ios 模拟器需要一个图形环境,而该环境中不存在配置。

我希望可以将 Xcode 服务(支持单元测试)与 Jenkins 集成。

使用 Apple CI 可能足以满足我的需求,但这个问题的目的是 Xcode 服务与 Jenkins 的集成

我已经知道的事情

我有使用existing Xcode Jenkins plugin 的经验,但它似乎不支持全新的 Xcode 服务或新的 Apple CI。我特别热衷于通过 CI 进行单元测试(在使用旧方法的 ssh 会话中无法正常工作)。

我想知道的

我想了解以下当前无法与 Jenkins 和 ssh 连接的构建从站合作的问题:

无头系统上的单元测试 Frank 或类似的验收测试 自动配置配置文件更新(Apple CI 会这样做)

关于目前在 Jenkins 和 ssh 连接的构建从属设备上可以正常工作并且仍应与 Xcode 服务集成一起工作的信息:

不同构建配置(发布、调试、TestFlight)/方案的构建 自动内部版本号递增 (使用 Jenkins,我可以将项目中的内部版本号设置为 $BUILD_NUMBER,并且 Jenkins 根据其内部版本号设置此环境变量。当 Apple CI 进行构建时,它很可能会设置内部版本号。) 在 Jenkins 和 Apple CI 之间处理/同步内部版本号 从不同的 Jenkins 作业访问 Apple CI 的构建产品 例如将作业上传到 TestFlight 构建备份 在 git push 上自动构建到特定分支 电子邮件通知

一些额外的问题/提示

我不确定是Apple CI == Xcode service 还是Apple CI 只是使用 Xcode 服务。在后一种情况下,Xcode 服务就像一个智能构建奴隶,詹金斯也许可以使用它来进行构建和测试,但自己管理内部版本号和产品。 我知道 Apple CI 是一个单独的 CI,将多个 CI 相互集成并不是最简单或最有用的方法。我只是担心 Apple CI 不够灵活,无法满足我的需求(见上文),而 Jenkins 的旧方法存在一些问题(见上文)。

【问题讨论】:

你不会在 iOS 标签上找到很多人可以回答这个问题,因为除非我们是 Mac 开发者计划的成员,否则我们不会获得 OSX Mavericks。我正在添加“osx”标签。 谢谢,你是对的。 devforums.apple.com/thread/198677 如果你还想集成 jenkins,不妨在帖子中提及。 也可以看看here。您可能希望将帖子移至其他主题(xcode beta 或 mavericks beta) 【参考方案1】:

我相信您将不得不选择 jenkins 或 xcode 服务器,而不是两者。我对 xcode server 不太了解,但我对 jenkins 和 xcode 5 了解。

使用不同配置构建

在xcode插件中,可以设置使用的scheme。

内部版本号自动递增

我在我的 jenkins 作业中添加了一个名为 XCODEBUILDNUMBER 的参数。每当我开始构建时,我只需将构建号从我的 xcode 项目中复制出来(我手动递增它。我的看起来像 080813A)并将其粘贴到 XCODEBUILD 参数中。我用它来命名我的输出文件等。有一些 jenkins 插件可以自动增加你的内部版本号,但它们不集成,也不与 xcode 同步。

Jenkins 和 Apple CI 之间内部版本号的处理/同步

正如我之前所说,我不知道同步内部版本号的方法,但我只是想到了一个可能的解决方案。您可以使用命令行工具 plistbuddy,在 info.plist 中设置构建号,作为 jenkins 作业中的构建步骤。

单元测试

我还没有成功地使单元测试与 Xcode5 一起工作,但我知道 jenkins 的 xcode 插件支持它。我相信项目设置中缺少“Test After Build”键可能与此有关。如果你让它工作,我很想知道。 (我也热衷于制作这项工作)

验收测试

据我所知,Frank 是一个命令行工具。您可以轻松地将它集成到您​​的 Jenkins 工作中,并且我相信如果您的测试没有通过,它会导致构建失败。

从不同的 Jenkins Jobs 访问 Apple CI 的构建产品

不完全确定您的意思,但使用 jenkins,您可以存档您的构建产品(一个 .ipa),以便以后下载并上传到像 testflight 这样的服务。同样,我对 Xcode Server (CI) 了解不多。

构建备份

正如我之前所说,jenkins 可以归档您的构建产品。此外,我在构建产品目录中使用了 $BUILD_NUMBER 变量,因此每个构建都有不同的目录。这个目录也备份到我的 Time Machine,重要的构建复制到我的 web 目录。

基于 git push 自动构建到特定分支

使用 jenkins git 插件,您可以让 jenkins 在您指定的时间间隔内轮询您的 scm,并可以在更改时触发构建。

电子邮件通知

我确信有一个插件可以解决这个问题。 (当构建失败/成功时向您发送电子邮件。事实上,这可能是内置的)

即将结束

xcode CI 是一个完全独立的 CI,可能很难与 jenkins 集成。就个人而言,我会推荐 jenkins 仅仅是因为它的可扩展性。抱歉,我对 Xcode Server 了解不多。

【讨论】:

感谢您的广泛回答,但我已经知道如何将 Jenkins 与带有 xcode-plugin 的常规 OSX 构建从站一起使用。这有几个缺点(单元测试不起作用,因为它们需要一个需要登录用户的模拟器,这在 ssh 上不起作用;与 frank 相同的问题;没有自动配置文件更新等)。所以我认为 Jenkins 可以访问 Xcode service 来解决其中的一些问题。也许我将 Xcode 服务与 Apple CI 混淆了,我会澄清我的问题。 为了让任何东西与 xcode 服务交互(抱歉,我之前可能使用了错误的术语),可能需要一个用于 xcode 服务的命令行界面。有吗? 我没有足够的信息,因为我还没有访问 OSX Mavericks 测试版 :-( 我也不知道。据我所知,它没有命令行界面,而是一个流畅的网络界面。 (我嫉妒) 我认为 xcode 服务会做你想做的一切(包括单元测试)。为什么需要jenkins与之集成?【参考方案2】:

我在我的 OS X 构建从站上使用 Xcode 5 在 Jenkins 中运行单元测试。我没有使用 Xcode 插件,而是作为执行 shell 构建步骤运行:

xcodebuild test -scheme <scheme> -configuration Coverage -sdk iphonesimulator7.0 -destination OS=7.0,name="iPhone Retina (4-inch)"

我的覆盖率配置与我的调试配置完全相同,除了 Generate Test Coverage Reports 设置为 YESInstrument Program Flow设置为YES。这样做是为了创建测试覆盖率文件。由于 Xcode 5 中的一个错误,我在所有测试的拆解中调用了 __gcov_flush();。我将此 xcodebuild 命令的输出通过管道传输到 ocunit2junit 以在 Jenkins 中获取测试报告。

【讨论】:

你在jenkins服务器和osx build slave之间使用ssh连接吗? 有时间我得试试这个。看起来很有希望,特别是因为 xcode 插件一再未能打动我。 是的,但是我需要将输出通过管道传输到 ocunit2junit,因此我在单独的构建步骤中执行它。 您能解释一下“将此 xcodebuild 命令的输出通过管道传输到 ocunit2junit 以在 Jenkins 中获取测试报告吗?”我总是收到这个错误Build step 'Execute shell' marked build as failure 尽管所有测试都通过了 我需要Apple硬件来运行OS X build slave吗?

以上是关于Apple CI / Xcode 服务和 Jenkins的主要内容,如果未能解决你的问题,请参考以下文章

Apple 的 CI Bots 的 KIF iOS 测试失败

Xcode Bot CI 服务 SVN 问题

Xcode UI 测试、开发语言、回退翻译和 CI 服务器

OSX Server Xcode CI 服务意外的内部服务器错误

用于 XCode 的 VSTS CI 为具有手表套件扩展的应用程序构建

Xcode 使用哪些 URL 与 Apple 的服务器通信