

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

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

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

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

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

## 步骤 1：在本地计算机上使用 S3 设置 Fastlane Match
<a name="sample-fastlane-S3"></a>

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

在此示例配置中，您将设置并使用 Amazon S3 存储桶进行存储。

****

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

   ```
   fastlane match init
   ```

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

1. 更新“*Matchfile*”以使用 S3：

   ```
   storage_mode("s3")
      s3_bucket("your-s3-bucket-name")
      s3_region("your-aws-region")
      type("appstore") # The default type, can be: appstore, adhoc, enterprise or development
   ```

## 步骤 2：设置 Fastfile
<a name="sample-fastlane-S3-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-S3-certificates"></a>

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

```
bundle exec fastlane match appstore
```

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

## 步骤 4：为项目创建应用程序文件
<a name="sample-fastlane-S3-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-S3-secrets"></a>

创建两个用于存储 fastlane 会话 cookie 和匹配密码短语的密钥。有关在 Secrets Manager 中创建密钥的更多信息，请参阅[创建 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/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 Match 密码短语-要使 Fastlane Match 能够解密存储在 S3 存储桶中的证书和配置文件，必须将您在匹配设置步骤中配置的加密密码添加到项目的环境变量中。 CodeBuild

   1. 秘密密钥：`MATCH_PASSWORD`

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

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

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

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

****

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

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

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

在中创建您的项目 CodeBuild。



****

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

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

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

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

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：配置 IAM 角色
<a name="sample-fastlane-S3-role"></a>

创建项目后，请确保 CodeBuild 项目的服务角色有权访问包含证书的 S3 存储桶。将下面的策略附加到该角色：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::your-s3-bucket-name"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::your-s3-bucket-name/*"
        }
    ]
}
```

------

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

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

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

## 问题排查
<a name="sample-fastlane-S3-troubleshooting"></a>
+ 如果您在获取证书时遇到问题，请确保您的 IAM 权限设置正确，以便能够访问 S3。
+ 如果您在证书解密时遇到问题，请确保在 MATCH\$1PASSWORD 环境变量中设置了正确的密码短语。
+ 对于代码签名问题，请验证您的 Apple 开发人员账户是否具有必要的证书和配置文件，并且 Xcode 项目中的捆绑包标识符是否与预调配配置文件中的捆绑包标识符匹配。

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

以下是本教程的安全注意事项。
+ 确保您的 S3 存储桶具有适当的安全设置，包括静态加密。特别是，请确保存储桶没有公共访问权限， CodeBuild 并限制仅访问需要访问权限的系统。
+ 考虑使用来存储敏感信息 AWS Secrets Manager ，例如 MATCH\$1PASSWORD 和 FASTLANE\$1SESSION。

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