作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Nemanja Stošić的头像

Nemanja Stošić

Nemanja曾在Novomatic和微软工作过,对敏捷/Scrum并不陌生. 他的主要专长包括Java、Swift、c#和c++.

Expertise

Previously At

Microsoft
Share

Introduction

Prior to Xcode 9, 使用苹果持续集成工具是一个冗长而复杂的过程,需要购买和安装一个额外的macOS Server应用程序. This led many developers 放弃在iOS项目中持续整合的想法,或者求助于第三方解决方案, 取得了不同程度的成功.

However, after Xcode 9.0于2017年9月发布, 这个过程大大简化了, 包括自动代码签名选项, 现在已完全集成到Xcode中. 因此,它不需要任何额外的应用程序或工具.

而第三方解决方案 Fastlane, Bluepill, etc. 有很大的帮助,可以为你做很多繁重的工作吗, 本文将探讨单独使用Xcode和Apple工具的功能 持续集成需求. 我们还将使用手动代码签名,因为这对很多人来说似乎是一个问题, 当涉及到多个构建配置时,自动签名也往往不是最佳解决方案.

Note: 本文是基于Xcode 9编写的.4.1,专注于iOS应用开发, 但其中很多都适用于Xcode 10(目前是测试版5)和macOS应用程序开发.

Setting up Xcode Server

同时简化实际的集成过程, Xcode 9还简化了Xcode服务器的设置过程.

在指定为CI服务器的macOS机器上启动Xcode应用程序并打开Preferences.

导航到最后一个选项卡,名为 Server & Bots.

持续集成工具:服务器截图 & Bots tab

通过点击右上角的开关打开Xcode Server功能. 然后,您将被要求选择一个用户来在这台机器上运行和执行构建脚本. 为此目的专门设置一个用户可能是个好主意, 而不是使用预先存在的.

请注意,这个用户必须登录到系统,以便运行任何Xcode bot. 登录后,您应该在用户名旁边看到一个绿色圆圈.

Xcode服务器和Bots成功登录后

That’s it! 让我们仔细看看Xcode机器人.

如何配置Xcode机器人

现在你已经准备好开始配置Xcode机器人在这个服务器上运行了. 这可以在连接到与服务器相同网络的任何开发机器上完成.

在你的开发机器上打开Xcode并点击 Xcode > Preferences from the top menu. Then, go to the Accounts tab and click on the + 左下角的图标. 从出现的对话框中选择Xcode Server.

账户类型选择的截图

要创建bot,只需在Xcode中打开项目并选择 Product > Create Bot… option from the top menu. 机器人设置有许多步骤,我们将在接下来的部分中探讨它们.

自动化应用分发

iOS应用构建自动化最常见的应用之一是配置一个bot,将应用上传到iOS发行平台(如TestFlight), Fabric etc.

As I explained earlier, 这篇文章将只探讨上传到App Store Connect和直接从你的Xcode服务器下载, 因为这些都是苹果用于iOS应用分发的原生工具.

应用商店连接分布使用Xcode

Before configuring a bot, 确保你的App Store Connect应用记录与你的应用开发项目的bundle ID匹配. 还值得注意的是,每个构建都需要有一个由构建版本和构建号组成的唯一标识符. 我们将在后面讨论Xcode bot设置时探讨如何确保满足这些条件.

Step 1: 设置正确的构建配置是获得所需的关键步骤. 确保您选择了生成要上传到app Store Connect的应用程序的方案和配置. 这包括确保构建配置使用在团队的Apple Developer门户(用于代码签名)和App Store Connect门户(用于自动上传应用)中注册的适当bundle id。.

Step 2: 当仍然在“Configuration”选项卡上时,我们需要指定导出选项. 我们将探索导出选项属性列表, 因此,请确保选择“使用自定义导出选项列表”.

Step 3: 现在是时候制作导出选项属性列表了. 在此文件中使用的键的完整列表,如果输入 xcodebuild --help,但我们将在这里探索这个bot配置中使用的那些:

  • compileBitcode - Bitcode是苹果应用程序源代码的临时输出格式. In other words, 它是在将源代码编译为特定体系结构的机器码之前转换的格式. 它的目标是拥有一个单一的代码容器,如果在指令集中进行优化,则可以进一步优化该代码容器, 并且能够从同样的格式编译到未来的架构中. 但是,这对您的应用程序没有任何影响. 您可以决定是否启用它.
  • method -此参数指定您要出口的产品类型. 苹果公司根据产品的指定受众来区分产品development 只允许您在配置文件中指定的设备上安装它, enterprise 允许每个人安装它, 但他们需要在运行应用程序之前明确信任这个开发配置文件, and app-store 是用于分发到App Store或App Store Connect,我们要用这个值吗.
  • provisioningProfiles 这是不言自明的. 但是这里有两件事需要注意:导出选项属性列表中的配置概要文件是一个字典 key 对应于产品和的bundle id value 对应于用于对其进行代码签名的供应配置文件的名称.
  • signingCertificate -另一个不言自明的论点. 该字段可以是完整的证书名称或SHA-1哈希值.
  • teamID -另一个不言自明的论点. 这是Apple在您注册Apple开发人员计划时发给您的10个字符长的标识符.
  • uploadBitcode -是否上传位码(如果你选择编译成它),以便它可以在AppStore Connect中使用,以生成新的优化构建或未来架构的构建.
  • uploadSymbols 上传你的调试符号,这样你就可以得到一个有意义的崩溃报告,而不仅仅是一个内存转储和汇编堆栈.

现在,你的export options属性列表可能看起来像这样:




    
        compileBitcode
        
        method
        app-store
        provisioningProfiles
        
            com.bundle.id
            ProvisioningProfileName
        
        signingCertificate
        Signing Certificate Exact Name or SHA-1 hash value
        teamID
        ??????????
        uploadBitcode
        
        uploadSymbols
        
    

Step 4: Choose the .列表作为导出选项属性列表.

Step 5: 接下来是“时间表”选项卡-根据您的喜好进行设置.

Step 6: On the Signing tab, 确保取消勾选“允许Xcode服务器管理我的证书和配置文件”选项,并自己上传匹配的签名证书和配置文件, on the Certificates & Profiles page.

Step 7: The Devices TAB应该保持原样,因为我们正在上传应用程序而不是测试它.

Step 8: The Arguments TAB允许您显式地设置xcodebuild参数或环境变量,这些参数或变量可以在构建或集成前和集成后脚本中使用.

Step 9: Finally, we reach the Triggers 选项卡,这也是配置Xcode持续集成bot的最后一个选项卡. 这是Xcode服务器库中最强大的工具. 对于初学者,我喜欢添加以下两个命令作为预集成脚本:

#!/bin/sh
set
printenv

第一个打印Xcode Server在当前集成运行中使用的所有变量及其值. 第二个命令打印所有环境变量及其值. 正如所料,这对调试脚本很有帮助,所以我恰当地将其命名为“调试信息”.”

记得我们提到过,我们需要确保上传到App Store Connect的每个构建版本都有一个独特的构建版本和构建编号对. 我们可以使用内置的PlistBuddy工具,但我们还需要一种方法来拥有唯一的构建号. 在Xcode Server集成过程中总会出现的一件事是集成号,这也是唯一的, 因为它是自动递增的. 我们将创建另一个预集成脚本, 命名为“设置构建号”,包含以下内容,以确保我们每次都有一个唯一的构建号:

#!/bin/sh
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber = $ XCS_INTEGRATION_NUMBER
/usr/ libexc / plistbuddy -c "Set:CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

如果您正在使用CocoaPods并且选择不将Pods目录提交到您的DVCS, 你还应该包含一个包含以下内容的预集成脚本:

#!/bin/sh
cd $XCS_PRIMARY_REPO_DIR
pod install

Step 10: We’re almost finished, 但我们没有指定要将构建上传到AppStore Connect的任何位置或哪个帐户. 为此,我们将添加集成后脚本和另一个内置工具,称为Application Loader. 在脚本中添加以下内容:

#!/bin/sh
/Applications/Xcode.应用程序/内容/应用程序/应用程序\装载机.应用程序/内容/框架/ ITunesSoftwareService.框架/支持/altool——upload-app -f $XCS_PRODUCT -u $TESTFLIGHT_USERNAME -p $TESTFLIGHT_PASSWORD

The $XCS_PRODUCT 是一个Xcode服务器变量,它包含在当前集成运行中创建的应用程序的路径. However, the $TESTFLIGHT_USERNAME and $TESTFLIGHT_PASSWORD 既不是系统也不是Xcode服务器变量. 这些必须由您设置,并具有您的Apple ID和密码的值. Unfortunately, 苹果已经停止支持生成AppStore Connect构建上传的API密钥. 因为这是机密信息, 最好的做法是直接在Mac服务器上设置它(假设它是你自己的)作为一个环境变量,而不是在Xcode服务器bot配置中.

Xcode Server Distribution

Xcode Server分发bot实际上使用了与App Store Connect分发相同的配置, 除了后整合脚本. 然而,下载和安装应用程序仍然很棘手. 你仍然需要确保你签署应用的配置文件允许应用安装在你正在使用的设备上.

With that in place, 你需要在iOS设备上打开Safari并导航到服务器的Xcode server web仪表板. 例如,如果您的服务器的名称是“Mac服务器”,您可以在“Mac -server-name”中找到它.本地/xcode”,如果你和服务器在同一个网络上. There, 你会发现你所有的Xcode机器人的列表和他们最近的集成统计数据.

选择构建了您想要下载的应用程序的那个. 在下面的屏幕中,您将有两个按钮-Install and Profile. 如果这是你第一次从这个服务器下载,你必须点击 Profile 将其证书添加到受信任源列表中. Afterward, click on the Install 按钮,你会看到iOS确认对话框“你确定要在你的设备上安装*吗??” Confirm it by clicking Yes,你的应用程序将被安装并可从主屏幕运行.

应用程序安装选项的截图

For iOS 10.3 and later提示“Cannot connect to *”失败的原因.表示必须在测试设备的“设置”中手动信任自签名证书.

Follow these steps:

Step 1: 在iPhone上安装Xcode服务器的bots页面上的自签名证书.

Step 2: Go to iPhone’s Settings > General > About > Certificate Trust Settings.

Step 3: 在下面的小节中找到服务器的自签名证书 对根证书启用完全信任, and turn the switch ON.

Step 4: 返回到Xcode Server上的bot集成页面,单击 Install.

Xcode服务器自动应用程序测试

Xcode Server的另一个重要用途是自动应用测试,无论是单元测试还是UI测试. 为此,您需要为您的项目设置适当的目标. 也就是说,您需要有一个运行单元或UI测试的目标,这取决于您的目标.

安装过程与上一个相同,但我们将选择不同的选项. 第一个主要区别是 Configuration tab. 显然,我们将勾选“分析”和“测试”框,因为这是我们的主要目标. 我还建议不要使用此bot归档或导出产品. 使用相同的bot配置可以同时实现测试和分发. 然而,这两种场景在输出和进度上有所不同. 分发通常在周期结束时进行.

无论你是在Scrum、看板还是其他框架下工作, 应该有一个预定义的时间驱动或事件驱动的周期,在此周期结束时,您应该导出可用的产品. On the other hand, 您应该在每次提交时运行您的测试机器人, 因为这是你抵御回归的第一道防线. 因为测试机器人显然运行得更频繁, 将这两个机器人合并为一个机器人可能会很快耗尽服务器上的磁盘空间. 而且它还会花费更多的时间来完成每个集成.

With that out of the way, 我们要转到"日程安排"选项卡, 我们在前一段已经讲过了. 因此,下一个感兴趣的主题是代码签名. Notice that, 即使您的测试目标可能在您的项目设置页面中声明它不需要配置文件, 您应该将其设置为使用与主机应用程序相同的团队和签名证书. 如果你想在iOS设备上测试你的应用,而不是仅仅在模拟器上,这是必需的. If this is your case, 你还需要确保用于测试的iOS设备不会因为不活跃而被锁定,因为这可能会导致你的集成运行在没有通知你的情况下无限期地挂起.

现在我们在“设备”选项卡上,不需要特别解释. Simply select one, multiple, 或者你想要测试代码的所有设备(iOS和模拟器). 还可以检查是并行运行还是顺序运行多个设备上的测试. 为了设置这一点,你应该考虑你的项目需求(无论你是针对一组特定的设备还是所有支持的iOS设备)以及服务器的硬件资源.

On the Arguments tab. 不需要显式地指定任何东西, 因为我们将只使用内置环境变量.

Finally, on the Triggers 选项卡,我们将介绍一个集成前脚本和一个集成后脚本. 第一个是在我们遇到问题时帮助我们调试的. 实际上我们已经用过了:

#!/bin/sh
set
printenv

第二个是在当前集成中的一个或多个测试失败时通知我们的工具. 确保将其设置为仅在测试失败时运行. And enter the following:

#!/bin/sh
$XCS_TEST_FAILURE_COUNT在构建$XCS_INTEGRATION_NUMBER上测试$XCS_BOT_NAME失败
你可以看到机器人集成在:
回声“http://主机名/ xcode /机器人/ XCS_BOT_TINY_ID美元/集成/ XCS_INTEGRATION_TINY_ID美元”

这里有几件事需要解释. 首先,$HOSTNAME变量存储如下格式的值:计算机名.local. 显然,只有当您可以通过本地网络访问该服务器时,该链接才能正常工作. Also, 在访问此链接时,您很可能会从浏览器获得安全警告, 因为它是一个到目的地的HTTPS连接,不能被信任. 最后,这只是“测试失败”脚本的起点. 您可以向整个开发团队发送电子邮件, 或者通过API请求或其他您认为最合适和最有效的方式打开JIRA问题.

Wrapping Up

Hopefully, 本文鼓励您花时间探索Xcode Server的功能,而不是简单地构建应用程序. 虽然这篇文章可能没有以你想要或期望的方式帮助你, 目的是向您介绍一种使用内置环境和Xcode Server变量来实现更高级别自动化的开放方式.

有很多第三方服务提供更多的功能,可以为你做更多的工作, including Fabric, Bluepill, and Fastlane. But, inevitably, 依赖第三方会给您的项目带来新的依赖,并且有时要求很简单, 有时是复杂的设置和配置. 这里描述的技术只需要已经安装在每台Mac上的工具, 因此,除了配置运行自动构建的bot之外,它不需要设置时间!

Understanding the basics

  • What is Xcode?

    Xcode是一个由苹果开发的集成开发环境(IDE),为针对苹果设备- ios的项目提供代码编辑和构建工具, tvOS, watchOS, and macOS products.

  • What is Xcode Server?

    Xcode Server是捆绑在Xcode中的工具之一. 它允许用户为一个或多个Xcode项目设置持续集成. 集成可以在本地或远程环境中运行, 只要选择的计算机具有构建项目所需的Xcode版本.

  • 什么是持续集成?

    持续集成是在开发中的项目的相同环境中运行自动化的预先确定的任务的实践. 任何开发人员引入的所有更改都在相同的环境和相同的情况下进行评估, 哪一个允许持续验证.

  • 苹果为持续集成提供了什么样的内置工具啊?

    每个Xcode附带的工具包括Application Loader, agvtool, PlistBuddy, xcodebuild, codesign, and more. 这些工具并不是专门为持续集成而设计的,作为独立工具也很有用. However, 它们确实为您的持续集成设置提供了额外的功能和多功能性.

  • 我还可以使用哪些工具来帮助我为项目设置持续集成?

    Fastlane可能是目前可用的最健壮的CI工具. Bluepill是一个使用多个模拟器并行运行iOS测试的工具. BuddyBuild是一个在线(云)持续集成服务,提供了这里讨论的所有功能以及更多功能.

就这一主题咨询作者或专家.
Schedule a call
Nemanja Stošić的头像
Nemanja Stošić

Located in Vancouver, BC, Canada

Member since May 25, 2018

About the author

Nemanja曾在Novomatic和微软工作过,对敏捷/Scrum并不陌生. 他的主要专长包括Java、Swift、c#和c++.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Expertise

Previously At

Microsoft

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.