版本记录
版本号 | 时间 |
---|---|
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
。 您将创建一个Fruits
的fork
,以便您进行一些更改。
登录GitHub
,然后访问Fruits repository并单击右上角的Fork
按钮。
fork
了Fruits
之后,将其克隆到本地工作站。 单击绿色的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.js
和CouchDB
仅举几例。 谁会想到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
现在,您应该看到构建配置屏幕。这是此屏幕上每个选项的含义:
-
Scheme:
Bot
将在项目内部执行的Scheme
。您将其保留为Fruits
。 -
Actions:您可以在此处指定对每个集成运行哪些操作。
-
Analyze:在代码上运行
clang static analyzer
。 - Test:运行单元测试和UI测试。您可以选择指定是否启用代码覆盖率以及运行测试所使用的语言和区域。
-
Archive:对应用程序进行存档。
Export
定义您是否要将应用程序导出为IPA
,并提供多种选项供您选择。
-
Analyze:在代码上运行
-
Configuration:要使用的构建配置。例如,您可以强制将其设置为
Debug configuration
。通常您会在这里选择Use Scheme Setting
。
填充字段以匹配以下屏幕截图:
注意:您现在将暂时停用
Test
和导出产品,但不久之后将进行更多操作。
点击Next
。
3. Setting the Schedule
现在是时候为集成设置schedule
时间了,您可以选择:
- Periodically:每小时或每天或每周在设置的时间运行集成。
-
On Commit:
Bot
会定期检查GitHub
是否有新提交以启动集成。 - Manually:您必须通过手动过程触发构建。
选择On Commit
时,因为您希望Bot
在开发人员每次对存储库进行更改时都运行。
您可以允许Xcode Bot
在Xcode
升级后运行您的集成,因此请暂时选中此选项。
最后,将Clean
选项更改为Always
。 这意味着在开始构建应用程序之前将运行清理。 始终建议这样做,以使您对构建有一个清晰的了解,以避免在存在先前的构建工件的情况下,由于构建不同而引起的任何问题(或被掩盖)。
点击Next
。
4. Selecting Devices
现在该决定应该为Bot
配置哪种设备了。 此应用仅支持iOS,这就是第一个下拉菜单设置为iOS
并显示为灰色的原因(没有其他选择!)。 但是,您可以选择是针对设备,模拟器还是针对两者进行构建。 对于本教程,请选择iOS Simulators
,因为您现在只想检查它是否可以成功构建,而模拟器可以做到这一点。
点击Next
。
5. Signing
是时候让可怕的Provisioning Profile
和Certificate
高兴了! 幸运的是,您无需在此处做太多事情,因此只需单击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
。 从列表中选择iPhone
和iPad
模拟器。
单击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
的安装和配置,感兴趣的给个赞或者关注~~~