Help us learn about your current experience with the documentation. Take the survey.

macOS 上的托管运行器

  • Tier: Premium, Ultimate
  • Offering: GitLab.com
  • Status: Beta

macOS 上的托管运行器提供按需的 macOS 环境,与 GitLab CI/CD 完全集成。 您可以使用这些运行器来构建、测试和部署 Apple 生态系统(macOS、iOS、watchOS、tvOS)的应用程序。 我们的 Mobile DevOps 部分 提供了构建和部署 iOS 移动应用程序的功能、文档和指导。

macOS 上的托管运行器处于 beta 阶段,适用于开源项目和 Premium 及 Ultimate 计划的客户。 macOS 上托管运行器的 正式发布 计划在 epic 8267 中提出。

在使用 macOS 上的托管运行器之前,请查看影响它们的 已知问题和使用限制 列表。

macOS 可用的机器类型

GitLab 为 macOS 上的托管运行器提供以下机器类型。要构建 x86-64 目标,您可以使用 Rosetta 2 来模拟 Intel x86-64 环境。

运行器标签 vCPUS 内存 存储
saas-macos-medium-m1 4 8 GB 50 GB
saas-macos-large-m2pro 6 16 GB 50 GB

支持的 macOS 镜像

与我们 Linux 上的托管运行器不同(您可以在其中运行任何 Docker 镜像), GitLab 为 macOS 提供一组 VM 镜像。

您可以在以下镜像之一中执行构建,这些镜像在您的 .gitlab-ci.yml 文件中指定。 每个镜像运行特定版本的 macOS 和 Xcode。

VM 镜像 状态
macos-14-xcode-15 GA 预装软件
macos-15-xcode-16 GA 预装软件

如果未指定镜像,macOS 运行器将使用 macos-15-xcode-16

macOS 镜像更新策略

镜像和已安装组件随每次 GitLab 发布而更新,以保持预装软件的更新。GitLab 通常支持多个版本的预装软件。有关更多信息,请参阅 预装软件完整列表

macOS 和 Xcode 的主要和次要版本在 Apple 发布后的里程碑中提供。

新的主要版本镜像最初以 beta 形式提供,并在第一个次要版本发布时正式发布。 由于一次只支持两个正式发布的镜像,最旧的镜像将被弃用,并根据 支持的镜像生命周期 在三个月后移除。

当新的主要版本正式发布时,它将成为所有 macOS 作业的默认镜像。

.gitlab-ci.yml 文件示例

以下示例 .gitlab-ci.yml 文件展示了如何开始使用 macOS 上的托管运行器:

.macos_saas_runners:
  tags:
    - saas-macos-medium-m1
  image: macos-14-xcode-15
  before_script:
    - echo "started by ${GITLAB_USER_NAME} / @${GITLAB_USER_LOGIN}"

build:
  extends:
    - .macos_saas_runners
  stage: build
  script:
    - echo "running scripts in the build job"

test:
  extends:
    - .macos_saas_runners
  stage: test
  script:
    - echo "running scripts in the test job"

使用 fastlane 进行 iOS 项目代码签名

在将 GitLab 与 Apple 服务集成、安装到设备或部署到 Apple App Store 之前,您必须对应用程序进行 代码签名

每个 macOS VM 镜像的运行器中都包含 fastlane, 这是一个旨在简化移动应用程序部署的开源解决方案。

有关如何为应用程序设置代码签名的信息,请参阅 Mobile DevOps 文档 中的说明。

相关主题:

优化 Homebrew

默认情况下,Homebrew 在任何操作开始时都会检查更新。Homebrew 的发布周期可能比 GitLab macOS 镜像的发布周期更频繁。 这种发布周期的差异可能导致调用 brew 的步骤在 Homebrew 进行更新时花费额外时间来完成。

为了减少因意外 Homebrew 更新导致的构建时间,请在 .gitlab-ci.yml 中设置 HOMEBREW_NO_AUTO_UPDATE 变量:

variables:
  HOMEBREW_NO_AUTO_UPDATE: 1

优化 Cocoapods

如果您在项目中使用 Cocoapods,应考虑以下优化来提高 CI 性能。

Cocoapods CDN

您可以使用内容分发网络 (CDN) 访问从 CDN 下载包,而不必克隆整个项目仓库。 CDN 访问在 Cocoapods 1.8 或更高版本中可用,并且所有 GitLab 托管的 macOS 运行器都支持。

要启用 CDN 访问,请确保您的 Podfile 以以下内容开头:

source 'https://cdn.cocoapods.org/'

使用 GitLab 缓存

在 GitLab 中使用 Cocoapods 包的缓存,仅在 pods 更改时运行 pod install,这可以提高构建性能。

为您的项目 配置缓存

  1. cache 配置添加到您的 .gitlab-ci.yml 文件中:

    cache:
      key:
        files:
         - Podfile.lock
    paths:
      - Pods
  2. cocoapods-check 插件添加到您的项目中。

  3. 更新作业脚本,在调用 pod install 之前检查已安装的依赖项:

    bundle exec pod check || bundle exec pod install

将 pods 包含在源代码控制中

您也可以 将 pods 目录包含在源代码控制中。这消除了在 CI 作业中安装 pods 的需要, 但会增加项目仓库的总体大小。

已知问题和使用限制

  • 如果 VM 镜像不包含作业所需的特定软件版本,则必须获取并安装所需的软件。这会导致作业执行时间增加。
  • 无法使用您自己的 OS 镜像。
  • 用户 gitlab 的钥匙串不可公开访问。您必须创建一个钥匙串。
  • macOS 上的托管运行器在无头模式下运行。 任何需要 UI 交互的工作负载(如 testmanagerd)都不受支持。
  • 由于 Apple 芯片具有效率核心和性能核心,作业性能在不同作业执行之间可能有所不同。您无法控制核心分配或调度,这可能导致不一致性。
  • 用于 macOS 托管运行器的 AWS 裸机 macOS 机器的可用性有限。当没有可用机器时,作业可能会遇到长时间的排队等待。
  • macOS 上的托管运行器实例有时不响应请求,导致作业挂起直到达到最大作业持续时间。