在 Docker 中使用 Fastlane 构建 iOS 应用

Posted

技术标签:

【中文标题】在 Docker 中使用 Fastlane 构建 iOS 应用【英文标题】:Building a iOS app with Fastlane inside Docker 【发布时间】:2018-01-03 13:10:12 【问题描述】:

我正在尝试简化我的 ios 开发构建并阅读有关 Docker 的信息。

如果我理解正确,我可以创建一个包含所有依赖项的图像,我的开发人员可以直接拉取它并在其中构建。

重点是,这是否也适用于 Fastlane(我认为它使用 Xcode cli 工具)和“Docker for Mac”?

另外,我正在使用 React-Native,它似乎开始了第二个流程,用于捆绑稍后将包含在 native 构建中的 javascript,我读到 Docker 只允许一个流程,是这是个问题?

【问题讨论】:

【参考方案1】:

使用 Docker 的问题在于,即使您使用 Docker for mac,您也无法访问基于 macOS 的图像。 Docker 在一个名为xhyve 的轻量级虚拟机中运行——至少如果你通过 Docker for Mac 包安装 docker——它在你的 Mac 上运行 Linux。

本质上,这意味着您的 docker 容器将仅限于非 Xcode 功能。以下是您绝对无法做到的事情,至少在没有大量工作的情况下是无法做到的:

编译应用的原生代码 为您的应用截屏或在模拟器中运行您的应用 使用 Apple 的 codesign 签署完成的应用程序

您可能会使用 docker 容器来做以下事情:

构建 JS 代码(我假设,因为 RN 应该在 Linux 上工作) 使用 iTMSTransporter 上传您的应用(即使用 fastlane 的 deliver) 下载/创建证书、配置文件和推送证书(即 fastlane 的 matchcertpemsigh) 使用 git

总而言之,您可能会非常有限。相反,建议使用GemfileBrewfile 之类的东西列出所有依赖项,并使用一个小的setup.sh 脚本运行brew bundlebundle install 将它们安装在您同事的机器上。您还可以将其设置为在构建期间运行它们(使用 Xcode 的脚本构建阶段),这样就不会有人不小心忘记安装构建所需的东西。

话虽如此,here 上正在开发一个 fastlane docker 映像,Docker Hub 上也提供该映像。请注意,它只经过测试以运行 fastlane 测试(不依赖于仅 macOS 的软件),因此它实际上并没有声称可以可靠地运行 fastlane。

我读过 Docker 只允许一个进程

Docker 允许多个进程,它只是不允许多个主进程。如果您的主进程停止了其他一切并且容器随之停止。如果您只想使用它来安装依赖项,以便您可以运行使用它们的一次性命令,而不是托管长时间运行的服务,您始终可以使用 docker run 来做到这一点:

docker run <repo/image:tag> <your_command>

或者在容器中启动一个交互式 shell:

docker run -it <repo/image:tag> /bin/bash

【讨论】:

我注意到引用的链接:这里正在处理一个 fastlane docker 映像... 不再存在,因此我编辑/更新了您的答案正确的网址。

以上是关于在 Docker 中使用 Fastlane 构建 iOS 应用的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在 fastlane 快照中传递构建参数

在监视目标中使用 fastlane 和可可豆荚进行构建的问题

我的 Xcode 可以构建,但 Fastlane 不行

Fastlane 构建未在 VSTS CI 上执行

如何在使用 Xcode 自动代码签名的同时使用 Fastlane 和 Crashlytics 进行构建?

使用 Fastlane 自动构建、部署到曲棍球