Xcode Server + Ansible:可扩展和可编程的iOS CI / CD基础结构

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客

关于Xcode Server的抱怨之一是它不能扩展用作大型或企业级。 但是,如果您具有理解和管理用于iOS部署的基础结构的技能,则可以使用iOS和DevOps工具包的混合为中小型或大型iOS团队轻松实现可伸缩性。 过去,在我之前在Photobox Group工作时,我们使用工具Ansible + Fastlane + TeamCity的组合实现了这一目标。 您可以在此处阅读我在Moonpig Engineering博客上的博客文章,以了解我们如何实现这一目标。

在这篇文章中,我们将看到学习Ansible和Apple的CI解决方案Xcode Server之类的DevOps工具如何可以轻松地管理大规模的iOS CI / CD基础架构。

与iOS相比,iOS开发的持续集成实践并不理想,因为iOS开发有一些独特的挑战。 必须了解整个iOS生态系统才能为团队设置和管理CI / CD基础结构。 一些高级/高级iOS开发人员或iOS技术架构师/主管非常了解Apple开发人员工具,技术和基础架构的全部堆栈,并在其项目中实施,但是目前业内大多数iOS开发人员只是iOS开发人员,他们擅长编写Swift或Objective-C为Xcode内部的应用程序构建UI。 但是,在了解基础架构时,它们确实很烂。 他们没有正确理解Xcode在幕后使用的底层工具和技术,这就是为什么他们完全无法设置或管理iOS应用程序的CI / CD做法。 因此,他们始终必须依赖本地Xcode或DevOps团队的人员来管理所有基础架构堆栈,否则CI / CD将由昂贵的第三方服务来处理。 这意味着开发人员不是完整的堆栈,也不了解他们自己的工具和技术。 不幸的是,iOS开发的世界充满了这类业余爱好者和烦恼的开发人员。 没有团队中的熟练工程师,持续集成将不会成功。 在我以前的文章中,我写到了CI失败的5大原因。 这些是错误选择的CI服务器,CI Amature工程师,缺少作为代码的基础架构,质量差的构建服务器以及团队缺乏支持。

除了iOS工程师无法理解整个iOS生态系统之外,iOS生态系统的自动化还存在一些传统挑战。 其中一些是由苹果专有软件强加的,而其他则是由于缺乏自动化iOS和macOS基础架构的工具。 一些常见的挑战是

  • 缺少可用于自动执行基础结构的配置管理工具。 Chef,Ansible和Puppet不适用于macOS服务器。
  • 缺少用于配置和自动安装软件的官方软件包管理系统。 我们必须使用第三方解决方案,例如HomeBrew
  • 缺乏官方的依赖管理工具。 我们必须使用迦太基或Cocoapods来管理依赖关系。 Swift Package Manager尚未准备好与iOS一起使用。
  • 缺少官方的构建工具。 我们必须使用Fastlane之类的工具来自动化iOS开发任务。

由于这些挑战,没有人愿意花时间探索干净且自动化的解决方案来设置iOS基础结构以实现平稳的连续交付,从而导致以下情况。

  • 手动设置CI服务器,需要花费几天的工程师才能使所有构建服务器上的工作正常
  • 片状构建自动化导致结果不一致
  • 本地计算机和构建计算机上的软件配置不同
  • 持续集成由第三方提供商管理,如果出现构建错误,需要与他们联系。
  • 团队对CI失去了信任,开始使用本地计算机进行测试和发布。

这些症状是最佳应用程序开发实践的障碍。 我们可以通过了解一些配置管理工具和适当的持续集成工具来解决其中的一些问题。 现在,我们将了解Xcode Server和Ansible的结合如何帮助建立大规模的持续集成并有效地对其进行管理。

Xcode Server是Apple开发的本机连续集成服务。 Xcode Server是针对iOS应用程序进行持续集成的最简单方法之一。 它只需要Xcode安装并获得macOS服务器上Apple开发人员门户的许可。 如果您使用其他解决方案(例如Jenkins,TeamCity等),则需要安装其他依赖项(例如Java和其他相关软件),这些依赖项与iOS开发无关。 在撰写本文时,Apple仍然具有Xcode Server的旧文档,但是我在此处的上一篇博客文章中编写了安装说明。 因此,为了设置Continuous Integration Server(即CI),我们只需要在构建机器上安装以下组件。

  • Xcode
  • Xcode命令行工具
  • macOS默认设置
  • Ruby和Homebrew(可选)

我们可以在每台机器上手动安装该软件,但是如果我们有多台macOS机器,这将很耗时。 我们需要确保Xcode和其他工具版本在所有服务器上都一致。 现在,我们需要进行配置管理,以管理服务器和这些服务器上的软件版本。

市场上有各种配置管理工具,例如Chef,Puppet和Salt,但Ansible易于学习和使用。 尽管Ansible是为Linux设计的,但仍有足够的模块可与macOS一起使用。 这不是Ansible教程,但您需要在此处阅读一些文档以开始使用Ansible。

为了配置Xcode Server,我们需要执行以下操作

  • 从Apple Developer Portal下载的Xcode .xip文件
  • 将Ansible安装在远程macOS机器上,然后Ansible将ssh转换为其他macOS并安装所有可用软件。

此外,如果需要,我们可以使用Ansible安装其他工具,例如Ruby,Homebrew。

为了安装Xcode,我们需要具有从Apple Developer Portal下载的.xip文件,并将其放在Ansible远程计算机上以复制到ssh计算机。 Xcode安装中还需要安装其他各种东西

  • 存档XIP文件并将Xcode应用程序移动到/ Applications
  • 接受许可协议
  • 安装Xcode命令行工具和其他移动开发包
  • 启用开发人员工具并安装其他组件
  • 设置Xcode Developer目录。

我们可以使用Ansible完成所有这些任务。

  --- 
-名称:检查是否已安装Xcode
stat:path =〜// Library / Developer / Xcode /
注册:xcode_dir
-名称:测试xcode是否较早上传
stat:path = / Users / {{ansible_ssh_user}} / {{xcode_src}}
注册:xcode_dl_path
-名称:上传xcode
复制:src = {{xcode_src}} dest = / Users / {{ansible_ssh_user}} /
时间:xcode_dl_path.stat.exists == False
-名称:检查xcode存档是否有效
命令:“ pkgutil --check-signature〜/ {{xcode_src}}
grep \“状态:已签名的Apple软件\”
什么时候:xcode_dir.stat.exists == False
-名称:从XIP文件位置安装Xcode
命令:bash -c'open -FWga“归档实用程序” --args / Users / {{ansible_ssh_user}} / {{xcode_src}}'
什么时候:xcode_dir.stat.exists == False
-名称:将Xcode移至应用程序
命令:bash -c'mv〜/ Xcode * .app / Applications /'
什么时候:xcode_dir.stat.exists == False
-名称:接受许可协议
命令:bash -c“ sudo /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -license accept”
-名称:安装移动设备软件包
命令:bash -c“ sudo安装程序-pkg /Applications/Xcode.app/Contents/Resources/Packages/MobileDevice.pkg -target /”
-名称:安装移动设备开发包
命令:bash -c“ sudo安装程序-pkg /Applications/Xcode.app/Contents/Resources/Packages/MobileDeviceDevelopment.pkg -target /”
-名称:安装Xcode系统资源包
命令:bash -c“ sudo安装程序-pkg /Applications/Xcode.app/Contents/Resources/Packages/XcodeSystemResources.pkg -target /”
-名称:安装其他xcode组件
命令:bash -c“ sudo安装程序-pkg /Applications/Xcode.app/Contents/Resources/Packages/XcodeSystemResources.pkg -target /”
-名称:检查开发人员模式的状态
命令:DevToolsSecurity -status
成为:是的
成为方法:须藤
注册:dev_tools_security_status
-名称:启用开发人员模式
命令:DevToolsSecurity-启用
成为:是的
成为方法:须藤
什么时候:
-“在dev_tools_security_status.stdout中为'disabled'”
-xcode_dir.stat.exists == False
-名称:设置Xcode开发人员目录
命令:bash -c“ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/”

请注意,上面的代码是Ansible任务的示例,我们必须设置一些变量来配置用户和目录。

现在,我们可以将Xcode安装为上述任务的一部分。 接下来的事情是使用Ansible控制Xcode Server。 Xcode Server具有命令行工具xcscontrol来管理Xcode Server。 我们可以使用该实用程序启动,停止重置或重新启动Xcode Server。 我们可以这样编写Ansible任务:

 ---名称:使用给定的用户启动Xcode Server 
命令:bash -c'sudo xcrun xcscontrol --initialize --build-service-user {{xcode_server_user}}''
-名称:COnfigure Xcode服务器证书
命令:bash -c'sudo xcrun xcscontrol --configure-ota-certificate'
-名称:配置Xcode服务器超时
命令:bash -c'sudo xcrun xcscontrol --configure-integration-timeout 3600'
-名称:检查Xcode服务器运行状况
命令:bash -c'sudo xcrun xcscontrol --health'

通过这种简单的配置,我们可以轻松地在多个macOS服务器上管理Xcode服务器。

我已经为Xcode Server创建了Ansible角色并将其发布到Ansible Galaxy。 你可以在这里找到这个角色

这个角色是非常可配置的,可以根据需要用于设置多个macOS服务器。 您可以在README文件中找到详细信息。

您可以查看用于该角色的所有变量,然后打开/关闭或根据需要进行设置。 如果需要,您可以选择设置Ruby和Homebrew。

  vars: 
clean_xcode:是的
clean_rvm:否
clean_homebrew:否
configure_xcode:是
configure_xcodeserver:是
configure_macos_defaults:是
configure_ruby_rvm:否
configure_homebrew:否
xcode_src:Xcode_9.1.xip xcode_server_user:shashi
ansible_ssh_user:shashi

想象一下,您有安装了新macOS的新Mac。 您可以通过为此角色创建Playbook来为CI设置所有Xcode服务器。 您可以根据需要设置配置变量。 假设您已经安装了Ansible,我们可以通过运行以下命令下载角色

  $ ansible-galaxy安装Shashikant86.XcodeServer 

现在,我们必须通过设置变量来为此角色创建自己的剧本,我们可以在此处使用默认变量。 现在创建一个名为xcode_server的新目录,并创建文件目录和xcs_playbook.yml文件。

  $ mkdir xcode_server 
$ mkdir XcodeServer /文件
$ touch xcs_playbook.yml

现在,将Xcode_9.x.xip文件放到files目录中,并在playbook文件中插入以下内容:

  --- 
-主机:localhost
连接:本地
vars:
clean_xcode:是的
clean_rvm:否
clean_homebrew:否
configure_xcode:是
configure_xcodeserver:是
configure_macos_defaults:是
configure_ruby_rvm:否
configure_homebrew:否
xcode_src:Xcode_9.1.xip xcode_server_user:shashi
ansible_ssh_user:shashi
角色:
-Shashikant86.XcodeServer

用您的用户名更改ansible_ssh_user和xcode_server_user,并根据需要随意设置变量。 您还可以指定清单,以使此剧本能够在多个主机上运行。 现在,使用以下命令执行此剧本:

$ ansible-playbook xcs_playbook.yml

观看您的Mac Mini服务器如何使用Xcode Server进行iOS持续集成设置。

在某些情况下,我们想在服务器上运行Ansible剧本,一些常见的情况是

  • 要安装的新Xcode版本
  • 定期间隔后重置Rebuild CI环境
  • 清理环境以解决代码签名问题
  • 重置服务器以节省磁盘空间

理想情况下,我们应该定期运行Ansible剧本以检查是否有任何更改。

在Xcode Server中使用配置管理工具的一些好处是

  • 所有服务器的设置一致
  • 基础架构即代码
  • 必要时销毁并构建CI服务器
  • 节省工程师设置CI服务器计算机的人工时间
  • 消除昂贵的第三方CI服务的成本
  • 无需专门的DevOps资源即可管理iOS CI / CD基础架构
  • 了解iOS生态系统并有信心应对任何问题
  • 无需使用诸如Fastlane之类的第三方构建自动化工具,因为Xcode Server可以处理CI / CD所需的几乎所有内容

您可能还会看到其他好处,并且对持续集成有了更多的信心和信任

结合使用DevOps工具和Apple的本机CI / CD工具,我们可以为iOS应用程序实现可扩展的可编程基础结构。 Xcode Server和Ansible的组合可以很好地协同工作,以实现iOS应用程序的持续交付而没有任何麻烦。 您是否对iOS CI / CD基础结构使用任何配置管理工具? 您对Xcode Server有何经验? 请让我知道您对这种方法的看法,任何想法建议都很棒。

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..