

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程： CodeBuild 使用 Fastlane 进行 Apple 代码签名 GitHub 用于证书存储
<a name="sample-fastlane-github"></a>

[fastlane](https://docs.fastlane.tools/) 是一款流行的开源自动化工具，可自动部署和发布 iOS 和 Android 应用程序的测试版。它可以处理所有繁琐的任务，例如生成屏幕截图、处理代码签名和发布应用程序等。

此示例演示如何在 Mac 机群上运行的 CodeBuild项目中使用 Fastlane 设置 Apple 代码签名，并用 GitHub 作证书和配置文件的存储空间。

## 先决条件
<a name="sample-fastlane-github-prerequisites"></a>

要完成本教程，您首先必须设置以下条件：
+ 一个 Amazon Web Services 账户
+ [Apple 开发人员账户](https://developer.apple.com/)
+ 用于 GitHub 存储证书的私有存储库
+ 在您的项目中安装的 fastlane - fastlane 安装[指南](https://docs.fastlane.tools/getting-started/ios/setup/)

## 第 1 步：在本地计算机 GitHub 上设置 Fastlane Match with
<a name="sample-fastlane-github-certificates"></a>

[Fastlane Match ](https://docs.fastlane.tools/actions/match/) 是 [ Fastlane 工具之一](https://fastlane.tools/)，它允许在本地开发环境和其他环境中无缝配置代码签名。 CodeBuildFastlane Match 将您的所有代码签名证书和配置文件存储在 Git repository/S3 Bucket/Google 云存储中，并在需要时下载和安装必要的证书和配置文件。

在此示例配置中，我们设置并使用 Git 存储库进行存储。

1. 在项目中初始化匹配：

   ```
   fastlane match init
   ```

1. 出现提示时，选择 GitHub 作为存储模式。

1. 更新你的 `*Match * file`以使用 GitHub：

   ```
   git_url("https://github.com/your-username/your-certificate-repo.git")
   storage_mode("git")
   type("development") # The default type, can be: appstore, adhoc, enterprise or development
   ```

**注意**  
请务必输入 Git 存储库的 HTTPS URL，以便 fastlane 成功进行身份验证和克隆。否则，当您尝试使用匹配时，可能会看到身份验证错误。

## 步骤 2：设置 Fastfile
<a name="sample-fastlane-github-fastfile"></a>

使用以下通道创建或更新您的“Fastfile”。

开启 CodeBuild，每次构建和签署应用程序时都需要运行 Fastlane Match。执行此操作的最简单方法是将 `match` 操作添加到构建应用程序的通道中。

```
default_platform(:ios)

platform :ios do
  before_all do
    setup_ci
  end
  
  desc "Build and sign the app"
  lane :build do
    match(type: "appstore", readonly: true)
    gym(
      scheme: "YourScheme",
      export_method: "app-store"
    )
  end
end
```

**注意**  
请务必将 `setup_ci` 添加至 `Fastfile` 中的 `before_all ` 部分，以使匹配操作正常运行。这样可以确保使用具有适当权限的临时 Fastlane 密钥链。如果不使用它，您可能会看到构建失败或结果不一致。

## 第 3 步：运行 `fastlane` match 命令以生成相应的证书和配置文件
<a name="sample-fastlane-github-certificates"></a>

给定类型（即开发、应用商店、临时、企业）的 fastlane match 命令将生成证书和配置文件（如果远程存储中未提供）。证书和配置文件将 GitHub 由 fastlane 存储在。

```
bundle exec fastlane match appstore
```

命令执行将是交互式的，fastlane 将要求设置密码短语来解密证书。

## 步骤 4：为项目创建应用程序文件
<a name="sample-fastlane-github-appfile"></a>

根据项目的需要创建或添加应用程序文件。

1. 根据项目构建要求创建或添加 [Gymfile](http://docs.fastlane.tools/actions/gym/#gymfile)、[Appfile](http://docs.fastlane.tools/advanced/Appfile/)、[Snapfile](http://docs.fastlane.tools/actions/snapshot/#snapfile)、[Deliverfile](http://docs.fastlane.tools/actions/deliver/#editing-the-deliverfile)。

1. 将更改提交到远程存储库。

## 步骤 5：在 Secrets Manager 中创建环境变量
<a name="sample-fastlane-github-secrets"></a>

创建三个用于存储 fastlane 会话 cookie 和匹配密码短语的密钥。有关在 Secrets Manager 中创建密钥的更多信息，请参阅[创建 Amazon Secrets Manager 密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/create_secret.html)。

1. 按如下方式访问 fastlane 会话 cookie。

   1. 秘密密钥：`FASTLANE_SESSION`

   1. 密钥值：在本地计算机上运行以下命令时生成的会话 cookie。
**注意**  
完成身份验证后，此值会保存在本地文件 `~/.fastlane/spaceship/my_appleid_username/cookie` 中。

      ```
      fastlane spaceauth -u <Apple_account>
      ```

1. Fastlane 匹配密码-要使 Fastlane Match 能够解密存储在 Git 存储库中的证书和配置文件，必须将您在匹配设置步骤中配置的加密密码添加到项目的环境变量中。 CodeBuild 

   1. 秘密密钥：`MATCH_PASSWORD`

   1. 密钥值：`<match passphrase to decrypt certificates>`。密码短语是在步骤 3 中生成证书时设置的。

1. Fastlane `MATCH_GIT_BASIC_AUTHORIZATION`：为*匹配*设置基本授权：

   1. 秘密密钥：

      `MATCH_GIT_BASIC_AUTHORIZATION`

   1. 密钥值：该值应是您的用户名和个人访问令牌（PAT）的 base64 编码字符串，格式为 `username:password`。您可以使用以下命令生成它：

      ```
      echo -n {{your_github_username}}:{{your_personal_access_token}} | base64
      ```

      您可以在 GitHub 控制台上的 “我的个人资料” > “设置” > “开发者设置” > “个人访问令牌” 中**生成 PAT **。有关更多信息，请参阅以下指南：[https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)。

**注意**  
在 Secrets Manager 中创建上述密钥时，请记得提供一个带有以下前缀的密钥名称：`/CodeBuild/`

## 步骤 6：创建计算实例集
<a name="sample-fastlane-github-fleet"></a>

为您的项目创建计算实例集。

1. 在控制台中，转到 CodeBuild 并创建新的计算队列。

1. 选择 `macOS` 作为操作系统，然后选择适当的计算类型和映像。

## 步骤 7：在中创建项目 CodeBuild
<a name="sample-fastlane-github-project"></a>

在中创建您的项目 CodeBuild。

1. 在处打开 Amazon CodeBuild 控制台[https://console.aws.amazon.com/codesuite/codebuild/home](https://console.amazonaws.cn/codesuite/codebuild/home)。

1. 创建构建项目。有关信息，请参阅[创建构建项目（控制台）](create-project.md#create-project-console)和[运行构建（控制台）](run-build-console.md)。

1. 设置您的源提供商（例如 GitHub、 CodeCommit）。这是 iOS 项目源存储库，而不是证书存储库。

1.  在**环境**中：
   + 选择**预留容量**。
   + 对于**实例集**，选择上面创建的实例集。
   + 提供 CodeBuild 将为您创建的服务角色的名称。
   + 提供以下环境变量。
     + 名称:`MATCH_PASSWORD`，值：{{<secrets arn>}}，类型：密钥管理器（在步骤 5 中为 MATCH\_PASSWORD 创建的密钥 ARN）
     + 名称:`FASTLANE_SESSION`，值：{{<secrets arn>}}，类型：密钥管理器（在步骤 5 中为 FASTLANE\_SESSION 创建的密钥 ARN）
     + 名称:`MATCH_GIT_BASIC_AUTHORIZATION`，值：{{<secrets ARN>}}，类型：密钥管理器密钥 ARN（在步骤 5 中创建）`MATCH_GIT_BASIC_AUTHORIZATION`

1. 在 **Buildspec** 中，添加以下内容：

   ```
   version: 0.2
   
   phases:
     install:
       commands:
         - gem install bundler
         - bundle install
     build:
       commands:
         - echo "Building and signing the app..."
         - bundle exec fastlane build
     post_build:
       commands:
         - echo "Build completed on date"
   
   artifacts:
     files:
       - '*/.ipa'
     name: app-$(date +%Y-%m-%d)
   ```

## 第 8 步：运行构建
<a name="sample-fastlane-github-run"></a>

运行构建。您可以查看构建状态并登录 CodeBuild。

作业完成后，您将能够查看该作业的日志。

## 问题排查
<a name="sample-fastlane-github-troubleshooting"></a>
+ 如果您在访问 GitHub 存储库时遇到问题，请仔细检查您的个人访问令牌和 MATCH\_GIT\_BASIC\_AUTHORIZATION 环境变量。
+ 如果您在证书解密时遇到问题，请确保在 MATCH\_PASSWORD 环境变量中设置了正确的密码短语。
+ 对于代码签名问题，请验证您的 Apple 开发人员账户是否具有必要的证书和配置文件，并且 Xcode 项目中的捆绑包标识符是否与预调配配置文件中的捆绑包标识符匹配。

## 安全注意事项
<a name="sample-fastlane-github-considerations"></a>

以下是本教程的安全注意事项。
+ 将您的证书 GitHub 存储库保密，并定期审核访问权限。
+ 考虑使用来 Amazon Secrets Manager 存储 MATCH\_PASSWORD 和 FASTLANE\_SESSION 等敏感信息。

此示例提供了 CodeBuild 使用 GitHub Fastlane 进行证书存储的 iOS 代码签名的设置。您可能需要根据您的特定项目要求和 CodeBuild 环境调整一些步骤。这种方法利用 Amazon 服务来增强安全性和 Amazon 生态系统内的集成。