与fastlane和CircleCI的持续集成和交付

我们在Sixt希望分享我们为iOS应用程序进行持续集成和交付的方法。 在过去的一年中,改变我们制作CI和CD的方式对于我们的开发过程至关重要。

首先,让我们从我们的应用程序和团队的一些历史开始,以及如何影响我们对CI提供商的决定。 Sixt应用程序的第一版于2008年发布,我们的团队只有一名iOS开发人员。 那时,CI是没有必要的,并且所有操作都是手工完成的。 在将团队增加到3名成员之后,我们决定从CI开始使用Jenkins。 那时,这是合乎逻辑的决定。 Jenkins是免费的,我们可以将其托管在我们自己的硬件上,一次运行一个构建就可以了。 在2016年,我们决定迁移到TeamCity,并为我们的CI使用两个构建代理。 如今,我们的iOS团队由15位开发人员组成,他们构建了三个公共应用程序Sixt,DriveNow和MyDriver,以及多个内部应用程序。 随着最近几年的快速增长,出现了对新CI服务提供商的需求。 在此博客文章中,我们想分享我们当前的CI / CD管道。

CircleCi

从一开始就很明显,我们希望迁移到基于云的CI提供程序,因为我们自己的硬件的托管和维护花费了开发人员过多的时间。 对我们来说,两个最重要的指标是启动时间和并发性。 在比较了几个提供商之后,我们决定选择CircleCI,因为他们似乎非常满足我们的需求并且看起来已经足够成熟。 单击此链接开始使用CircleCI。

CI管道

现在到我们当前管道的实际外观有趣的部分。 我们正在使用fastlane运行所有脚本,CircleCI只是根据触发它的分支执行不同的通道。 以下是分支和通道如何连接的一般概述:

除了运行上述构建计划外,我们还将在每晚构建中运行整个测试套件。 这包括我们的单元以及UI测试。
在接下来的段落中,我们将完成项目的初始设置和代码签名,创建单个通道并在CirleCI上运行所有程序。

苹果开发者门户

首先,我们需要在门户中创建我们的应用程序标识符。 转到此页面并填写必要的信息。 每个构建配置都需要一个应用程序标识符。 对于此帖子,我们的基本捆绑包标识符是com.name.app,因此我们必须创建以下应用程序标识符:

  • com.name.app
  • com.name.app-dev
  • com.name.app-alpha

devalpha应用程序标识符是在我们的企业帐户中创建的。 允许在任何设备上部署。

快车道

如上所述,我们将使用fastlane运行脚本。 一个好的做法是使用Gemfile锁定依赖项。 在项目的根目录中创建一个Gemfile,并将fastlane添加为依赖项。

接下来,您将需要根据配置更改包标识符。 转到您的“应用程序目标”->“构建设置”,然后搜索“捆绑标识符”。 它看起来应该类似于:

配置代码签名的最后一步是更改签名设置。 转到常规标签,禁用“自动管理唱歌”,然后为每种配置选择正确的配置文件。 您应该在下拉列表中看到一个符合条件的配置文件。 我们的最终结果如下所示:

测试车道

下一步是创建用于运行我们的不同测试套件的通道。 我们有一条用于单元测试,UI测试的通道,并且可以运行所有通道。 记住要替换您的工作区方案。

之后,进入项目设置并将用户部署密钥添加到项目非常重要。 这允许快速通道匹配来克隆我们的证书存储库。 再次在这里,我们建议您使用bot github帐户添加用户ssh密钥。 您可以在此处找到添加用户密钥的选项:

最后一步是添加我们的环境变量,我们准备开始构建。 由于我们正在使用CircleCI的新上下文功能,因此环境变量可用于我们的所有项目。 这使得在线下配置更多项目变得非常容易。 对于我们的设置,以下变量是必需的:

  • 匹配密码
  • FASTLANE_PASSWORD
  • CRASHLYTICS_API_TOKEN
  • CRASHLYTICS_BUILD_SECRET

MATCH_PASSWORD是您用于加密证书存储库的密码,而FASTLANE_PASSWORD是您用于Apple Developer Portal的登录密码。 另外两个很不言自明。

而已! 现在一切都应按照我们的构建计划运行。 快乐大厦🎉🎉🎉

寻找什么

由于使用了临时钥匙串,因此每次运行证书通道时都会看到以下输出。 这不是错误,并且如果构建失败,则原因可能有所不同。