iOS CI,增压

当Skyscanner看到为其iOS代码库做出贡献的开发人员的数量大大增加时,它便着手重建其私有Mac云。 这是发生了什么事。

为iOS开发-不像Apple Pie那样简单

在过去的五年中,我一直是Skyscanner的iOS工程师,致力于塑造我们的移动应用程序的功能。 后来我加入了移动DevOps团队。 这使我可以利用自己的移动体验来改善我们的iOS平台基础结构。 业内许多人认为可以简化针对iOS的开发。 在构建一致且可扩展的iOS CI系统时,这一点更加明显。

当我第一次加入DevOps团队时,Skyscanner将Jenkins CI与本地Mac Minis和Mac Pros结合使用。 这些负责运行Android和iOS作业,我们一一管理。 如果要增加工作执行者的数量,则需要购买新的Mac。 这是因为Apple EULA声明您只能在正版Mac硬件上构建iOS代码。 如果还希望使执行程序保持一致,则可以选择创建NetRestore映像或使用JAMF。 无论哪种方式,您都必须手动关闭Mac,并忍受在配置Mac时无法使用它们。 如果您在所有这些方面都认识到当前的CI系统,或者遇到类似的问题,请继续阅读。 我们有一个解决方案供您考虑。

通往云的阶梯

在2018年初,我们看到为iOS代码库做出贡献的开发人员数量呈上升趋势。 具有CI资源修复的更多开发人员意味着更长的队列和等待时间。

我们需要尽快实现动态的负载平衡资源。 对于Android,我们的任务相对简单。 Skyscanner Web堆栈位于AWS上,因此我们已经拥有必要的云知识和工具。 在先前的研究中,我们已经定义了配置虚拟机所需的命令。 使用HashiCorp的Packer,我们可以生成Amazon Machine Image。 Jenkins可以使用Jenkins EC2插件实例化它们。 在此过程中,我们学到了很多有关如何在虚拟机上呈现必要状态(例如缓存)的知识。 最后,我们可以将并行作业从4个增加到30个。

对于iOS,我们必须多走一些路:我们在知识上有些不足,需要在皮带上添加一些新工具。 在开始该项目后不久,我们遇到了Veertu提供的虚拟化技术Anka。 由于其性能和易用性,它成为了我们的私有Mac云的核心。 这是您如何使其工作的方法:

  1. 设置Anka控制器和注册表Docker容器。 前者接受对新Mac虚拟机的请求。 后者管理不同版本的VM。
  2. 在Mac硬件上安装客户端。
  3. 将客户端连接到控制器和注册表。
  4. 通过Anka Jenkins插件集成控制器并进行配置。 例如,您需要设置控制器应为其触发新VM的Jenkins标签。
  5. 开始在自由式和管道作业中使用标签。

这里没有银弹,我们所做的更改涉及权衡:

🤩可以在单个Mac Pro上运行多个VM,这意味着CI环境中可以使用更多资源。 有了Anka,我们不必在过渡期间牺牲速度。 完整的项目存档大约需要18分钟才能在裸机Mac Pro上执行,而在VM中则需要大约18分钟。

🤩CI环境的创建是一致且自动化的。 我们有一个创建虚拟机的Jenkins管道和一个更新其缓存的管道。

🤩易于部署新环境。 如果新环境的性能不佳,我们可以轻松回滚到以前的稳定环境。

ka对于每个作业,Anka都会从模板克隆VM。 作业完成后,它也会销毁VM。 您需要将状态(例如缓存)保存到外部存储(例如S3),并在下次启动时下载它们。 这可能会花费一些时间,因此为了加快网络时间,我们每天晚上使用Anka-Jenkins从属模板构建器插件创建一个具有每日缓存基准的新VM模板。 这样,节点仅提取当天创建的缓存和提交。

VM VM模板的大小通常为60–70 GB(预先加载了macOS,Xcode和缓存)。 您需要在Anka Registry中存储VM模板(大约1 TB应该足够)。 可以从群集中的所有节点轻松访问此Anka Registry存储。 如果Mac硬件位于更多位置,则需要在这些位置设置Anka Registry并进行同步。 节点不会为每个VM置备作业请求从注册表存储中获取VM模板-仅在将更新的VM模板推送到节点时才这样做。

没有打without就没有整合,Anka也不例外。 例如,由于Anka客户端更新了VM中的时间,因此新的Xcode构建系统崩溃了。 Veertu提供了快速的支持,因此我们能够很快解决此问题。 最后,我们可以将8个iOS资源扩展到20个。

在实施修补程序之前,队列等待时间可能长达80分钟。 使用当前设置,我们已设法将其减少到7分钟。 我们的团队现在还可以一致地管理iOS CI环境。 由于40-50个同时运行的执行程序,我们不得不将Jenkins更新并移至AWS,但这是另一回事了。

结论…

我们以前的Mac硬件园区无法应对为我们的应用程序代码做出贡献的开发人员数量的增加。 为了解决这个问题,我们首先将Android执行程序移至AWS云。 然后,我们创建了一个私有Mac云。 我们了解了折衷方案,并最终获得了规模化且一致的CI系统。 如今,我们的开发人员无需等待数小时即可集成他们的更改。

您是否准备应对类似的挑战? 您能改善我们的解决方案吗? 我们正在招聘,请参阅我们的工作页面。

关于作者:PéterAdam Wiesner

嗨,我是Skyscanner的高级软件工程师。 我是创建新的Skyscanner iOS应用程序团队的一员,在该项目的五年中,我致力于该应用程序的众多功能。 如今,我加强了Mobile DevOps团队,在这里我利用自己的移动知识来帮助其他开发人员向用户交付产品。