Tag: 可扩展性

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云的核心。 这是您如何使其工作的方法: 设置Anka控制器和注册表Docker容器。 前者接受对新Mac虚拟机的请求。 后者管理不同版本的VM。 在Mac硬件上安装客户端。 将客户端连接到控制器和注册表。 通过Anka Jenkins插件集成控制器并进行配置。 例如,您需要设置控制器应为其触发新VM的Jenkins标签。 开始在自由式和管道作业中使用标签。 这里没有银弹,我们所做的更改涉及权衡: 🤩可以在单个Mac Pro上运行多个VM,这意味着CI环境中可以使用更多资源。 有了Anka,我们不必在过渡期间牺牲速度。 完整的项目存档大约需要18分钟才能在裸机Mac […]

Swift的SOLID面向对象设计原则

iOS首席工程师Buymie的Mnats Karakhanyan 好的软件系统应该具有好的架构和构建块。 如果没有很好地构建模块,那么体系结构就没什么大不了的,那么您最终可能会使用构建良好的模块构建一个糟糕的系统。 这就是SOLID原则的用武之地。 SOLID原理告诉我们如何将我们的功能和数据结构安排到类中,以及如何将这些类互连。 注意: “类”一词并不意味着这些原则仅适用于面向对象的软件。 类只是功能和数据的耦合分组。 每个软件系统都有这样的分组。 SOLID是5条原则的首字母缩写,代表: S:单一责任原则(SRP) O:开闭原理(OCP) L:李斯科夫替代原理(LSP) 一:接口隔离原理(ISP) D:依赖反转原理(DIP) 这些原则的目标是创建以下软件结构: 容忍变化 容易理解,并且 是可在许多软件系统中使用的组件的基础。 SRP:单一责任原则 类或模块应该有一个更改理由,并且只有一个更改理由 该原则为我们提供了责任的定义和班级规模的准则。 班级应该承担一项责任-改变的原因之一。 违反SRP的示例。 让我们看看这堂课有什么样的责任? 从API检索数据 解析API响应 将数据保存在数据库中 我们可以解决此问题,将职责移至类: 注意:听到这个名称太容易了,然后假设它意味着每个模块都只能做一件事 。 有这样的原则。 一个函数应该做一件事情,并且只能做一件事情。 违反原则的症状是意外复制和合并。 OCP:开放封闭原则 软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改 让我们看一个违反OCP的例子。 考虑类AnaliticServise,该类正在跟踪Facebook中的事件。 现在,我们还想增加在Google Analytics(分析)中跟踪相同事件的可能性。 不违反OCP的解决方案可能如下所示: 注意:遵循OCP通常会引入新的抽象级别,这会增加我们代码的复杂性。 您想专注于最有可能在您的设计中发生变化的领域,并在其中应用原理。 LSP:李斯科夫替代原则 令Φ(x)是关于类型T的对象x的可证明性质。那么对于类型S的对象y,其中S是T的子类型,则Φ(y)应该成立。