

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 教學課程：使用 S3 進行憑證儲存的 CodeBuild 中使用 Fastlane 簽署 Apple 程式碼
<a name="sample-fastlane"></a>

[fastlane](https://docs.fastlane.tools/) 是熱門的開放原始碼自動化工具，可自動化 iOS 和 Android 應用程式的 Beta 版部署和版本。它會處理所有繁瑣的任務，例如產生螢幕擷取畫面、處理程式碼簽署，以及釋出您的應用程式。

## 先決條件
<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/)之一，允許在您的本機開發環境和 CodeBuild 上進行程式碼簽署的無縫組態。Fastlane Match 會將所有程式碼簽署憑證和佈建設定檔存放在 Git 儲存庫/S3 儲存貯體/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`將 新增至 中的 `before_all `區段，`Fastfile`配對動作才能正常運作。這可確保使用具有適當許可的暫時 Fastlane 金鑰鏈。如果不使用此功能，您可能會看到建置失敗或結果不一致。



## 步驟 3：執行 `fastlane match`命令來產生個別的憑證和設定檔
<a name="sample-fastlane-S3-certificates"></a>

指定類型 （即開發、應用程式存放區、臨機操作、企業） 的 fastlane 比對命令會在遠端存放區中無法使用時產生憑證和設定檔。憑證和設定檔將由 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. 秘密值 - *<配對密碼短語以解密憑證>*。在步驟 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：//[https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 開啟 AWS CodeBuild 主控台。

1. 建立建置專案。如需詳細資訊，請參閱 [建立組建專案 (主控台)](create-project.md#create-project-console) 及 [執行建置 (主控台)](run-build-console.md)。

1. 設定您的來源提供者 （例如 GitHub、CodeCommit)。這是 iOS 專案來源儲存庫，而不是憑證儲存庫。

1.  在 **Environment (環境)** 中：
   + 選擇**預留容量**。
   + 針對**機群**，選取上面建立的機群。
   + 提供 CodeBuild 為您建立的服務角色名稱。
   + 提供下列環境變數。
     + 名稱：`MATCH_PASSWORD`、值：*<secrets arn>*、類型：Secrets Manager （在步驟 5 中為 MATCH\$1PASSWORD 建立的秘密 ARN)
     + 名稱：`FASTLANE_SESSION`、值：*<secrets arn>*、類型：Secrets Manager （在步驟 5 中為 FASTLANE\$1SESSION 建立的秘密 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。

此範例提供使用 Amazon S3 進行憑證儲存的 CodeBuild 中 Fastlane 的 iOS 程式碼簽署設定。您可能需要根據您的特定專案需求和 CodeBuild 環境來調整一些步驟。此方法利用 AWS 服務在 AWS 生態系統中增強安全性和整合。