亚马逊AWS官方博客

使用 AWS CodeBuild 将 macOS 添加到您的持续集成管道中



从今天开始,您可以使用 AWS CodeBuildmacOS 上构建应用程序。现在,可以在 macOS 14 Sonoma 上运行的托管 Apple M2 计算机上构建构件。AWS CodeBuild 是一项完全托管的持续集成服务,可编译源代码、运行测试并生成可随时部署的软件包。

为 Apple 系统(iOSiPadOSwatchOStvOSmacOS)构建、测试、签名和分发应用程序,需要使用只能在 macOS 上运行的 Xcode。在 AWS 云中为 Apple 系统构建时,您很可能将持续集成和持续部署(CI/CD)管道配置为在 Amazon Elastic Cloud Compute(Amazon EC2)Mac 实例上运行。

自 2020 年推出 Amazon EC2 Mac 以来,我很多时间都是与不同行业和地区的客户共度,帮助他们在 macOS 上配置和优化管道。简单来说,客户的管道可能如下图所示。

EC2 Mac 上的 iOS 构建管道

当源代码存储库中有新的提交或拉取请求时,管道就会启动。计算机上安装的存储库代理会触发各种脚本来配置环境、构建和测试应用程序,并最终将其部署到 App Store Connect

Amazon EC2 Mac 极大地简化了 macOS 计算机的管理和自动化过程。我喜欢这样描述它:EC2 Mac 实例将我喜欢的 Amazon EC2(Amazon Elastic Block Store(Amazon EBS)卷、快照、虚拟私有云(VPC)、安全组等)应用于在云端运行 macOS 的 Mac 迷你电脑。

但是,客户面临着两个挑战。首先是使用构建所需的所有工具准备亚马逊机器映像(AMI)。最低构建环境需要安装 Xcode,但安装 Fastlane(和 Ruby)以及其他编译或开发工具和库也是很常见的。大多数组织需要多个构建环境才能实现 macOS 和 Xcode 版本的多种组合。

第二个挑战是根据构建的数量和持续时间来扩展构建实例集。大型组织通常每天要进行数百次或数千次的构建,需要数十台构建计算机。扩充和缩小该实例集有助于节省成本。EC2 Mac 实例预留供您专用。一个实例分配给一台专属主机。扩展专属主机实例集需要特定的配置。

为了应对这些挑战并简化 macOS 构建计算机的配置和管理,今天我们推出了适用于 macOS 的 CodeBuild。

适用于 macOS 的 CodeBuild 基于最近推出的预留容量实例集,后者包含由 Amazon EC2 提供支持、由 CodeBuild 执行维护的实例。借助预留容量实例集,可以为构建环境配置一组专用实例。这些计算机保持空闲状态,随时准备立即处理构建或测试,从而缩短了构建时间。借助预留容量实例集,您的计算机将始终处于运行状态,并且只要配置完毕就会继续产生成本。

CodeBuild 提供标准磁盘映像(AMI)来运行您的构建。它包含预安装版本的 Xcode、Fastlane、Ruby、Python、Node.js 以及用于开发和构建环境的其他常用工具。有关已安装的工具的完整列表,可查看文档。随着时间的推移,我们将使用这些工具的更新版本提供额外的磁盘映像。如果需要,也可以自带自定义磁盘映像。

此外,CodeBuild 可让您更容易地配置自动扩缩。只需告诉我们想要多少容量,其他事包在我们身上。

让我们看看适用于 macOS 的 CodeBuild 的实际运行情况
为了展示它的工作原理,我为我的宠物项目创建了一个 CI/CD 管道:在 iOS 上开始使用 AWS Amplify。本教程及附带的源代码介绍了如何使用基于云的后端来创建简单的 iOS 应用程序。该应用程序使用 GraphQL API(AWS AppSync)、NoSQL 数据库(Amazon DynamoDB)、基于文件的存储(Amazon Simple Storage Service(Amazon S3))和用户身份验证(Amazon Cognito)。适用于 Swift 的 AWS Amplify 将所有这些服务结合在一起。

应用程序的教程和源代码可在 Git 存储库中找到。它包含用于自动构建、测试和部署应用程序的脚本

使用适用于 macOS 的 CodeBuild 配置新的 CI/CD 管道涉及以下高级步骤:

  1. 创建构建项目。
  2. 创建计算机的专属实例集。
  3. 配置一个或多个构建触发器。
  4. 向项目添加管道定义文件(buildspec.yaml)。

首先,我打开 AWS 管理控制台,选择 CodeBuild,然后选择创建项目

codebuild mac - 1

我输入项目名称并配置与代码存储库的连接。我在这个例子中使用了 GitHub。CodeBuild 还支持 GitLab 和 BitBucket。文档包含支持的源代码存储库的最新列表。

codebuild mac - 2

对于配置模型,我选择预留容量。这是提供 Amazon EC2 Mac 实例的唯一模型。我还没有定义实例集,所以我决定在创建构建项目的同时动态创建一个实例集。我选择创建实例集

codebuild mac - 3

计算实例集配置页面上,我输入计算实例集名称并选择 macOS 作为操作系统。在计算下,我选择构建项目所需的内存量和 vCPU 数量,在容量下选择我想要的实例数量。

在此示例中,我很乐意使用托管映像。它包含 Xcode 15.4 和 iOS 17.5 的模拟器运行时等软件包。可以在文档中阅读此映像上预安装的软件包列表

完成后,我选择创建实例集,返回到 CodeBuild 项目创建页面。

CodeBuild - 创建实例集

下一步,我让 CodeBuild 创建一个新的服务角色来定义我想要的构建环境权限。在本项目的背景下,我必须包含拉取 Amplify 配置和访问 AWS Secrets Manager 的权限。我不会分享相关分步说明,但是示例项目代码包含我添加的权限列表

codebuild mac - 4

我可以选择在项目定义中或在项目中包含的 buildspec.yaml 文件中提供我的构建命令集。我选择后者。

codebuild mac - 5

这是可选的,但我想将构建构件上传到 S3 存储桶,在那里我可以为每次构建存档。因此,在构件 1 – 主部分中,我选择 Amazon S3 作为类型,然后输入存储桶名称和构件名称。要上传的文件名在 buildspec.yaml 文件中指定。

codebuild mac - 6

在页面的下方,我配置了项目触发器来添加 GitHub WebHook。这会将 CodeBuild 配置为每次我在 GitHub 上的项目收到提交或拉取请求时开始构建。

codebuild - webhook

最后,我选择页面底部橙色的创建项目按钮来创建这个项目。

测试我的构建
我的项目已经包含构建脚本,用于准备构建、构建项目、运行测试和将其部署到 Apple 的 TestFlight

codebuild - 项目脚本

我在项目的根目录添加了一个 buildspec.yaml 文件,用来编排这些现有脚本。

version: 0.2

phases:

  install:
    commands:
      - code/ci_actions/00_install_rosetta.sh
  pre_build:
    commands:
      - code/ci_actions/01_keychain.sh
      - code/ci_actions/02_amplify.sh
  build:
    commands:
      - code/ci_actions/03_build.sh
      - code/ci_actions/04_local_tests.sh
  post_build:
    commands:
      - code/ci_actions/06_deploy_testflight.sh
      - code/ci_actions/07_cleanup.sh
artifacts:
   name: $(date +%Y-%m-%d)-getting-started.ipa
   files:
    - 'getting started.ipa'
  base-directory: 'code/build-release'

我将这个文件添加到我的 Git 存储库,并使用以下命令将其推送到 GitHub:git commit -am "add buildpsec" buildpec.yaml

在控制台上,我可以观察到构建已经开始。

codebuild - 构建历史记录

当我选择构建时,我可以看到日志文件或选择阶段详细信息,来获得构建每个阶段的高级状态。

codebuild - 阶段详细信息

成功构建后,我可以看到上传到我的 S3 存储桶的 iOS 应用程序 IPA 文件。

aws s3 ls

CodeBuild 执行的最后一个构建脚本会将此二进制文件上传到 App Store Connect。我可以在 App Store Connect 的 TestFlight 部分中观察到新的构建。

App Store Connect

注意事项
准备 Amazon EC2 Mac 实例并接受第一次构建需要 8-10 分钟。这不是 CodeBuild 所特有的。您在计算机准备期间提交的构建将排入队列,并在计算机可用时立即按顺序运行。

适用于 macOS 的 CodeBuild 适用于预留实例集。与按需实例集相反,这里按构建分钟付费,预留实例集根据构建计算机预留供您专属使用的时间付费,即使没有正在运行构建。容量预留遵循 Amazon EC2 Mac 的 24 小时最低分配期限,这是 macOS 软件许可协议(第 3.A.ii 条)的要求。

可以在您的 AWS 账户上的 CodeBuild 项目之间共享计算机的一个实例集。该实例集中的计算机预留供您专用。只有 CodeBuild 可以访问这些计算机。

CodeBuild 会在构建之间清理工作目录,但计算机会重复用于其他构建。它允许使用 CodeBuild 本地缓存机制在构建后快速恢复所选文件。如果在同一个实例集上构建不同的项目,请务必在开始新的构建之前重置任何全局状态(例如 macOS 密钥链)和构建构件,例如 SwiftPM 和 Xcode 包缓存

使用自定义构建映像时,请确保它们是为 64 位 Mac-Arm 架构构建的。还必须安装并启动 AWS Systems Manager Agent(SSM Agent)。CodeBuild 使用 SSM Agent 来安装自己的代理和管理计算机。最后,请确保 AMI 可用于 CodeBuild 组织 ARN

适用于 macOS 的 CodeBuild 已在以下 AWS 区域推出:美国东部(俄亥俄州、弗吉尼亚北部)、美国西部(俄勒冈州)、亚太地区(悉尼)和欧洲地区(法兰克福)。这些地区与提供 Amazon EC2 Mac M2 实例的地区相同。

立即开始在 macOS 上创建第一个 CodeBuild 项目

— seb


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。