

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

# 教程：创建用于测试你的 iOS 应用的管道 AWS Device Farm
<a name="tutorials-codebuild-devicefarm-S3"></a>

 您可以使用 AWS CodePipeline 来轻松配置持续集成流程，每次源存储桶更改时，都会在该流程中测试您的应用程序。本教程介绍如何创建和配置管道以测试从 S3 存储桶中构建的 iOS 应用程序。该管道通过 Amazon CloudWatch Events 检测已保存更改的到来，然后使用 De [vice Farm](https://docs.aws.amazon.com/devicefarm/latest/developerguide/welcome.html) 来测试构建的应用程序。

**重要**  
作为创建管道的一部分，客户提供的 S3 工件存储桶将 CodePipeline 用于项目。（这与用于 S3 源操作的存储桶不同。） 如果 S3 工件存储桶与您的管道账户位于不同的账户中，请确保 S3 工件存储桶归其所有 AWS 账户 ，该存储桶是安全且可靠的。

**重要**  
在此过程中，您在管道中添加的许多操作都涉及在创建管道之前需要创建的 AWS 资源。 AWS 源操作的资源必须始终在您创建管道的同一 AWS 区域创建。例如，如果您在美国东部（俄亥俄州）地区创建管道，则您的 CodeCommit 存储库必须位于美国东部（俄亥俄州）区域。  
您可以在创建管道时添加跨区域操作。 AWS 跨区域操作的资源必须位于您计划执行操作的同一 AWS 区域。有关更多信息，请参阅 [在中添加跨区域操作 CodePipeline](actions-create-cross-region.md)。

您可以使用现有的 iOS 应用程序或使用[示例 iOS 应用程序](samples/s3-ios-test-1.zip)进行此测试。

**开始之前**

1. 登录 AWS Device Farm 控制台并选择 “**创建新项目**”。

1. 选择您的项目。在浏览器中，复制新项目的 URL。URL 包含项目 ID。

1. 复制并保留此项目 ID。在 CodePipeline 中创建管道时要使用它。

   以下是项目的示例 URL。要提取项目 ID，请复制 `projects/` 之后的值。在此示例中，项目 ID 为 `eec4905f-98f8-40aa-9afc-4c1cfexample`。

   ```
   https://<region-URL>/devicefarm/home?region=us-west-2#/projects/eec4905f-98f8-40aa-9afc-4c1cfexample/runs
   ```

## 配置 CodePipeline 为使用您的 Device Farm 测试（Amazon S3 示例）
<a name="codepipeline-configure-tests-S3"></a>

1. 创建或使用已启用版本控制的 S3 存储桶。按照[步骤 1：为您的应用程序创建一个 S3 源存储桶](tutorials-simple-s3.md#s3-create-s3-bucket)中的说明创建 S3 存储桶。

1. 在桶的 Amazon S3 控制台中，选择**上传**，然后按照说明上传 .zip 文件。

   您的示例应用程序必须打包在 .zip 文件中。

1. 要创建管道并添加一个源阶段，请执行以下操作：

   1. 登录 AWS 管理控制台 并打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

   1. 在**欢迎**页面、**入门**页面或**管道**页面上，选择**创建管道**。

   1. 在**步骤 1：选择创建选项**页面上的**创建选项**下，选择**构建自定义管道**选项。选择**下一步**。

   1. 在**步骤 2：选择管道设置**页面上，在**管道名称**中，输入管道的名称。

   1. CodePipeline 提供 V1 和 V2 类型的管道，它们的特性和价格各不相同。在控制台中，您只能选择 V2 类型。有关更多信息，请参阅[管道类型](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)。有关定价的信息 CodePipeline，请参阅[定价](https://aws.amazon.com/codepipeline/pricing/)。

   1. 在**服务角色**中，将**新建服务角色**保持选中状态，并将**角色名称**保持不变。您还可以选择使用现有服务角色（如果已有）。
**注意**  
如果您使用在 2018 年 7 月之前创建的 CodePipeline 服务角色，则必须为 Device Farm 添加权限。要执行此操作，请打开 IAM 控制台，找到该角色，然后向该角色的策略添加以下权限。有关更多信息，请参阅 [为 CodePipeline 服务角色添加权限](how-to-custom-role.md#how-to-update-role-new-services)。  

      ```
      {
           "Effect": "Allow",
           "Action": [
              "devicefarm:ListProjects",
              "devicefarm:ListDevicePools",
              "devicefarm:GetRun",
              "devicefarm:GetUpload",
              "devicefarm:CreateUpload",
              "devicefarm:ScheduleRun"
           ],
           "Resource": "*"
      }
      ```

   1. 将**高级设置**中的各项设置保留为默认值，然后选择**下一步**。

   1. 在**步骤 3：添加源阶段**页面上，在**源提供程序**中，选择 **Amazon S3**。

   1. 在 **Amazon S3 位置**中，输入 .zip 文件的桶（例如 `my-storage-bucket`）和对象键（例如 `s3-ios-test-1.zip`）。

   1. 选择**下一步**。

1. 在**步骤 4：添加构建阶段**中，为管道创建一个占位符构建阶段。这样，可以在向导中创建管道。在使用向导创建两阶段管道后，将不再需要此占位符生成阶段。完成该管道后，将在步骤 5 中删除第二个阶段并添加新的测试阶段。

   

   1. 在**构建提供程序**中，选择**添加 Jenkins**。此生成选择是一个占位符。不会使用。

   1. 在**提供商名称**中输入名称。该名称是一个占位符。不会使用。

   1. 在**服务器 URL** 中输入文本。该文本是一个占位符。不会使用。

   1. 在**项目名称**中输入名称。该名称是一个占位符。不会使用。

   1. 选择**下一步**。

   1. 在**步骤 5：添加测试阶段**中，选择**跳过测试阶段**，并通过再次选择**跳过**接受警告消息。

      选择**下一步**。

   1. 在 “**步骤 6：添加部署阶段**” 页上，选择 “**跳过部署阶段**”，然后再次选择 “**跳过**”，接受警告消息。

   1. 在 “**步骤 7：查看**” 中，选择 “**创建管道**”。您应看到一个显示源和构建阶段的示意图。  
![\[\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/codepipeline-view-pipeline-S3.png)

1. 将 Device Farm 测试操作添加到管道，如下所述：

   1. 在右上角，选择**编辑**。

   1. 选择**编辑阶段**。选择**删除**。此操作将删除不再需要用于管道创建的占位符阶段。

   1. 在示意图底部，选择 **\$1 添加阶段**。

   1. 在“阶段名称”中，输入阶段名称，例如“测试”，然后选择**添加阶段**。

   1. 选择 **\$1 添加操作组**。

   1. 在**操作名称**中，输入一个名称，例如 DeviceFarmTest。

   1. 在**操作提供程序**中，选择 **AWS Device Farm**。允许**区域**默认为管道区域。

   1. 在**输入构件**中，选择与测试阶段之前的那个阶段的输出构件相匹配的输入构件，例如 `SourceArtifact`。

      在 AWS CodePipeline 控制台中，将鼠标悬停在管道图中的信息图标上，可以找到每个阶段的输出工件的名称。如果您的管道直接从 S **ourc** e 阶段测试您的应用程序，请选择**SourceArtifact**。如果管道包含 “构**建**” 阶段，请选择**BuildArtifact**。

   1. 在中 **ProjectId**，选择您的 Device Farm 项目 ID。使用本教程开头的步骤来检索您的项目 ID。

   1. 在中 **DevicePoolArn**，输入设备池的 ARN。要获取项目的可用设备池 ARNs ，包括热门设备的 ARN，请使用 CL AWS I 输入以下命令：

      ```
      aws devicefarm list-device-pools --arn arn:aws:devicefarm:us-west-2:account_ID:project:project_ID
      ```

   1. 在中 **AppType**，输入 **iOS**。

      以下是 **AppType** 的有效值列表：
      + **iOS**
      + **Android**
      + **Web**

   1. 在 **App** 中，输入已编译的应用程序包的路径。该路径相对于测试阶段的输入构件的根。通常，此路径类似于 `ios-test.ipa`。

   1. 在中 **TestType**，输入您的测试类型，然后在**测试**中输入测试定义文件的路径。路径相对于测试的输入项目的根。

      如果您正在使用其中一个 Device Farm 内置测试，请输入 Device Farm 项目中配置的测试类型，例如 BUILTIN\$1FUZZ。在中 **FuzzEventCount**，输入以毫秒为单位的时间，例如 6000。在中 **FuzzEventThrottle**，输入以毫秒为单位的时间，例如 50。

      如果没有使用其中一个 Device Farm 内置测试，请选择测试类型，然后在**测试**中输入测试定义文件的路径。路径相对于测试的输入项目的根。

      以下是 **TestType** 的有效值列表：
      + **APPIUM\$1JAVA\$1JUNIT**
      + **APPIUM\$1JAVA\$1TESTNG**
      + **APPIUM\$1NODE**
      + **APPIUM\$1RUBY**
      + **APPIUM\$1PYTHON**
      + **APPIUM\$1WEB\$1JAVA\$1JUNIT**
      + **APPIUM\$1WEB\$1JAVA\$1TESTNG**
      + **APPIUM\$1WEB\$1NODE**
      + **APPIUM\$1WEB\$1RUBY**
      + **APPIUM\$1WEB\$1PYTHON**
      + **BUILTIN\$1FUZZ**
      + **INSTRUMENTATION**
      + **XCTEST**
      + **XCTEST\$1UI**
**注意**  
不支持自定义环境节点。

   1. 在其余字段中，提供适合测试和应用程序类型的配置。

   1. （可选）在**高级**中，为测试运行提供配置信息。

   1. 选择**保存**。

   1. 在所编辑的阶段上，选择**完成**。在 AWS CodePipeline 窗格中，选择**保存**，然后选择警告消息上的**保存**。

   1. 要提交所做的更改并开始管道执行，请选择**发布更改**，然后选择**发布**。