Xcode Server简单介绍(一) —— Xcode Server的安装和配置(一)

版本记录

版本号 时间
V1.0 2020.11.12 星期四

前言

Continuous Integration (CI)可以让你的开发流程更加的迅速,并具有持续性,下面我们就一起学习下如何使用Xcode Server

开始

首先我们看下主要内容:

在本教程中,您将学习如何安装和配置Xcode Server,以便将其用于持续集成(Continuous Integration)。内容来自翻译。

接着看下写作环境:

Swift 5, iOS 14, Xcode 12

无论您是iOS工程师的大团队还是独立开发人员的一员,Continuous Integration(CI)都可以使您的开发工作流程快速且一致,从而使您可以将更多时间花在您真正喜欢的事情上 – 编写漂亮的代码。在本教程中,您将学习有关如何使用Xcode Server进行操作的所有信息。

在现实世界中,如果您需要保持一致的方法来构建某些东西,则几乎总是依赖某种形式的自动化。例如,如果您要生产一批蛋糕,并且想要保持一致的味道和质地,则可能涉及某种自动化,以确保每次都使用相同的食谱和相同的烹饪技术是时候生产出同样一致且美味的蛋糕了。

Continuous Integration (CI for short)是软件开发中这种方法的名称。这是在开发代码时一遍又一遍地自动运行iOS应用构建的一种方法。通常,您在专用CI服务器上运行构建,该CI服务器可以是物理计算机,也可以是云中的共享计算机。 CI服务器将在每次提交代码时构建您的应用程序并运行测试。这样,您将立即知道何时发生了故障,并能够立即对其进行修复。

Continuous Integration有多种口味(就像上面提到的美味蛋糕一样),在本教程中,您将探索Apple基于云的Xcode Server。你将学到如何:

  • 设置Xcode Server
  • 设置您的第一个Bot
  • 每次提交都运行集成
  • 在集成中运行测试套件

是时候让那些Bot工作了!

在本教程中,您将使用Fruits,这是一个非常简单的SwiftUI应用,其中列出了水果,因为全世界显然需要更多的水果列表应用。

注意:该示例项目可与任何raywenderlich.com教程一起下载。但是,在使用Xcode Server时,您需要将项目存储在源代码控制下,因为Xcode Server将在构建时从中获取代码。

下载示例项目,以浏览代码,但是本教程的第一步是派生一个已经存在的存储库,以在源代码控制下获取自己的代码。

本教程还假设您知道如何对Git存储库进行提交。如果您想了解Git的最新知识,请访问beginner Git tutorial。

要使Xcode Server运行,您需要使项目处于源代码控制之下,因此请首先进行设置。在本教程中,您将使用GitHub,但随时可以使用自己的偏好设置-逻辑保持不变。

注意:如果您还没有GitHub帐户,请在GitHub.com上免费创建一个。确保验证您的电子邮件,以便您可以创建新的存储库。

1. Forking the Repository

GitHub中,fork是您自己的存储库副本。 您可以在不影响原始的情况下进行更改fork。 您将创建一个Fruitsfork,以便您进行一些更改。

登录GitHub,然后访问Fruits repository并单击右上角的Fork按钮。

forkFruits之后,将其克隆到本地工作站。 单击绿色的Code按钮,然后单击剪贴板图标以将URL添加到剪贴板。

接下来,打开终端并键入以下命令,用您的存储库的URL代替:

# 1
mkdir ~/Fruits
# 2
cd ~/Fruits
# 3
git clone [The-Repository-URL-You-Just-Copied-Here] .

这些命令:

  • 1) 在主目录的根目录中创建一个目录来保存代码。
  • 2) 切换到新目录。
  • 3) 将存储库克隆到新目录中。 注意ending space and period,因为两者都需要。

现在,您在本地工作区中有了代码的副本。

接下来,打开Fruits.xcodeproj并构建并运行。

恭喜,您现在可以使用本地版本的Fruits进行自动化了!


Setting Up Xcode Server

完全启动和运行Xcode Server包含两个部分。

  • 1) 启用服务器。
  • 2) 配置集成,这是通过Xcode Bot完成的。

本教程将为您设置本地Xcode Server,但在现实世界中,您可能希望将其托管在您自己的个人计算机以外的其他位置。 例如,您可能想拥有一个Mac Mini,可以在团队中共享,或者您可以选择基于云的设置。

不过请不要惊慌:拥有本地版本后,很容易迁移到托管解决方案。

1. Enabling Xcode Server

在开始之前,必须在Xcode中启用Xcode Server

单击Xcode,然后单击Preferences

点击Server & Bots

在右上角,将Xcode Server切换到打开位置

Xcode现在显示一个弹出窗口,以选择哪个用户将充当Integration User

如果您要在专用CI / build服务器上安装Xcode Server,建议为此使用全新的用户User。 由于本文中您是在本地计算机上运行Xcode Server,因此将使用现有的用户帐户,因此请在下拉菜单中选择您自己的用户帐户。

Xcode现在安装了运行Xcode Server本地版本所需的各种工具。 这可能需要一段时间,所以这是在幕后高峰的好时机。


Seeing How Xcode Server Works

等待期间,是时候介绍Xcode Server背后的一些理论以及幕后发生的事情了。

目前,Xcode Server当前正在本地计算机上运行。 在幕后,它创建了一组特殊的服务来运行Xcode Server。 您可以自己查看这些。 让我们继续并立即执行此操作。

打开终端并运行以下命令:

open /Applications/Xcode.app/Contents/Developer/usr/share/xcs

这是在计算机上本地运行的Xcode Server的所有组件。 这是从Xcode中打开Xcode Server时生成的整个设置。 最好的部分是,所有这些内容都可以根据您的核心内容进行自定义。 您可以根据需要进行更改,包括对所有dashboards进行更改。

Xcode Server使用nginx,Redis,Node.jsCouchDB仅举几例。 谁会想到Xcode内置了Node.js


Creating a New Server

现在,您已经启用了Xcode Server,现在该创建一个新实例了。

单击Xcode,然后单击Xcode Preferences

点击Accounts

如果您已经关联了Apple Developer帐户,那么您应该会看到您的Apple ID; 如果您看不到,请不要太担心。

点击+图标创建一个新帐户。

单击Xcode Server,然后单击Next

现在,您会在计算机上看到可用服务器的列表。除非连接了另一台计算机,否则您应该只看到一台计算机(自己的计算机)。

选择您的服务器计算机,然后单击Next

系统将提示您使用设置服务器时使用的用户User(您自己的用户帐户)登录。输入凭据,然后单击Add

现在,您已经使用自己的用户帐户创建了在计算机上运行的Xcode Server的本地版本。

注意:如前所述,如果您是独立开发人员,但考虑将其移至基于云的解决方案或团队中每个人都可以访问的共享Mac Mini上,则可以这样做。

如果您确实考虑使用基于云的解决方案,则业内知名的MacStadium,它提供了一种将macOS托管在云中的付费解决方案。

继续我们的蛋糕制作类比,您现在拥有使蛋糕保持一致的口味和质地的设备。然而,真正重要的是细节,食谱和确切的烹饪温度。

您可以在软件开发中对此进行关联,在该软件开发中,您要确保每次都运行完全相同的脚本,从而使您知道失败是真实的,而不是环境问题。这也意味着每次都以相同的方式剪切构建,就像蛋糕一样。


Adding a New Bot

Xcode Server包含一个称为Xcode Bot的概念。 最终,在表面之下,这是一个单独的Scheme,其中包含您要定义的一些配置。 最大的区别是Xcode Bot是用于在Xcode Server上运行Integrations的。

是时候创建您的第一个Xcode Bot!

选择Product ► Create Bot…

为您的Xcode Bot提供一个唯一的名称(通常是“Product Name” + “Bot”)。

单击服务器下拉菜单,然后选择新创建的服务器。

点击Next

1. Repositories

此时,Xcode会询问您新bot的源代码控制详细信息。 现在,这里的结果将取决于您过去使用Xcode的方式。 如果您以前已经链接了GitHub帐户,这将很容易。 但是,如果您之前从未登录过,请单击Sign In…

您应该输入您先前创建的GitHub凭据,或者,如果您使用的是SSH,请导航至SSH密钥的位置(通常存储在〜/ .ssh中)。

这赋予Xcode Bot克隆存储库的权限。

如前所述,完全由Bot决定如何在项目中执行它以及如何执行。它包含了Cookie剪切iOS版本所需的所有信息。

点击Next

2. Setting the Configuration

现在,您应该看到构建配置屏幕。这是此屏幕上每个选项的含义:

  • SchemeBot将在项目内部执行的Scheme。您将其保留为Fruits
  • Actions:您可以在此处指定对每个集成运行哪些操作。
    • Analyze:在代码上运行clang static analyzer
    • Test:运行单元测试和UI测试。您可以选择指定是否启用代码覆盖率以及运行测试所使用的语言和区域。
    • Archive:对应用程序进行存档。Export定义您是否要将应用程序导出为IPA,并提供多种选项供您选择。
  • Configuration:要使用的构建配置。例如,您可以强制将其设置为Debug configuration。通常您会在这里选择Use Scheme Setting

填充字段以匹配以下屏幕截图:

注意:您现在将暂时停用Test和导出产品,但不久之后将进行更多操作。

点击Next

3. Setting the Schedule

现在是时候为集成设置schedule时间了,您可以选择:

  • Periodically:每小时或每天或每周在设置的时间运行集成。
  • On CommitBot会定期检查GitHub是否有新提交以启动集成。
  • Manually:您必须通过手动过程触发构建。

选择On Commit时,因为您希望Bot在开发人员每次对存储库进行更改时都运行。

您可以允许Xcode BotXcode升级后运行您的集成,因此请暂时选中此选项。

最后,将Clean选项更改为Always。 这意味着在开始构建应用程序之前将运行清理。 始终建议这样做,以使您对构建有一个清晰的了解,以避免在存在先前的构建工件的情况下,由于构建不同而引起的任何问题(或被掩盖)。

点击Next

4. Selecting Devices

现在该决定应该为Bot配置哪种设备了。 此应用仅支持iOS,这就是第一个下拉菜单设置为iOS并显示为灰色的原因(没有其他选择!)。 但是,您可以选择是针对设备,模拟器还是针对两者进行构建。 对于本教程,请选择iOS Simulators,因为您现在只想检查它是否可以成功构建,而模拟器可以做到这一点。

点击Next

5. Signing

是时候让可怕的Provisioning ProfileCertificate高兴了! 幸运的是,您无需在此处做太多事情,因此只需单击Next

6. Defining Environment Variables and Build Options

在此屏幕上,您可以定义自定义标志以传递给xcodebuild以及自定义环境变量,以在Bot构建应用程序时进行设置。 在本教程中,您无需在此处进行任何设置。

单击Next跳过此部分。

7. Adding Triggers

最后一项是自定义触发器。 这些实质上是构建阶段,但对于您的Bot而言。 这里有很多可能性,例如添加一个post-hook,以在构建完成后触发Slack通知。 您不会在本文中设置任何触发器,因此只需单击Create

恭喜,您现在在Xcode Server上运行了Xcode Bot! 现在,只要对存储库进行新的提交,就可以“执行其任务”。 这就提出了一个问题:它到底是什么东西? 答案是Integrations


Integrations

CI术语来说,Integration是单次运行的名称。 用Xcode Server术语来说,这就是Xcode Bot满足您在创建bot时设置的要求的时候。 回想一下,您已指定在提交GitHub存储库时触发集成。

因此,如果您的Xcode Bot运行了12个集成,则意味着您已经构建了12次项目。

1. Creating your First Integration

考虑到这一点,是时候继续本教程并触发第一个集成了!

Xcode中打开Report导航器。

您可能已经熟悉此面板,但是从本质上讲,它显示了有关构建的最新报告,测试目标的运行以及现在从Xcode Server进行的集成。

单击您的Xcode Bot

此屏幕显示Xcode Bot的一些统计信息。 您可以在此处查看构建和测试的历史记录以及统计信息,例如运行的集成总数和成功率。 一旦开始更定期地运行Xcode Bot,此屏幕将填充许多有用的数据,您可以使用它们来查看构建的性能。

Report导航器中,展开Fruits Bot行。

现在,单击显示的行,即Integrate (1)

该屏幕显示了特定集成的所有信息。 它会告诉您集成是正在进行还是完成。 它还会告诉您是否存在任何警告,错误,分析失败或测试失败。

如果集成仍在处理中,则可以:

  • Cancel Integration。 这将停止集成并将其标记为Canceled
  • View Screen。 这使您可以与机器进行屏幕共享以观看正在进行的构建。 如果计算机在团队中共享,这将非常有用。

由于配置原因,您还指定了要存档的文件,该文件在Build Results标题下可见。

您将进一步深入了解此显示及其含义,但就目前而言:恭喜! 您刚刚让Xcode Bot首次成功集成!


Running Unit Tests and UI Tests

持续集成的一个好用例是单元测试和UI测试。 每次您签入新代码时,CI服务器都会启动并执行您的测试套件。 如果您犯了一个错误并且测试失败了,那么您会知道在那儿,然后您最近的更改使某些事情发生了变化,从而使您可以在问题仍在内存中的同时进行修复。

Xcode Server对此提供了全面的支持,并且可以提供其他信息,例如代码覆盖率。

Fruits项目中,您将进行一些基本的单元和UI测试,以便您执行Xcode Bot

单击Integration屏幕上的Edit Bot

单击Configuration,选中Test框,并确保将Code Coverage设置为Enabled

另外,您还要确保测试可以在iPhone模拟器和iPad模拟器上运行,因为您想同时测试两个设备类别。

选择Devices选项卡,然后选择Specific iOS Devices and Simulators。 从列表中选择iPhoneiPad模拟器。

单击Done,然后单击Integrate以开始新的集成。

使用新的更改,集成将构建您的项目并在iPhone / iPad上运行单元和UI测试。


Pulling Out Build Reports

Xcode Server将生成构建报告,这些报告称为Integration Reports。 这意味着您可以询问每个集成并提取与该集成有关的特定构建报告。

选择新创建的集成,称为Integrate (2)

如果构建仍在进行中,那么您将能够从集成屏幕中看到进度。 等待并等待它完成-您可能想让自己喝杯茶,因为运行所有测试可能需要很长时间!

完成后,您可能会注意到您刚遇到第一次失败的集成。 尽量不要惊慌,因为这很正常。 实际上,一旦您完全启用了此功能,这将非常适合您在应用程序准备就绪之前就发现问题。 那么,出了什么问题?

Report导航器中,展开Integrate (2)

现在,在集成中,您应该看到Tests, Coverage, Commits and Logs。 您可以真正地开始研究此特定集成的细节,这在出现问题时非常有用。

1. Inspecting Failed Tests

您应该能够快速看到一项测试失败。 单击Tests

您可以在UI测试旁边看到所有单元测试的列表,并且可以看到其中一个UI测试失败,但仅在iPad上。 您可能在想(特别是因为它仅在iPad上失败):“这与设备尺寸有关吗?”

单击iPad设备旁边的显示三角形。

现在,展开Assertion Failure并悬停在Automatic Screenshot上,然后单击“眼睛”图标(您可能对macOS上的QuickView熟悉此图标)。

XCUITesting具有内置的屏幕截图,并采用了真正的Apple风格,可直接在Xcode Bot中显示在这里(这太酷了!)。 如您所见,Fruits列表为空,这说明了该UI测试失败的原因。

2. Fixing the Error

您将对Fruits进行代码更改,以使失败的UI测试再次成功。

打开ContentView.swift并将body替换为以下内容:

var body: some View {
  NavigationView {
    List(viewModel.fruits) { fruit in
      FruitRow(fruit: fruit)
    }
    .onAppear {
      viewModel.loadFruits()
    }
    .navigationBarTitle("Fruits")
  }.navigationViewStyle(StackNavigationViewStyle())
}

SwiftUI中,当在iPad上运行时,NavigationView的默认样式将为SplitView。 您可以通过将NavigationViewStyle设置为StackNavigationViewStyle来禁用此功能,如最后一行所述。

3. Running the Integration Again

好的,那很容易解决。 但是您如何告诉Bot事情发生了变化?

请记住,Xcode Server可以与您在本教程开始时创建的存储库中的代码一起使用。 因此,您需要进行提交,然后Xcode Server将像往常一样执行并运行集成。

现在,使用新的和经过改进的代码进行提交。 您可以通过Xcode,在命令行或通常使用的git GUI中执行此操作。

然后返回到Report导航器,并通过单击报表导航器中的Fruits Bot再次运行Bot,然后进行Integrate

现在,您所有的XCUITests都通过了,并且集成成功!恭喜!您已经成功建立了Xcode Bot,并在崭新的CI系统上运行了您的前几个集成!

您仅在Xcode Server上进行了初步研究,可以执行许多不同的操作,例如:

  • 添加自定义构建脚本(Build Scripts)
  • 添加对hooks的支持,以便您可以在构建完成或失败时将消息发布到Slack

因此,继续探索。

记住,CI总是每次都用cookie剪切相同的版本。因此,请坐下来考虑将iOS应用程序带到App Store所需的所有手动任务,并查看是否可以使它们自动化。

要了解有关Xcode Server的更多信息,请查看苹果公司的WWDC video,其中展示了对Xcode Server的最新更改。

有关Xcode Server的替代方法,请参见此截屏视频screencast。或者,查看我们的教程Continuous Integration With GitHub, Fastlane & Jenkins。

后记

本篇主要讲述了Xcode Server的安装和配置,感兴趣的给个赞或者关注~~~

你可能感兴趣的:(Xcode Server简单介绍(一) —— Xcode Server的安装和配置(一))