

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

# 教學課程：建立使用 建置和測試 Android 應用程式的管道 AWS Device Farm
<a name="tutorials-codebuild-devicefarm"></a>

您可以使用 AWS CodePipeline 來設定持續整合流程，在每次推送遞交時，在其中建置和測試您的應用程式。本教學會示範如何建立及設定管道，使用 GitHub 儲存庫中的來源碼建置及測試您的 Android 應用程式。管道會偵測新 GitHub 遞交的到達，然後使用 [CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 建置應用程式和 [Device Farm](https://docs.aws.amazon.com/devicefarm/latest/developerguide/welcome.html) 進行測試。

**重要**  
在主控台中建立管道時，CodePipeline 將使用 S3 成品儲存貯體做為成品。（這與用於 S3 來源動作的 儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中，請確定 S3 成品儲存貯體由 所擁有 AWS 帳戶 ，安全且可靠。

**重要**  
您在此程序中新增至管道的許多動作都涉及您在建立管道之前需要建立 AWS 的資源。來源動作 AWS 的資源一律必須在您建立管道 AWS 的相同區域中建立。例如，如果您在美國東部 （俄亥俄） 區域建立管道，則 CodeCommit 儲存庫必須位於美國東部 （俄亥俄） 區域。  
您可以在建立管道時新增跨區域動作。跨區域動作 AWS 的資源必須位於您計劃執行動作的相同 AWS 區域中。如需詳細資訊，請參閱[在 CodePipeline 中新增跨區域動作](actions-create-cross-region.md)。

您可以使用現有的 Android 應用程式和測試定義來試用，也可以使用 [ Device Farm 提供的範例應用程式和測試定義](https://github.com/aws-samples/aws-device-farm-sample-app-for-android)。

**開始之前**

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 測試
<a name="codepipeline-configure-tests"></a>

1. 

   在應用程式程式碼的根[https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html)目錄中新增並遞交名為 的檔案，然後將其推送到您的儲存庫。CodeBuild 使用此檔案來執行建置應用程式所需的命令和存取成品。

   ```
   version: 0.2
   
   phases:
     build:
       commands:
         - chmod +x ./gradlew
         - ./gradlew assembleDebug
   artifacts:
     files:
        - './android/app/build/outputs/**/*.apk'
     discard-paths: yes
   ```

1. (選擇性) 若您[使用 Calabash 或 Appium 測試您的應用程式](https://docs.aws.amazon.com/devicefarm/latest/developerguide/test-types-intro.html)，請將測試定義檔案新增至您的儲存庫。在後續步驟中，您可以將 Device Farm 設定為使用 定義來執行您的測試套件。

   如果您使用 Device Farm 內建測試，則可以略過此步驟。

1. 若要建立您的管道及新增來源階段，請執行下列作業：

   1. 登入 AWS 管理主控台 並開啟 CodePipeline 主控台，網址為 https：//[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

   1. 在 **Welcome (歡迎)** 頁面、**Getting started (入門)** 頁面、或者 **Pipelines (管道)** 頁面上，選擇 **Create pipeline (建立管道)**。

   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. 在 **Service role (服務角色)** 中，讓 **New service role (新服務角色)** 維持在選取狀態，然後讓 **Role name (角色名稱)** 維持不變。若您已擁有現有服務角色，您也可以選擇使用它。
**注意**  
如果您使用 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. 將 **Advanced settings (進階設定)** 下的設定保留為預設值，然後選擇 **Next (下一步)**。

   1. 在**步驟 3：新增來源階段**頁面的**來源提供者**中，選擇 **GitHub （透過 GitHub 應用程式）**。

   1. 在**連線**下，選擇現有的連線或建立新的連線。若要建立或管理 GitHub 來源動作的連線，請參閱 [GitHub 連線](connections-github.md)。

   1. 在 **​Repository (儲存庫)** 中，選擇來源儲存庫。

   1. 在 **​Branch (分支)** 中，選擇您希望使用的分支。

   1. 保留來源動作的其餘預設值。選擇**下一步**。

1. 在**步驟 4：新增建置階段**中，新增建置階段：

   1. 在**建置提供者**中，選擇**其他建置提供者**，然後選擇 **AWS CodeBuild**。允許 **Region (區域)** 預設為管道區域。

   1. 選擇**建立專案**。

   1. 在 **Project name (專案名稱)** 中，輸入此建置專案的名稱。

   1. 在 **Environment image (環境映像)** 中，選擇 **Managed image (受管映像)**。針對 **Operating system (作業系統)**，選擇 **Ubuntu**。

   1. 針對 **Runtime (執行時間)**，選擇 **Standard (標準)**。針對**映像**，選擇 **aws/codebuild/standard:5.0**。

      CodeBuild 使用此已安裝 Android Studio 的作業系統映像來建置您的應用程式。

   1. 針對**服務角色**，選擇現有的 CodeBuild 服務角色或建立新的角色。

   1. 對於 **Build specifications (建置規格)**，選擇 **Use a buildspec file (使用 buildspec 檔案)**。

   1. 選擇 **Continue to CodePipeline (繼續 CodePipeline)**。這會傳回 CodePipeline 主控台，並建立 CodeBuild 專案，使用儲存庫`buildspec.yml`中的 進行組態。建置專案使用服務角色來管理 AWS 服務 許可。此步驟可能需要數分鐘。

   1. 選擇**下一步**。

1. 在**步驟 5：新增測試階段**中，選擇**略過測試階段**，然後再次選擇**略過**以接受警告訊息。

   選擇**下一步**。

1. 在**步驟 6：新增部署階段**頁面上，選擇**略過部署階段**，然後再次選擇**略過**以接受警告訊息。選擇**下一步**。

1. 在**步驟 7：檢閱**中，選擇**建立管道**。您應該會看到圖表，顯示該來源及建置階段。

1. 將 Device Farm 測試動作新增至管道：

   1. 在右上角，選擇 **Edit (編輯)**。

   1. 在圖表的底部，選擇 **\$1 Add stage (\$1 新增階段)**。在 **Stage name (階段名稱)** 中，輸入名稱，例如 **Test**。

   1. 選擇 **\$1 Add action group (\$1 新增動作群組)**。

   1. 在 **​Action name (動作名稱)** 中，輸入名稱。

   1. 在**動作提供者**中，選擇 **AWS Device Farm**。允許 **Region (區域)** 預設為管道區域。

   1. 在 ​**Input artifacts (輸入成品)** 中，選擇與測試階段之前的階段輸出成品相符的輸入成品，例如 `BuildArtifact`。

      在 AWS CodePipeline 主控台中，將滑鼠暫留在管道圖表中的資訊圖示上，即可找到每個階段的輸出成品名稱。若您的管道是從 **​Source (來源)** 階段直接測試您的應用程式，請選擇 **​SourceArtifact**​。若管道包含 **​Build (建置)** 階段，請選擇 **​BuildArtifact**。

   1. 在 **ProjectId** 中，輸入您的 Device Farm 專案 ID。使用本教學課程開頭的步驟，擷取您的專案 ID。

   1. 在 **DevicePoolArn** 中，輸入裝置集區的 ARN。若要取得專案可用的裝置集區 ARNs，包括熱門裝置的 ARN，請使用 AWS CLI 輸入下列命令：

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

   1. 在 **AppType** 中，輸入 **Android**。

      以下是 **AppType** 的有效值清單：
      + **iOS**
      + **Android**
      + **Web**

   1. 在 **​App (應用程式)** 中，輸入已編譯的應用程式套件路徑。路徑為相對於測試階段輸入成品根的相對路徑。通常，此路徑與 `app-release.apk` 相似。

   1. 在 **TestType** 中，輸入您的測試類型，然後在 **Test** 中，輸入測試定義檔案的路徑。路徑為相對於您測試輸入成品根的相對路徑。

      以下是 **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. (選擇性) 在 **Advanced (進階)** 中，提供您測試執行的組態資訊。

   1. 選擇**儲存**。

   1. 在您編輯的階段上，選擇 **Done (完成)**。在 AWS CodePipeline 窗格中，選擇 **Save (儲存)**，然後在警告訊息中選擇 **Save (儲存)**。

   1. 若要提交您的變更並啟動管道建置，請選擇 **​Release change (發行變更)**，然後選擇 **​Release (發行)**。