TeamCity for iOS项目

嗨! 今天的主题将是关于TeamCity以及如何在iOS项目中提供持续集成。

动机

我已经为许多项目配置了很多次TeamCity。 在项目开发过程中使用持续集成系统有很多优点。 此外,TeamCity还有很多替代方案,例如CircleCI,TravisCI等。 但是在这篇文章中,我想与大家分享我在Bright发明公司获得的TeamCity经验。

我们开始的每个项目-我们都从配置持续集成的东西开始,在这种情况下,我们使用TeamCity来处理。

这篇文章更像是一个教程,它将指导您完成iOS项目配置中的所有基本和最重要的步骤。 另外,我假设您已经下载并托管了TeamCity服务。

希望你会喜欢!

步骤1:创建一个根项目

首先,您需要转到托管TeamCity的页面。 登录后,转到“管理”页面,在“ Project-related Settings部分中单击“ Projects选项卡,然后单击“ Create project

之后,您应该看到项目中使用的版本控制的配置屏幕。

我更喜欢手动配置所有内容的方法,但是您当然可以使用预定义的部分,例如: From GitHubFrom Bitbucket Cloud等。在此步骤中,您要做的就是提供项目的名称,然后点击“ Create

步骤2:添加VCS根目录

当然,为了构建我们的项目,我们需要提供构建源。 我们的TeamCity服务应该能够从存储库中获取更改。 如果您使用的是GitHub,BitBucket或类似的平台,则有两种方法:

  • 向可以访问存储库的帐户提供凭据

要么

  • 生成SSH密钥并使用它在GitHub / Bitbucket中授权TeamCity

在本文中,我将向您展示如何通过上传SSH密钥进行配置。

生成新的SSH密钥

如果您还没有听说过生成SSH密钥,或者您不知道真正的S​​SH密钥是什么,请查看 此链接

要生成新的SSH密钥,可以使用终端命令:

接下来,提供新密钥的名称和可选的密码,然后在运行ssh-keygen -t rsa命令的目录中,应该看到两个文件。 一个是带有.pub扩展名的公共密钥,第二个是私有密钥。 公开的将在github / bitbucket的存储库中使用。 私钥将在TeamCity服务中使用。

在TeamCity中使用生成的密钥

转到已创建的项目的“设置”页面,然后单击“ VCS SSH Keys选项卡。

单击上Upload SSH Key 。 之后,您应该会看到一个弹出窗口,该窗口允许您上载先前创建的SSH密钥。 请记住,您应该上传密钥的私有部分,而不要添加 pub extension 。 如果选择正确,请单击“保存”,您应该会看到类似以下的屏幕:

如您在“ Usage选项卡中所见,该密钥尚未在配置中使用。 为了使用它–您必须完成以下步骤…

配置VCS根目录

转到已创建的项目的设置页面。 如您所见,“ SSH Keys选项卡中出现的数字为“ 1”,这意味着我们已上传了一个SSH密钥,可以使用。

单击“ VCS Roots选项卡,然后单击“ Create VC Root

在我们的示例中,在Type of VCS选择“ Git

VCS root name提供一个名称,该名称将是:

唯一的名称,用于将该VCS根与其他根区分开。

接下来,在“ Fetch URL ”中,将链接粘贴到您的存储库。 请记住在此处粘贴SSH链接类型,例如 [email protected] :yournickname/yourrepositoryname.git

接下来,最重要的是,在“ Authentication method选择“上Uploaded Key然后为您的存储库选择一个先前上载的私钥。

快完成了 现在转到页面末尾,然后单击“ Test Connection

如果您看到这样的屏幕:

这意味着我们的生成的SSH密钥的公共部分未在存储库中使用,这就是为什么您会收到Auth failed错误的原因。 因此,您要做的就是在存储库中的Access keysDeploy keys中添加SSH密钥的公共部分。

在这里,您可以找到有关Bitbucket和GitHub指示的链接:

BitBucket —使用访问密钥

GitHub —部署密钥

如果您已成功上传SSH密钥的公共部分,请再次单击“ Test Connection ,希望您将能够看到“ Connection successful警报。 这意味着TeamCity有权读取您的存储库。

步骤3:创建构建配置

好的,我们的VCS已配置完毕。 现在是时候在TeamCity项目中创建构建配置了。 构建配置是一种通道,用于指定您在此通道中提供的构建类型。 它可能是以下目的的通道:编译项目并运行单元测试,或者只是编译项目或编译项目,然后创建.ipa文件并将其发送到iTunesConnect,甚至是用于运行UI测试的单独通道。

转到已创建项目中的General Settings ,然后单击Create build configuration

在下一个屏幕中,再次选择“ Manually选项并命名新的构建配置。 在我们的案例中,我们将其命名为[Develop] Build & Test 。 这个名称很有意义,表示我们的通道将使用开发配置来构建iOS项目- Develop并提供简短的信息说明该通道将执行的操作- Build & Test ,这意味着我们可以编译项目并运行单元测试。

单击Create ,然后您将看到:

在这里,选择一个先前创建的VCS Root ,然后单击Attach

全部完成,我们的构建配置已与VCS连接。

步骤4:配置构建步骤以进行配置

现在是时候在我们的构建配置中定义步骤了。 有哪些构建步骤? 它们是TeamCity将在我们的代理计算机上运行的一系列指令。 简单地说,可能是这样的:

  1. 从仓库中获取新更改
  2. 安装依赖项(cocoapods,捆绑安装和类似的东西)
  3. 使用脚本(xcodebuild,fastlane)编译项目

请记住,构建步骤取决于您如何配置iOS项目。 在我的示例中,我使用 Fastlane Bundler 管理iOS项目中安装的gem的版本。

为了创建构建步骤,请转到“ Build configuration Settings然后点击“ Build Steps

单击Add build step ,然后在下一个屏幕上选择Command line类型。 在Step name为您的构建步骤命名(在我的情况下为Install Dependencies )。 在“ Custom script键入将在此构建步骤中执行的脚本。 同样,在我的情况下

单击Save ,您的第一步已经准备就绪!

我还添加了另一个名为“ Build and tests命令行构建步骤Build and tests该步骤将运行命令:

 bundle exec fastlane build_and_test 

build_and_test build_and_test 中的通道名称 如果您不熟悉Fastlane,请看一下。 这是一个很棒的工具 Fastlane

因此,现在我们已经创建了所有构建步骤。

步骤5:触发器

您是否想知道TeamCity如何知道何时从存储库中获取新更改并进行构建? 触发器是一个答案。

我更喜欢使用两种类型的触发器。 其中之一称为VCS Trigger ,这意味着TeamCity会自动检查存储库中是否有更改,如果是这种情况,则它将启动包含该触发器类型的构建配置。 例如,在诸如“ Compile & Test类的配置中使用了VCS Trigger 。 因为我们要在每次推送到存储库后编译并运行测试。

后者称为Schedule Trigger 。 这是一个简单的触发器,可以说: 在每个星期一的7:00 AM运行此配置。

转到“构建配置”主页中的“ Triggers部分。 单击Add new trigger然后选择VCS Trigger ,然后单击Save

VCS Trigger配置成功,容易吗?

接下来,执行相同操作, Add new trigger -> Schedule Trigger然后选择满足您要求的选项(在我的情况下,它是每天凌晨04:00触发的触发器),然后点击Save

创建了所有触发器!

步骤6:添加构建功能

构建功能是很酷的东西。 例如,在使用构建功能时,您可以创建一个条件来检查安装了Ruby的版本,或者可以创建一个条件来检查计算机上是否有可用空间。 如果您要生成.ipa文件,并且知道至少需要100MB的可用空间,则它非常有用。 在本文中,我将向您展示如何配置两个构建功能–一个是XML report processing ,第二个是Ruby environment configurator

转到构建配置主页中的“ Build Features部分,然后点击Add build feature 。 选择XML report processing ,选择Ant JUnit然后在“ Monitoring rules粘贴由Fastlane在scan操作后生成的report.junit文件的路径。 在report.junit您可以找到运行了多少测试,失败了多少测试,成功完成了多少测试。

  • Ruby environment configurator

这次在“ Add build feature窗口中选择Ruby environment configurator器。 在gemset定义您需要的红宝石版本。 就我而言,它是ruby-2.3.3

此功能将检查代理计算机上是否存在此版本的ruby,否则将无法启动构建配置。 这是一个可选步骤,但是有时它是非常有用的-特别是如果您使用多个ruby版本,或者其他人可以在代理计算机上更改全局ruby版本。

步骤7:参数

有3种类型的参数用于构建配置甚至根项目。

  • 配置参数
  • 系统属性(系统)
  • 环境变量

在本文中,我将重点介绍Environment variables 。 该类型的变量是在构建开始后创建的(准备好了吗?),并且可以通过带有$前缀的命令行进行访问。 环境变量的一个示例可以是XCode路径。 为了编译我们的项目,我们需要XCode路径,该路径将由Fastlane工具使用。 因此,在Fastfile ,添加以下行:

 xcode_select ENV["XCODE_PATH"] 

这意味着:从可以在ENV["XCODE_PATH"]变量下找到的路径中选择XCode。

在构建配置主页上,选择Parameters ,然后单击Add new parameter 。 在“ Name类型env.XCODE_PATH ,TeamCity应该自动将Kind更改为Environment variable并在该值中提供代理计算机上XCode.app的路径。

通过使用参数,您可以传递许多有用的值,例如内部版本号或应该构建的方案名称等等。 我鼓励您检查一下🙂

步骤8:失败条件

当您要强制构建失败时,应使用失败条件。 一个很好的例子就是超时。 让我们想象一下,代理计算机上发生了一些不好的事情,并且您的构建挂起了2多个小时,而通常情况下这需要花费几分钟。 故障条件会附带帮助! 您可以在此处设置,如果构建持续了n分钟以上,那么它将失败。

在构建配置的主页上,转到“ Failure Conditions ,然后在线if runs longer than specified limit in minutes则输入一个值(以分钟为单位)。 就我而言,将是60分钟。

步骤9:代理机器

您可能已经注意到,我经常提到agent machine 。 代理, 在iOS情况下 ,它是具有macOS系统的计算机(Macbook,MacMini等)。 代理通过脚本连接到TeamCity页面。 TeamCity可以与代理进行通信,以便使用它来执行构建配置中的构建步骤。 重要的是您的代理应该一直处于打开状态以提供持续的集成。

好的,但是如何配置代理?

转到“ TeamCity”页面中的“ Agents选项卡。 您可以在顶部找到它。

在新创建的TeamCity中,尚无可用的代理。 让我们点击Install Build Agents

我更喜欢通过Zip file distribution安装它的方法。 单击该按钮后,Web浏览器将下载运行代理所需的所有文件。

有关如何配置Mac代理的出色说明,您可以在此处的TeamCity文档中找到。 以下是本文档中的步骤:

  1.确保在代理计算机上正确安装了JDK(JRE)1.8(支持1.6-1.8版本,但建议使用1.8)。 
  2.在代理计算机上,确保设置了JRE_HOME或JAVA_HOME环境变量(分别指向已安装的JRE或JDK目录)。 
  3.在TeamCity Web UI中,导航到“代理”选项卡。 
  4.单击Install Build Agents链接,然后选择Zip文件分发以下载存档。 
  5.将下载的文件解压缩到所需目录。 
  6.导航到 \ conf目录,找到名为buildAgent.dist.properties的文件,并将其重命名为buildAgent.properties。 
  7.编辑buildAgent.properties文件以指定TeamCity服务器URL和代理名称。 有关代理配置的详细信息,请参阅“构建代理配置”部分。 
  8.在Linux下,您可能需要授予bin / agent.sh Shell脚本执行权限。 

完成这些步骤后,您可以通过以下命令启动代理:

 pathToDownloadedUnzippedBuildAgentFiles\bin\agent.sh start 

下一步是再次转到“ Agents选项卡上的“ TeamCity”页面。 您将需要稍等片刻,一段时间后,您应该会在“ Unauthorized标签下看到一个可用的代理。 唯一要做的就是Authorize代理。 之后,您将在“ Connected选项卡下看到您的代理。

步骤10:设置代理对构建配置的要求

最后一件事…您现在需要指定哪个代理应该构建您的配置。 如果您的TeamCity包含一个适用于iOS和Android的项目,则可能会有两个代理-一个用于Android,另一个用于iOS。 当然,我们不想在可能没有XCode甚至macOS的Android项目的计算机上启动iOS构建配置 。 因此,为了为您的项目提供适当的代理,您需要使用Agent requirements进行构建配置。

在构建配置的主页上,转到“ Agent requirements选项卡,然后:

  • 选择Add new requirement
  • Parameter Name输入teamcity.agent.jvm.os.name
  • Condition选择equals
  • 在“ Value选择“ Mac OS X
  • 保存

我们已经创建的要求意味着代理OS名称应为Mac OS X,因为我们为iOS配置了一个项目。

步骤11:准备构建-运行! 🎉

所有配置完成后,您就可以通过TeamCity开始构建了。 转到TeamCity主页,然后在新创建的构建配置上点击Run

之后,您将能够看到构建进度:

如果要查看当前构建的进度,只需单击“ Running标签,然后转到“ Build log部分。 如果在编译时发生一些错误,这将非常有用。

最后,在完成所有构建步骤之后,您将能够看到:

如您所见, XML Processing Report Build Feature提供了有关单元测试的出色输出:已Test passed: 24

步骤12:人工制品!

最后一个可选步骤。 我可以想象到,您可以找到许多您要编译项目,创建.ipa文件并将其发送给客户端的案例。 神器是为此做的。 为此,请执行以下操作:通过单击Edit Settings来建立配置设置:

Artifacts paths下的General Settings ,键入将由构建脚本生成的.ipa文件的路径。 我建议再次使用Fastlane。 Fastlane操作(称为gym将构建您的项目并在输出目录中创建.ipa文件。 有关gym更多信息,请点击此处。

如果执行此操作,则在下一次构建后,您将可以通过TeamCity上的Artifacts页面下载.ipa

结论

TeamCity是一个出色的平台,可在您的项目中提供持续集成。 与Fastlane结合使用,可以节省许多手动部署,测试和编译的时间。

另外,如果您将在构建配置中配置Artifacts,则可以轻松地将指向TeamCity页面的链接发送给客户端,并向其提供有关如何单击几下下载.ipa说明。 因此,您不必担心每次创建新文件版本时都会发送.ipa文件。

希望你喜欢这个职位。 随意发表评论并分享🙂

这篇文章主要发布在我的公司博客上