

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

# CodeBuild 入門
<a name="getting-started-overview"></a>

在以下教學課程中，您會使用 AWS CodeBuild 將範例原始程式碼輸入檔案的集合建置到可部署版本的原始程式碼。

這兩個教學課程都有相同的輸入和結果，但其中一個使用 AWS CodeBuild 主控台，另一個則使用 AWS CLI。

**重要**  
我們不建議您使用 AWS 根帳戶來完成本教學課程。

**Topics**
+ [

## AWS CodeBuild 開始使用 主控台
](#getting-started)
+ [

## AWS CodeBuild 開始使用 AWS CLI
](#getting-started-cli)

## AWS CodeBuild 開始使用 主控台
<a name="getting-started"></a>

在本教學課程中，您會使用 AWS CodeBuild 將範例原始碼輸入檔案集合 (*建置輸入成品*或*建置輸入*) 建置為原始碼的可部署版本 (*建置輸出成品*或*建置輸出*)。具體而言，您會指示 CodeBuild 使用常見的建置工具 Apache Maven，將一組 Java 類別檔案建置至 Java Archive (JAR) 檔案。您不需要熟悉 Apache Maven 或 Java，也能完成本教學課程。

您可以透過 CodeBuild 主控台 AWS CodePipeline、 AWS CLI或 AWS SDKs 使用 CodeBuild。本教學課程示範如何使用 CodeBuild 主控台。如需使用 CodePipeline 的詳細資訊，請參閱 [搭配 CodePipeline 使用 CodeBuild CodePipeline](how-to-create-pipeline.md)。

**重要**  
本教學中的步驟要求您建立資源 （例如 S3 儲存貯體），這可能會導致 AWS 您的帳戶產生費用。這包括 CodeBuild 和與 Amazon S3 相關的 AWS 資源和動作 AWS KMS，以及 CloudWatch Logs 的可能費用。如需詳細資訊，請參閱 [AWS CodeBuild 定價](https://aws.amazon.com/codebuild/pricing)、[Amazon S3 定價](https://aws.amazon.com/s3/pricing)、[AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing)和 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing)。

**Topics**
+ [

### 步驟 1：建立原始程式碼
](#getting-started-create-source-code-console)
+ [

### 步驟 2：建立 buildspec 檔案
](#getting-started-create-build-spec-console)
+ [

### 步驟 3：建立兩個 S3 儲存貯體
](#getting-started-input-bucket-console)
+ [

### 步驟 4：上傳原始程式碼和 Buildspec 檔案
](#getting-started-upload-source-code-console)
+ [

### 步驟 5：建立建置專案
](#getting-started-create-build-project-console)
+ [

### 步驟 6：執行建置
](#getting-started-run-build-console)
+ [

### 步驟 7：檢視摘要建置資訊
](#getting-started-monitor-build-console)
+ [

### 步驟 8：檢視詳細建置資訊
](#getting-started-build-log-console)
+ [

### 步驟 9：取得建置輸出成品
](#getting-started-output-console)
+ [

### 步驟 10：刪除 S3 儲存貯體
](#getting-started-clean-up-console)
+ [

### 包裝
](#getting-started-next-steps-console)

### 步驟 1：建立原始程式碼
<a name="getting-started-create-source-code-console"></a>

(部分：[AWS CodeBuild 開始使用 主控台](#getting-started))

在此步驟中，您會建立您希望 CodeBuild 建置到輸出儲存貯體的原始程式碼。此來源碼由兩個 Java 類別檔案及一個 Apache Maven Project Object Model (POM) 檔案組成。

1. 在您本機電腦或執行個體上的空目錄內，建立此目錄結構。

   ```
   (root directory name)
       `-- src
            |-- main
            |     `-- java
            `-- test
                  `-- java
   ```

1. 使用您選擇的文字編輯器建立此檔案，將它命名為 `MessageUtil.java`，然後將它儲存在 `src/main/java` 目錄中。

   ```
   public class MessageUtil {
     private String message;
   
     public MessageUtil(String message) {
       this.message = message;
     }
   
     public String printMessage() {
       System.out.println(message);
       return message;
     }
   
     public String salutationMessage() {
       message = "Hi!" + message;
       System.out.println(message);
       return message;
     }
   }
   ```

   此類別檔案會將傳遞給它的字元字串做為輸出建立。`MessageUtil` 建構函數會設定字元字串。`printMessage` 方法會建立輸出。`salutationMessage` 方法會輸出 `Hi!`，其後跟隨字元字串。

1. 建立此檔案，將它命名為 `TestMessageUtil.java`，然後將它儲存在 `/src/test/java` 目錄中。

   ```
   import org.junit.Test;
   import org.junit.Ignore;
   import static org.junit.Assert.assertEquals;
   
   public class TestMessageUtil {
   
     String message = "Robert";    
     MessageUtil messageUtil = new MessageUtil(message);
      
     @Test
     public void testPrintMessage() {      
       System.out.println("Inside testPrintMessage()");     
       assertEquals(message,messageUtil.printMessage());
     }
   
     @Test
     public void testSalutationMessage() {
       System.out.println("Inside testSalutationMessage()");
       message = "Hi!" + "Robert";
       assertEquals(message,messageUtil.salutationMessage());
     }
   }
   ```

   此類別檔案會將 `MessageUtil` 類別中的 `message` 變數設為 `Robert`。它接著會透過檢查 `Robert` 和 `Hi!Robert` 字串是否出現在輸出中，來測試 `message` 變數是否設定成功。

1. 建立此檔案，將它命名為 `pom.xml`，然後將它儲存在根 (最上層) 目錄中。

   ```
   <project xmlns="http://maven.apache.org/POM/4.0.0" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.example</groupId>
     <artifactId>messageUtil</artifactId>
     <version>1.0</version>
     <packaging>jar</packaging>
     <name>Message Utility Java Sample App</name>
     <dependencies>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
         <scope>test</scope>
       </dependency>	
     </dependencies>
     <build>
       <plugins>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.8.0</version>
         </plugin>
       </plugins>
     </build>
   </project>
   ```

   Apache Maven 會使用此檔案中的說明，將 `MessageUtil.java` 和 `TestMessageUtil.java` 轉換成名為 `messageUtil-1.0.jar` 的檔案，然後執行指定的測試。

此時您的目錄結構看起來應該會如下。

```
(root directory name)
    |-- pom.xml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java
```

### 步驟 2：建立 buildspec 檔案
<a name="getting-started-create-build-spec-console"></a>

(上一個步驟：[步驟 1：建立原始程式碼](#getting-started-create-source-code-console))

在此步驟中，您會建立組建規格 (build spec) 檔案。*buildspec* 是組建命令和相關設定的集合，採用 YAML 格式，可供 CodeBuild 用來執行組建。如果沒有組建規格，CodeBuild 無法成功將您的組建輸入轉換為組建輸出，或在組建環境中尋找組建輸出成品，以上傳至您的輸出儲存貯體。

建立此檔案，將它命名為 `buildspec.yml`，然後將它儲存在根 (最上層) 目錄中。

```
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on `date`
      - mvn install
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - target/messageUtil-1.0.jar
```

**重要**  
因為建置規格宣告必須為有效的 YAML，因此建置規格宣告中的間距相當重要。若您建置規格宣告中的空格數與此不符，建置會立即失敗。您可以使用 YAML 驗證程式測試您的建置規格宣告是否為有效的 YAML。

**注意**  
您可以在建立建置專案時分別宣告建置命令，而非在您的來源碼中包含建置規格檔案。這在您希望使用不同建置命令建置來源碼，卻又不想要每次都更新您來源碼的儲存庫時會非常有用。如需詳細資訊，請參閱[Buildspec 語法](build-spec-ref.md#build-spec-ref-syntax)。

在此建置規格宣告中：
+ `version` 代表要使用的建置規格標準版本。此建置規格宣告使用最新版本，`0.2`。
+ `phases` 代表建置階段，您可以在其中指示 CodeBuild 執行命令。這些組建階段會在此以 `install`、`pre_build`、`build` 和 `post_build` 的形式列出。您無法變更這些組建階段名稱的拼字，也無法建立更多組建階段名稱。

  在此範例中，在 `build`階段期間，CodeBuild 會執行 `mvn install`命令。此命令會指示 Apache Maven 編譯、測試，並將編譯過的 Java 類別檔案封裝到建置輸出成品中。為求完整，此範例中的每個建置階段內都置放了一些 `echo` 命令。當您稍後在本教學中檢視詳細的建置資訊時，這些`echo`命令的輸出可協助您更加了解 CodeBuild 如何執行命令，以及執行順序。(雖然此範例中包含了所有組建階段，但若您不需要在其中一個階段執行任何命令，則可不必包含該組建階段。) 對於每個建置階段，CodeBuild 會依列出的順序從頭到尾執行每個指定的命令。
+ `artifacts` 代表 CodeBuild 上傳到輸出儲存貯體的組建輸出成品。 `files`代表要包含在組建輸出中的檔案。CodeBuild 會上傳建置環境中`target`相對目錄中找到的單一`messageUtil-1.0.jar`檔案。檔案名稱 (`messageUtil-1.0.jar`) 及目錄名稱 (`target`) 是以 Apache Maven 建立及存放組建輸出成品的方式為基礎，僅適用於此範例。在您自己的組建中，檔案名稱及目錄可能會有所不同。

如需更多資訊，請參閱[Buildspec 參考](build-spec-ref.md)。

此時您的目錄結構看起來應該會如下。

```
(root directory name)
    |-- pom.xml
    |-- buildspec.yml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java
```

### 步驟 3：建立兩個 S3 儲存貯體
<a name="getting-started-input-bucket-console"></a>

(上一個步驟：[步驟 2：建立 buildspec 檔案](#getting-started-create-build-spec-console))

雖然您可以在本教學課程中使用單一儲存貯體，但是使用兩個儲存貯體可讓查看組建輸入來源和組建輸出目標的過程變得更為簡單。
+ 其中一個儲存貯體 (*輸入儲存貯體*) 會儲存組建輸入。在本教學課程中，此輸入儲存貯體的名稱為 `codebuild-region-ID-account-ID-input-bucket`，其中 *region-ID* 是儲存貯 AWS 體的區域，而 *account-ID* 是 AWS 您的帳戶 ID。
+ 另一個儲存貯體 (*輸出儲存貯體*) 則會儲存組建輸出。在本教學課程中，此輸出儲存貯體的名稱為 `codebuild-region-ID-account-ID-output-bucket`。

如果您為這些儲存貯體選擇了不同的名稱，請務必在本教學課程中使用它們。

這兩個儲存貯體必須與組建位於相同的 AWS 區域。例如，如果您指示 CodeBuild 在美國東部 （俄亥俄） 區域執行組建，這些儲存貯體也必須位於美國東部 （俄亥俄） 區域。

如需詳細資訊，請參閱 *Amazon Simple Storage Service 主控台使用者指南*中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)。

**注意**  
雖然 CodeBuild 也支援儲存在 CodeCommit、GitHub 和 Bitbucket 儲存庫中的建置輸入，但本教學課程不會向您展示如何使用它們。如需詳細資訊，請參閱[規劃組建](planning.md)。

### 步驟 4：上傳原始程式碼和 Buildspec 檔案
<a name="getting-started-upload-source-code-console"></a>

(上一個步驟：[步驟 3：建立兩個 S3 儲存貯體](#getting-started-input-bucket-console))

在此步驟中，您會將來源碼和組建規格檔案新增到輸入儲存貯體。

使用您作業系統的 zip 公用程式，建立名為 `MessageUtil.zip` 的檔案，其中包含 `MessageUtil.java`、`TestMessageUtil.java`、`pom.xml` 和 `buildspec.yml`。

`MessageUtil.zip` 檔案的目錄結構看起來必須如下。

```
MessageUtil.zip
    |-- pom.xml
    |-- buildspec.yml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java
```

**重要**  
請不要包含 `(root directory name)` 目錄，而是只有 `(root directory name)` 目錄中的目錄和檔案。

將 `MessageUtil.zip` 檔案上傳至名為 `codebuild-region-ID-account-ID-input-bucket` 的輸入儲存貯體。

**重要**  
對於 CodeCommit、GitHub 和 Bitbucket 儲存庫，根據慣例，您必須在每個儲存庫的根 （頂層） `buildspec.yml` 中存放名為 的組建規格檔案，或將組建規格宣告納入組建專案定義中。請不要建立包含儲存庫來源碼和建置規格檔案的 ZIP 檔案。  
(僅適用於存放在 S3 儲存貯體的建置輸入) 您必須建立 ZIP 檔案，其中包含來源碼，並且根據慣例，於根 (最上層) 包含名為 `buildspec.yml` 的建置規格檔案，或是將建置規格宣告其做為建置專案定義的一部分包含在其中。  
若您想要針對建置規格檔案使用不同的名稱，或是想要參考位於根以外其他位置的建置規格，您可以指定建置規格覆寫，做為建置專案定義的一部分。如需詳細資訊，請參閱[Buildspec 檔案名稱和儲存位置](build-spec-ref.md#build-spec-ref-name-storage)。

### 步驟 5：建立建置專案
<a name="getting-started-create-build-project-console"></a>

(上一個步驟：[步驟 4：上傳原始程式碼和 Buildspec 檔案](#getting-started-upload-source-code-console))

在此步驟中，您會建立使用 AWS CodeBuild 執行建置的建置專案。*建置專案*包含如何執行建置的相關資訊，包括取得原始程式碼的位置、要使用的建置環境、要執行的建置命令，以及儲存建置輸出的位置。*建置環境*代表作業系統、程式設計語言執行時間，以及 CodeBuild 用來執行建置之工具的組合。建置環境會以 Docker 影像表示。如需詳細資訊，請參閱 Docker Docs 網站上的 [Docker 概觀](https://docs.docker.com/get-started/overview/)主題。

在此建置環境中，您會指示 CodeBuild 使用包含 Java 開發套件 (JDK) 和 Apache Maven 版本的 Docker 映像。<a name="getting-started-create-build-project-console-procedure"></a>

**建立建置專案**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 開啟 AWS CodeBuild 主控台。

1. 使用 AWS 區域選擇器選擇支援 CodeBuild AWS 的區域。如需詳細資訊，請參閱 *Amazon Web Services 一般參考* 中的 [AWS CodeBuild 端點和配額](https://docs.aws.amazon.com/general/latest/gr/rande.html#codebuild_region)。

1.  如果顯示 CodeBuild 資訊頁面，請選擇**建立組建專案**。否則，請在導覽窗格中展開**組**建，選擇**組建專案**，然後選擇**建立組建專案**。

1. 在 **Create build project (建立組建專案)** 頁面上，於 **Project configuration (專案組態)** 中，針對 **Project name (專案名稱)**，輸入此組建專案的名稱 (在此範例中為 `codebuild-demo-project`)。組建專案名稱在每個 AWS 帳戶中必須是唯一的。如果您使用不同名稱，請在此教學課程中都使用此名稱。
**注意**  
在 **Create build project (建立建置專案)** 頁面上，您可能會看到與以下訊息相似的錯誤訊息：**You are not authorized to perform this operation (您未獲得執行此操作的授權)**。這很可能是因為您以沒有建立組建專案許可的使用者 AWS 管理主控台 身分登入 。若要修正此問題，請登出 AWS 管理主控台，然後使用屬於下列其中一個 IAM 實體的登入資料重新登入：  
您 AWS 帳戶中的管理員使用者。如需詳細資訊，請參閱*《 使用者指南*》中的[建立您的第一個 AWS 帳戶 根使用者和群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)。
 AWS 帳戶中的使用者，其 `AWSCodeBuildAdminAccess`、 `AmazonS3ReadOnlyAccess`和 `IAMFullAccess`受管政策連接到該使用者或該使用者所屬的 IAM 群組。如果您的 AWS 帳戶中沒有具有這些許可的使用者或群組，而且您無法將這些許可新增至您的使用者或群組，請聯絡您的 AWS 帳戶管理員尋求協助。如需詳細資訊，請參閱[AWS 的 受管 （預先定義） 政策 AWS CodeBuild](auth-and-access-control-iam-identity-based-access-control.md#managed-policies)。
這兩個選項都包含管理員許可，可讓您建立建置專案以完成本教學課程。建議您一律使用完成任務所需的最低許可。如需詳細資訊，請參閱[AWS CodeBuild 許可參考](auth-and-access-control-permissions-reference.md)。

1. 在**來源**中，針對**來源提供者**選擇 **Amazon S3**。

1. 針對**儲存貯體**，選擇 **codebuild-*region-ID*-*account-ID*-input-bucket**。

1.  針對 **S3 object key (S3 物件金鑰)**，輸入 **MessageUtil.zip**。

1. 在 **Environment (環境)** 中，針對 **Environment image (環境映像)**，請讓 **Managed image (受管映像)** 維持在選取狀態。

1. 針對**作業系統**，選擇 **Amazon Linux**。

1. 針對 **Runtime(s) (執行時間)**，選擇 **Standard (標準)**。

1. 針對**映像**，選擇 **aws/codebuild/amazonlinux-x86\$164-standard：corretto11**。

1. 在 **Service role (服務角色)** 中，讓 **New service role (新服務角色)** 維持在選取狀態，然後讓 **Role name (角色名稱)** 維持不變。

1. 針對 **Buildspec**，將 **Use a buildspec file (使用 buildspec 檔案)** 維持在選取狀態。

1. 在**成品**中，針對**類型**，選擇 **Amazon S3**。

1. 針對**儲存貯體名稱**，選擇 **codebuild-*region-ID*-*account-ID*-output-bucket**。

1. 將 **Name (名稱)** 和 **Path (路徑)** 欄位保留空白。

1. 選擇 **Create build project (建立建置專案)**。

### 步驟 6：執行建置
<a name="getting-started-run-build-console"></a>

(上一個步驟：[步驟 5：建立建置專案](#getting-started-create-build-project-console))

在此步驟中，您會 AWS CodeBuild 指示 使用組建專案中的設定來執行組建。<a name="getting-started-run-build-console-console-procedure"></a>

**執行建置**

1. 在 https：//[https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 開啟 AWS CodeBuild 主控台。

1. 在導覽窗格中，選擇 **Build projects (建置專案)**。

1. 在建置專案清單中，選擇 **codebuild-demo-project**，然後選擇**開始建置**。建置會立即開始。

### 步驟 7：檢視摘要建置資訊
<a name="getting-started-monitor-build-console"></a>

(上一個步驟：[步驟 6：執行建置](#getting-started-run-build-console))

在此步驟中，您會檢視您組建狀態的摘要資訊。

#### 檢視摘要建置資訊
<a name="getting-started-monitor-build-console-title"></a><a name="getting-started-run-build-console-procedure"></a>

1. 如果未顯示 **codebuild-demo-project：*<build-ID>*** 頁面，請在導覽列中選擇**建置歷史記錄**。接下來，在組建專案清單中，針對**專案**，選擇 **codebuild-demo-project** 的**組建執行**連結。此處應該只會有一個相符的連結。(如果您之前已完成此教學課程，請在 **Completed (已完成)** 欄中選擇具有最新值的連結。)

1. 在**建置狀態**頁面上，在**階段詳細資訊**中，應該會顯示下列建置階段，並在**狀態**欄中**成功**：
   + **SUBMITTED**
   + **QUEUED**
   + **PROVISIONING**
   + **DOWNLOAD\$1SOURCE**
   + **INSTALL**
   + **PRE\$1BUILD**
   + **BUILD**
   + **POST\$1BUILD**
   + **UPLOAD\$1ARTIFACTS**
   + **FINALIZING**
   + **COMPLETED (已完成)**

   在 **Build Status (建置狀態)** 中，應會顯示 **Succeeded (成功)**。

   若您看到 **In Progress (進行中)**，請選擇重新整理按鈕。

1. 在每個組建階段旁，**Duration (期間值)** 值表示組建階段的持續時間長度。**End time (結束時間)** 值表示建置階段的結束時間。

### 步驟 8：檢視詳細建置資訊
<a name="getting-started-build-log-console"></a>

(上一個步驟：[步驟 7：檢視摘要建置資訊](#getting-started-monitor-build-console))

在此步驟中，您會在 CloudWatch Logs 中檢視建置的詳細資訊。

**注意**  
 為了保護敏感資訊，CodeBuild 日誌中會隱藏下列項目：  
 AWS 存取金鑰 IDs。如需詳細資訊，請參閱*AWS Identity and Access Management 《 使用者指南*》中的[管理 IAM 使用者的存取金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)。
 使用參數存放區指定的字串。如需詳細資訊，請參閱《*Amazon EC2 Systems Manager 使用者指南*》中的 [Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html)和 [Systems Manager 參數存放區主控台演練](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-walk.html#sysman-paramstore-console)。
 使用 指定的字串 AWS Secrets Manager。如需詳細資訊，請參閱[金鑰管理](security-key-management.md)。<a name="getting-started-build-log-console-procedure"></a>

**檢視詳細建置資訊**

1. 在先前步驟的建置詳細資訊頁面仍顯示的情況下，建置日誌的最後 10,000 行會顯示在 **Build logs (建置日誌)** 中。若要在 CloudWatch Logs 中查看整個建置日誌，請選擇**檢視整個日誌**連結。

1. 在 CloudWatch Logs 日誌串流中，您可以瀏覽日誌事件。根據預設，只會顯示最後一組日誌事件。若要查看更早的事件，請捲動到清單的開頭。

1. 在本教學課程中，大多數日誌事件都包含有關 CodeBuild 下載和安裝建置相依性檔案到其建置環境的詳細資訊，您可能不在乎。您可以使用 **Filter events (篩選事件)** 方塊，減少顯示的資訊。例如，如果您`"[INFO]"`在**篩選事件**中輸入 ，`[INFO]`則只會顯示包含 的事件。如需詳細資訊，請參閱《*Amazon CloudWatch 使用者指南*》中的[篩選和模式語法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html)。

### 步驟 9：取得建置輸出成品
<a name="getting-started-output-console"></a>

(上一個步驟：[步驟 8：檢視詳細建置資訊](#getting-started-build-log-console))

在此步驟中，您會取得 CodeBuild 建置並上傳至輸出儲存貯體`messageUtil-1.0.jar`的檔案。

您可以使用 CodeBuild 主控台或 Amazon S3 主控台來完成此步驟。



**取得建置輸出成品AWS CodeBuild （主控台）**

1. 在 CodeBuild 主控台仍開啟，且建置詳細資訊頁面仍顯示在上一個步驟中時，選擇**建置詳細資訊**索引標籤，然後向下捲動至**成品**區段。
**注意**  
如果未顯示建置詳細資訊頁面，請在導覽列中選擇**建置歷史記錄**，然後選擇**建置執行**連結。

1. Amazon S3 資料夾的連結位於**成品上傳位置**下方。此連結會在 Amazon S3 中開啟 資料夾，您可以在其中找到`messageUtil-1.0.jar`建置輸出成品檔案。

**取得建置輸出成品 (Amazon S3 主控台）**

1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

1. 打開 `codebuild-region-ID-account-ID-output-bucket`。

1. 開啟 `codebuild-demo-project` 資料夾。

1. 開啟 `target` 資料夾，您會在其中找到 `messageUtil-1.0.jar` 建置輸出成品檔案。

### 步驟 10：刪除 S3 儲存貯體
<a name="getting-started-clean-up-console"></a>

(上一個步驟：[步驟 9：取得建置輸出成品](#getting-started-output-console))

若要避免持續向您的 AWS 帳戶收取費用，您可以刪除本教學課程中使用的輸入和輸出儲存貯體。如需說明，請參閱[《Amazon Simple Storage Service 使用者指南》中的刪除或清空儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-or-empty-bucket.html)體。 **

如果您使用 IAM 使用者或管理員 IAM 使用者來刪除這些儲存貯體，則使用者必須擁有更多存取許可。在標記 (*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1* 及 *\$1\$1\$1 END ADDING STATEMENTS HERE \$1\$1\$1*) 之間將下列陳述式新增至使用者的現有存取政策。

這個陳述式中的省略符號 (...) 是為了簡潔起見。請不要移除現有存取政策中的任何陳述式。請勿在政策中輸入這些省略符號。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:DeleteBucket",
        "s3:DeleteObject"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 包裝
<a name="getting-started-next-steps-console"></a>



在本教學課程中，您曾使用 AWS CodeBuild 將一組 Java 類別檔案建置至 JAR 檔案。您接著檢視了建置的結果。

您現在可以在自己的案例中嘗試使用 CodeBuild。請遵循中的說明進行[規劃組建](planning.md) 若您覺得尚未準備就緒，建議您嘗試組建我們的一些範例。如需詳細資訊，請參閱[CodeBuild 使用以案例為基礎的範例](use-case-based-samples.md)。

## AWS CodeBuild 開始使用 AWS CLI
<a name="getting-started-cli"></a>

在本教學課程中，您會使用 AWS CodeBuild 將範例原始程式碼輸入檔案的集合 （稱為*建置輸入成品*或*建置輸入*) 建置為原始程式碼的可部署版本 （稱為*建置輸出成品*或*建置輸出*)。具體而言，您會指示 CodeBuild 使用常見的建置工具 Apache Maven，將一組 Java 類別檔案建置至 Java Archive (JAR) 檔案。您不需要熟悉 Apache Maven 或 Java，也能完成本教學課程。

您可以透過 CodeBuild 主控台 AWS CodePipeline、 AWS CLI或 AWS SDKs 使用 CodeBuild。本教學課程示範如何搭配 使用 CodeBuild AWS CLI。如需使用 CodePipeline 的資訊，請參閱 [搭配 CodePipeline 使用 CodeBuild CodePipeline](how-to-create-pipeline.md)。

**重要**  
本教學中的步驟要求您建立資源 （例如 S3 儲存貯體），這可能會導致 AWS 您的帳戶產生費用。這包括 CodeBuild 和與 Amazon S3 相關的 AWS 資源和動作 AWS KMS，以及 CloudWatch Logs 的可能費用。如需詳細資訊，請參閱 [CodeBuild 定價](https://aws.amazon.com/codebuild/pricing)、[Amazon S3 定價](https://aws.amazon.com/s3/pricing)、[AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing)和 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing)。

**Topics**
+ [

### 步驟 1：建立原始程式碼
](#getting-started-cli-create-source-code)
+ [

### 步驟 2：建立 buildspec 檔案
](#getting-started-cli-create-build-spec)
+ [

### 步驟 3：建立兩個 S3 儲存貯體
](#getting-started-cli-input-bucket)
+ [

### 步驟 4：上傳原始程式碼和 Buildspec 檔案
](#getting-started-cli-upload-source-code)
+ [

### 步驟 5：建立建置專案
](#getting-started-cli-create-build-project)
+ [

### 步驟 6：執行建置
](#getting-started-cli-run-build)
+ [

### 步驟 7：檢視摘要建置資訊
](#getting-started-cli-monitor-build)
+ [

### 步驟 8：檢視詳細建置資訊
](#getting-started-cli-build-log)
+ [

### 步驟 9：取得建置輸出成品
](#getting-started-cli-output)
+ [

### 步驟 10：刪除 S3 儲存貯體
](#getting-started-cli-clean-up)
+ [

### 包裝
](#getting-started-cli-next-steps)

### 步驟 1：建立原始程式碼
<a name="getting-started-cli-create-source-code"></a>

(部分：[AWS CodeBuild 開始使用 AWS CLI](#getting-started-cli))

在此步驟中，您會建立您希望 CodeBuild 建置到輸出儲存貯體的原始程式碼。此來源碼由兩個 Java 類別檔案及一個 Apache Maven Project Object Model (POM) 檔案組成。

1. 在您本機電腦或執行個體上的空目錄內，建立此目錄結構。

   ```
   (root directory name)
       `-- src
            |-- main
            |     `-- java
            `-- test
                  `-- java
   ```

1. 使用您選擇的文字編輯器建立此檔案，將它命名為 `MessageUtil.java`，然後將它儲存在 `src/main/java` 目錄中。

   ```
   public class MessageUtil {
     private String message;
   
     public MessageUtil(String message) {
       this.message = message;
     }
   
     public String printMessage() {
       System.out.println(message);
       return message;
     }
   
     public String salutationMessage() {
       message = "Hi!" + message;
       System.out.println(message);
       return message;
     }
   }
   ```

   此類別檔案會將傳遞給它的字元字串做為輸出建立。`MessageUtil` 建構函數會設定字元字串。`printMessage` 方法會建立輸出。`salutationMessage` 方法會輸出 `Hi!`，其後跟隨字元字串。

1. 建立此檔案，將它命名為 `TestMessageUtil.java`，然後將它儲存在 `/src/test/java` 目錄中。

   ```
   import org.junit.Test;
   import org.junit.Ignore;
   import static org.junit.Assert.assertEquals;
   
   public class TestMessageUtil {
   
     String message = "Robert";    
     MessageUtil messageUtil = new MessageUtil(message);
      
     @Test
     public void testPrintMessage() {      
       System.out.println("Inside testPrintMessage()");     
       assertEquals(message,messageUtil.printMessage());
     }
   
     @Test
     public void testSalutationMessage() {
       System.out.println("Inside testSalutationMessage()");
       message = "Hi!" + "Robert";
       assertEquals(message,messageUtil.salutationMessage());
     }
   }
   ```

   此類別檔案會將 `MessageUtil` 類別中的 `message` 變數設為 `Robert`。它接著會透過檢查 `Robert` 和 `Hi!Robert` 字串是否出現在輸出中，來測試 `message` 變數是否設定成功。

1. 建立此檔案，將它命名為 `pom.xml`，然後將它儲存在根 (最上層) 目錄中。

   ```
   <project xmlns="http://maven.apache.org/POM/4.0.0" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>org.example</groupId>
     <artifactId>messageUtil</artifactId>
     <version>1.0</version>
     <packaging>jar</packaging>
     <name>Message Utility Java Sample App</name>
     <dependencies>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
         <scope>test</scope>
       </dependency>	
     </dependencies>
     <build>
       <plugins>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.8.0</version>
         </plugin>
       </plugins>
     </build>
   </project>
   ```

   Apache Maven 會使用此檔案中的說明，將 `MessageUtil.java` 和 `TestMessageUtil.java` 轉換成名為 `messageUtil-1.0.jar` 的檔案，然後執行指定的測試。

此時您的目錄結構看起來應該會如下。

```
(root directory name)
    |-- pom.xml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java
```

### 步驟 2：建立 buildspec 檔案
<a name="getting-started-cli-create-build-spec"></a>

(上一個步驟：[步驟 1：建立原始程式碼](#getting-started-cli-create-source-code))

在此步驟中，您會建立組建規格 (build spec) 檔案。*buildspec* 是組建命令和相關設定的集合，採用 YAML 格式，可供 CodeBuild 用來執行組建。如果沒有組建規格，CodeBuild 無法成功將組建輸入轉換為組建輸出，或在組建環境中尋找組建輸出成品，以上傳至輸出儲存貯體。

建立此檔案，將它命名為 `buildspec.yml`，然後將它儲存在根 (最上層) 目錄中。

```
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on `date`
      - mvn install
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - target/messageUtil-1.0.jar
```

**重要**  
因為建置規格宣告必須為有效的 YAML，因此建置規格宣告中的間距相當重要。若您建置規格宣告中的空格數與此不符，建置會立即失敗。您可以使用 YAML 驗證程式測試您的建置規格宣告是否為有效的 YAML。

**注意**  
您可以在建立建置專案時分別宣告建置命令，而非在您的來源碼中包含建置規格檔案。這在您希望使用不同建置命令建置來源碼，卻又不想要每次都更新您來源碼的儲存庫時會非常有用。如需詳細資訊，請參閱[Buildspec 語法](build-spec-ref.md#build-spec-ref-syntax)。

在此建置規格宣告中：
+ `version` 代表要使用的建置規格標準版本。此建置規格宣告使用最新版本，`0.2`。
+ `phases` 代表建置階段，您可以在其中指示 CodeBuild 執行命令。這些組建階段會在此以 `install`、`pre_build`、`build` 和 `post_build` 的形式列出。您無法變更這些組建階段名稱的拼字，也無法建立更多組建階段名稱。

  在此範例中，在`build`階段期間，CodeBuild 會執行 `mvn install`命令。此命令會指示 Apache Maven 編譯、測試，並將編譯過的 Java 類別檔案封裝到建置輸出成品中。為求完整，此範例中的每個建置階段內都置放了一些 `echo` 命令。當您稍後在本教學中檢視詳細的建置資訊時，這些`echo`命令的輸出可協助您更加了解 CodeBuild 如何執行命令以及依何種順序執行命令。(雖然此範例中包含了所有組建階段，但若您不需要在其中一個階段執行任何命令，則可不必包含該組建階段。) 對於每個建置階段，CodeBuild 會依序從頭到尾執行每個指定的命令，一次一個。
+ `artifacts` 代表 CodeBuild 上傳至輸出儲存貯體的組組建輸出成品。 `files`代表要包含在組建輸出中的檔案。CodeBuild 會上傳建置環境中`target`相對目錄中找到的單一`messageUtil-1.0.jar`檔案。檔案名稱 (`messageUtil-1.0.jar`) 及目錄名稱 (`target`) 是以 Apache Maven 建立及存放組建輸出成品的方式為基礎，僅適用於此範例。在您自己的組建中，檔案名稱及目錄可能會有所不同。

如需更多資訊，請參閱[Buildspec 參考](build-spec-ref.md)。

此時您的目錄結構看起來應該會如下。

```
(root directory name)
    |-- pom.xml
    |-- buildspec.yml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java
```

### 步驟 3：建立兩個 S3 儲存貯體
<a name="getting-started-cli-input-bucket"></a>

(上一個步驟：[步驟 2：建立 buildspec 檔案](#getting-started-cli-create-build-spec))

雖然您可以在本教學課程中使用單一儲存貯體，但是使用兩個儲存貯體可讓查看組建輸入來源和組建輸出目標的過程變得更為簡單。
+ 其中一個儲存貯體 (*輸入儲存貯體*) 會儲存組建輸入。在本教學課程中，此輸入儲存貯體的名稱為 `codebuild-region-ID-account-ID-input-bucket`，其中 *region-ID* 是儲存貯 AWS 體的區域，*而 account-ID* 是 AWS 您的帳戶 ID。
+ 另一個儲存貯體 (*輸出儲存貯體*) 則會儲存組建輸出。在本教學課程中，此輸出儲存貯體的名稱為 `codebuild-region-ID-account-ID-output-bucket`。

如果您為這些儲存貯體選擇了不同的名稱，請務必在本教學課程中使用它們。

這兩個儲存貯體必須與組建位於相同的 AWS 區域。例如，如果您指示 CodeBuild 在美國東部 （俄亥俄） 區域執行組建，這些儲存貯體也必須位於美國東部 （俄亥俄） 區域。

如需詳細資訊，請參閱 *Amazon Simple Storage Service 主控台使用者指南*中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket.html)。

**注意**  
雖然 CodeBuild 也支援儲存在 CodeCommit、GitHub 和 Bitbucket 儲存庫中的建置輸入，但本教學課程不會向您展示如何使用它們。如需詳細資訊，請參閱[規劃組建](planning.md)。

### 步驟 4：上傳原始程式碼和 Buildspec 檔案
<a name="getting-started-cli-upload-source-code"></a>

(上一個步驟：[步驟 3：建立兩個 S3 儲存貯體](#getting-started-cli-input-bucket))

在此步驟中，您會將來源碼和組建規格檔案新增到輸入儲存貯體。

使用您作業系統的 zip 公用程式，建立名為 `MessageUtil.zip` 的檔案，其中包含 `MessageUtil.java`、`TestMessageUtil.java`、`pom.xml` 和 `buildspec.yml`。

`MessageUtil.zip` 檔案的目錄結構看起來必須如下。

```
MessageUtil.zip
    |-- pom.xml
    |-- buildspec.yml
    `-- src
         |-- main
         |     `-- java
         |           `-- MessageUtil.java
         `-- test
               `-- java
                     `-- TestMessageUtil.java
```

**重要**  
請不要包含 `(root directory name)` 目錄，而是只有 `(root directory name)` 目錄中的目錄和檔案。

將 `MessageUtil.zip` 檔案上傳至名為 `codebuild-region-ID-account-ID-input-bucket` 的輸入儲存貯體。

**重要**  
對於 CodeCommit、GitHub 和 Bitbucket 儲存庫，根據慣例，您必須在每個儲存庫的根 （頂層） `buildspec.yml` 中存放名為 的組建規格檔案，或將組建規格宣告包含在組建專案定義中。請不要建立包含儲存庫來源碼和建置規格檔案的 ZIP 檔案。  
(僅適用於存放在 S3 儲存貯體的建置輸入) 您必須建立 ZIP 檔案，其中包含來源碼，並且根據慣例，於根 (最上層) 包含名為 `buildspec.yml` 的建置規格檔案，或是將建置規格宣告其做為建置專案定義的一部分包含在其中。  
若您想要針對建置規格檔案使用不同的名稱，或是想要參考位於根以外其他位置的建置規格，您可以指定建置規格覆寫，做為建置專案定義的一部分。如需詳細資訊，請參閱[Buildspec 檔案名稱和儲存位置](build-spec-ref.md#build-spec-ref-name-storage)。

### 步驟 5：建立建置專案
<a name="getting-started-cli-create-build-project"></a>

(上一個步驟：[步驟 4：上傳原始程式碼和 Buildspec 檔案](#getting-started-cli-upload-source-code))

在此步驟中，您會建立 AWS CodeBuild 使用 執行建置的建置專案。*建置專案*包含如何執行建置的相關資訊，包括取得原始程式碼的位置、要使用的建置環境、要執行的建置命令，以及儲存建置輸出的位置。*建置環境*代表作業系統、程式設計語言執行時間，以及 CodeBuild 用來執行建置之工具的組合。建置環境會以 Docker 影像表示。如需詳細資訊，請參閱 Docker Docs 網站上的 [Docker 概觀](https://docs.docker.com/get-started/overview/)主題。

在此建置環境中，您會指示 CodeBuild 使用包含 Java 開發套件 (JDK) 和 Apache Maven 版本的 Docker 映像。<a name="getting-started-cli-create-build-project-cli"></a>

**建立建置專案**

1. 使用 AWS CLI 執行 **create-project**命令：

   ```
   aws codebuild create-project --generate-cli-skeleton
   ```

   即會在輸出中顯示 JSON 格式化資料。將資料複製到 AWS CLI 安裝 `create-project.json` 的本機電腦或執行個體上名為 的檔案。若您選擇使用不同的檔案名稱，請務必在本教學課程範圍中使用它。

   修改複製的資料，遵循此格式，並儲存您的結果：

   ```
   {
     "name": "codebuild-demo-project",
     "source": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-input-bucket/MessageUtil.zip"
     },
     "artifacts": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-output-bucket"
     },
     "environment": {
       "type": "LINUX_CONTAINER",
       "image": "aws/codebuild/standard:5.0",
       "computeType": "BUILD_GENERAL1_SMALL"
     },
     "serviceRole": "serviceIAMRole"
   }
   ```

   將 *serviceIAMRole* 取代為 CodeBuild 服務角色的 Amazon Resource Name (ARN) （例如 `arn:aws:iam::account-ID:role/role-name`)。若要建立服務角色，請參閱[允許 CodeBuild 與其他 AWS 服務互動](setting-up-service-role.md)。

   在此資料中：
   + `name` 代表此組建專案的必要識別符 (在此範例中為 `codebuild-demo-project`)。組建專案名稱在您帳戶內的所有組建專案中都必須是唯一的。
   + 對於 `source`， `type` 是代表來源碼儲存庫類型的必要值 （在此範例中`S3`為 Amazon S3 儲存貯體）。
   + 針對 `source`，`location` 代表來源碼的路徑 (在此範例中為輸入儲存貯體名稱，其後跟隨 ZIP 檔案名稱)。
   + 對於 `artifacts`， `type` 是代表建置輸出成品儲存庫類型的必要值 （在此範例中`S3`為 Amazon S3 儲存貯體）。
   + 針對 `artifacts`，`location` 代表您先前建立或找到的輸出儲存貯體名稱 (在此範例中為 `codebuild-region-ID-account-ID-output-bucket`)。
   + 對於 `environment`， `type` 是代表建置環境類型的必要值 （在此範例中為 `LINUX_CONTAINER`)。
   + 對於 `environment`， `image` 是代表此建置專案使用的 Docker 映像名稱和標籤組合的必要值，如 Docker 映像儲存庫類型所指定 （在此範例中`aws/codebuild/standard:5.0`，針對 CodeBuild Docker 映像儲存庫中的 Docker 映像）。 `aws/codebuild/standard` 是 Docker 映像的名稱。 `5.0`是 Docker 映像的標籤。

     若要尋找更多您可以用於案例中的 Docker 影像，請參閱[建置環境參考](build-env-ref.md)。
   + 對於 `environment`， `computeType` 是代表 CodeBuild 使用之運算資源的必要值 （在此範例中為 `BUILD_GENERAL1_SMALL`)。
**注意**  
其他原始 JSON 格式資料中的可用值，例如 `description`、`buildspec`、`auth` (包含 `type` 和 `resource`)、`path`、`namespaceType`、`name` (適用於 `artifacts`)、`packaging`、`environmentVariables` (包含 `name` 和 `value`)、`timeoutInMinutes`、`encryptionKey` 和 `tags` (包含 `key` 和 `value`) 為選擇性。本教學課程中不會使用到它們，因此不會在此顯示。如需詳細資訊，請參閱[建立建置專案 (AWS CLI)](create-project.md#create-project-cli)。

1. 切換到包含您儲存檔案的目錄，然後再次執行 **create-project** 命令。

   ```
   aws codebuild create-project --cli-input-json file://create-project.json
   ```

   若執行成功，則會在輸出中顯示與下列內容相似的資料。

   ```
   {
     "project": {
       "name": "codebuild-demo-project",
       "serviceRole": "serviceIAMRole",
       "tags": [],
       "artifacts": {
         "packaging": "NONE",
         "type": "S3",
         "location": "codebuild-region-ID-account-ID-output-bucket",
         "name": "message-util.zip"
       },
       "lastModified": 1472661575.244,
       "timeoutInMinutes": 60,
       "created": 1472661575.244,
       "environment": {
         "computeType": "BUILD_GENERAL1_SMALL",
         "image": "aws/codebuild/standard:5.0",
         "type": "LINUX_CONTAINER",
         "environmentVariables": []
       },
       "source": {
         "type": "S3",
         "location": "codebuild-region-ID-account-ID-input-bucket/MessageUtil.zip"
       },
       "encryptionKey": "arn:aws:kms:region-ID:account-ID:alias/aws/s3",
       "arn": "arn:aws:codebuild:region-ID:account-ID:project/codebuild-demo-project"
     }
   }
   ```
   + `project` 代表此組建專案的相關資訊。
     + `tags` 代表宣告的任何標籤。
     + `packaging` 代表組建輸出成品存放在輸出儲存貯體的方式。`NONE` 表示會在輸出儲存貯體內建立一個資料夾。組建輸出成品會存放在該資料夾中。
     + `lastModified` 代表時間 (以 Unix 時間格式表示)，代表組建專案相關資訊最後變更的時間。
     + `timeoutInMinutes` 代表如果建置尚未完成，則 CodeBuild 停止建置的分鐘數。(預設為 60 分鐘。)
     + `created` 代表時間 (以 Unix 時間格式表示)，代表建置專案的建立時間。
     + `environmentVariables` 代表任何已宣告且可供 CodeBuild 在建置期間使用的環境變數。
     + `encryptionKey` 代表 CodeBuild 用來加密建置輸出成品之客戶受管金鑰的 ARN。
     + `arn` 代表組建專案的 ARN。

**注意**  
在您執行 **create-project**命令之後，可能會輸出類似下列內容的錯誤訊息：**使用者：*user-ARN* 未獲授權執行：Codebuild：CreateProject**。這很可能是因為您使用沒有足夠的許可來使用 CodeBuild 建立建置專案之使用者的 AWS CLI 登入資料來設定 。若要修正此問題，請使用 AWS CLI 屬於下列其中一個 IAM 實體的登入資料來設定 ：  
您 AWS 帳戶中的管理員使用者。如需詳細資訊，請參閱*《 使用者指南*》中的[建立您的第一個 AWS 帳戶 根使用者和群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)。
 AWS 您帳戶中的使用者，其 `AWSCodeBuildAdminAccess`、 `AmazonS3ReadOnlyAccess`和 `IAMFullAccess`受管政策連接到該使用者或該使用者所屬的 IAM 群組。如果您的 AWS 帳戶中沒有具有這些許可的使用者或群組，而且您無法將這些許可新增至您的使用者或群組，請聯絡您的 AWS 帳戶管理員尋求協助。如需詳細資訊，請參閱[AWS 的 受管 （預先定義） 政策 AWS CodeBuild](auth-and-access-control-iam-identity-based-access-control.md#managed-policies)。

### 步驟 6：執行建置
<a name="getting-started-cli-run-build"></a>

(上一個步驟：[步驟 5：建立建置專案](#getting-started-cli-create-build-project))

在此步驟中，您會 AWS CodeBuild 指示 使用組建專案中的設定來執行組建。<a name="getting-started-run-build-cli"></a>

**執行建置**

1. 使用 AWS CLI 執行 **start-build**命令：

   ```
   aws codebuild start-build --project-name project-name
   ```

   使用您在先前步驟中的組建專案名稱取代 *project-name* (例如，`codebuild-demo-project`)。

1. 若執行成功，則會在輸出中顯示與下列內容相似的資料：

   ```
   {
     "build": { 
       "buildComplete": false,
       "initiator": "user-name",   
       "artifacts": { 
         "location": "arn:aws:s3:::codebuild-region-ID-account-ID-output-bucket/message-util.zip"
       },
       "projectName": "codebuild-demo-project",
       "timeoutInMinutes": 60, 
       "buildStatus": "IN_PROGRESS",
       "environment": {
         "computeType": "BUILD_GENERAL1_SMALL",
         "image": "aws/codebuild/standard:5.0",
         "type": "LINUX_CONTAINER",
         "environmentVariables": []
       },
       "source": {
         "type": "S3",
         "location": "codebuild-region-ID-account-ID-input-bucket/MessageUtil.zip"
       },
       "currentPhase": "SUBMITTED",
       "startTime": 1472848787.882,
       "id": "codebuild-demo-project:0cfbb6ec-3db9-4e8c-992b-1ab28EXAMPLE",
       "arn": "arn:aws:codebuild:region-ID:account-ID:build/codebuild-demo-project:0cfbb6ec-3db9-4e8c-992b-1ab28EXAMPLE"    
     }
   }
   ```
   + `build` 代表此組建的相關資訊。
     + `buildComplete` 代表建置完成 (`true`)。否則為 `false`。
     + `initiator` 代表啟動建置的實體。
     + `artifacts` 代表建置輸出的相關資訊，包括其位置。
     + `projectName` 代表建置專案的名稱。
     + `buildStatus` 代表 **start-build** 命令執行時目前的組建狀態。
     + `currentPhase` 代表 **start-build** 命令執行時目前的組建階段。
     + `startTime` 代表時間 (以 Unix 時間格式表示)，代表建置程序的啟動時間。
     + `id` 代表組建的 ID。
     + `arn` 代表組建的 ARN。

   記下 `id` 值。下一個步驟需要此值。

### 步驟 7：檢視摘要建置資訊
<a name="getting-started-cli-monitor-build"></a>

(上一個步驟：[步驟 6：執行建置](#getting-started-cli-run-build))

在此步驟中，您會檢視您組建狀態的摘要資訊。<a name="getting-started-cli-monitor-build-cli"></a>

**檢視摘要建置資訊**
+ 使用 AWS CLI 執行 **batch-get-builds**命令。

  ```
  aws codebuild batch-get-builds --ids id
  ```

  將 *ID* 取代為上一個步驟的輸出中出現`id`的值。

  若執行成功，則會在輸出中顯示與下列內容相似的資料。

  ```
  {
    "buildsNotFound": [],
    "builds": [
      {
        "buildComplete": true,
        "phases": [
          {
            "phaseStatus": "SUCCEEDED",
            "endTime": 1472848788.525,
            "phaseType": "SUBMITTED",
            "durationInSeconds": 0,
            "startTime": 1472848787.882
          },
          ... The full list of build phases has been omitted for brevity ...
          {
            "phaseType": "COMPLETED",
            "startTime": 1472848878.079
          }
        ],
        "logs": {
          "groupName": "/aws/codebuild/codebuild-demo-project",
          "deepLink": "https://console.aws.amazon.com/cloudwatch/home?region=region-ID#logEvent:group=/aws/codebuild/codebuild-demo-project;stream=38ca1c4a-e9ca-4dbc-bef1-d52bfEXAMPLE",
          "streamName": "38ca1c4a-e9ca-4dbc-bef1-d52bfEXAMPLE"
        },
        "artifacts": {
          "md5sum": "MD5-hash",
          "location": "arn:aws:s3:::codebuild-region-ID-account-ID-output-bucket/message-util.zip",
          "sha256sum": "SHA-256-hash"
        },
        "projectName": "codebuild-demo-project",
        "timeoutInMinutes": 60,
        "initiator": "user-name",
        "buildStatus": "SUCCEEDED",
        "environment": {
          "computeType": "BUILD_GENERAL1_SMALL",
          "image": "aws/codebuild/standard:5.0",
          "type": "LINUX_CONTAINER",
          "environmentVariables": []
        },
        "source": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-input-bucket/MessageUtil.zip"
        },
        "currentPhase": "COMPLETED",
        "startTime": 1472848787.882,
        "endTime": 1472848878.079,
        "id": "codebuild-demo-project:38ca1c4a-e9ca-4dbc-bef1-d52bfEXAMPLE",
        "arn": "arn:aws:codebuild:region-ID:account-ID:build/codebuild-demo-project:38ca1c4a-e9ca-4dbc-bef1-d52bfEXAMPLE"      
      }
    ]
  }
  ```
  + `buildsNotFound` 代表無法取得資訊之任何組建的組建 ID。在此範例中，此處應為空白。
  + `builds` 代表可取得資訊的建置相關資訊。在此範例中，輸出內應該會只顯示一個建置相關資訊。
    + `phases` 代表組建過程中 CodeBuild 執行的組建置階段。每個組建階段的相關資訊會分別以 `startTime`、`endTime` 和 `durationInSeconds` (組建階段啟動和結束的時間 (以 Unix 時間格式表示)，以及階段持續的時間長度 (以秒數表示)) 列出，以及 `phaseType` (例如 `SUBMITTED`、`PROVISIONING`、`DOWNLOAD_SOURCE`、`INSTALL`、`PRE_BUILD`、`BUILD`、`POST_BUILD`、`UPLOAD_ARTIFACTS`、`FINALIZING` 或 `COMPLETED`) 及 `phaseStatus` (例如 `SUCCEEDED`、`FAILED`、`FAULT`、`TIMED_OUT`、`IN_PROGRESS` 或 `STOPPED`)。當您第一次執行 **batch-get-builds** 命令時，可能不會有太多 (甚至完全沒有) 階段。在後續使用相同的組建 ID 執行 **batch-get-builds** 命令後，輸出內便會出現更多組建階段。
    + `logs` 代表 Amazon CloudWatch Logs 中建置日誌的相關資訊。
    + `md5sum` 和 `sha256sum` 代表組建輸出成品的 MD5 和 SHA-256 雜湊。只有在組建專案的 `packaging` 值設為 `ZIP` 時，這些才會出現在輸出中。(您未在本教學課程中設定此值。) 您可以搭配檢查總和工具使用這些雜湊，確認檔案完整性及真確性。
**注意**  
您也可以使用 Amazon S3 主控台來檢視這些雜湊。選取建置輸出成品旁的方塊，選擇 **Actions (動作)**，然後選擇 **Properties (屬性)**。在 **Properties (屬性)** 窗格中，展開 **Metadata (中繼資料)**，然後檢視 **x-amz-meta-codebuild-content-md5** 和 **x-amz-meta-codebuild-content-sha256** 的值。（在 Amazon S3 主控台中，組建輸出成品的 **ETag** 值不應解譯為 MD5 或 SHA-256 雜湊。)  
如果您使用 AWS SDKs來取得這些雜湊，則值會命名為 `codebuild-content-md5`和 `codebuild-content-sha256`。
    + `endTime` 代表時間 (以 Unix 時間格式表示)，代表建置程序的結束時間。
**注意**  
Amazon S3 中繼資料具有名為 的 CodeBuild 標頭`x-amz-meta-codebuild-buildarn`，其中包含發佈成品至 Amazon S3 `buildArn`的 CodeBuild 組建的 。`buildArn` 新增 以允許來源追蹤通知，並參考產生成品的建置。

### 步驟 8：檢視詳細建置資訊
<a name="getting-started-cli-build-log"></a>

(上一個步驟：[步驟 7：檢視摘要建置資訊](#getting-started-cli-monitor-build))

在此步驟中，您會在 CloudWatch Logs 中檢視建置的詳細資訊。

**注意**  
 為了保護敏感資訊，CodeBuild 日誌中會隱藏下列項目：  
 AWS 存取金鑰 IDs。如需詳細資訊，請參閱*AWS Identity and Access Management 《 使用者指南*》中的[管理 IAM 使用者的存取金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)。
 使用參數存放區指定的字串。如需詳細資訊，請參閱《*Amazon EC2 Systems Manager * [Systems Manager 使用者指南》中的 Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html)和 [Systems Manager 參數存放區主控台演練](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-walk.html#sysman-paramstore-console)。
 使用 指定的字串 AWS Secrets Manager。如需詳細資訊，請參閱[金鑰管理](security-key-management.md)。<a name="getting-started-cli-build-log-cli"></a>

**檢視詳細建置資訊**

1. 使用您的 Web 瀏覽器前往先前步驟輸出中顯示的 `deepLink` 位置 (例如，`https://console.aws.amazon.com/cloudwatch/home?region=region-ID#logEvent:group=/aws/codebuild/codebuild-demo-project;stream=38ca1c4a-e9ca-4dbc-bef1-d52bfEXAMPLE`)。

1. 在 CloudWatch Logs 日誌串流中，您可以瀏覽日誌事件。根據預設，只會顯示最後一組日誌事件。若要查看更早的事件，請捲動到清單的開頭。

1. 在本教學課程中，大多數日誌事件都包含有關 CodeBuild 下載和安裝建置相依性檔案到其建置環境的詳細資訊，您可能不在乎。您可以使用 **Filter events (篩選事件)** 方塊，減少顯示的資訊。例如，如果您`"[INFO]"`在**篩選事件**中輸入 ，`[INFO]`則只會顯示包含 的事件。如需詳細資訊，請參閱《*Amazon CloudWatch 使用者指南*》中的[篩選和模式語法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html)。

CloudWatch Logs 日誌串流的這些部分與此教學課程相關。

```
...
[Container] 2016/04/15 17:49:42 Entering phase PRE_BUILD 
[Container] 2016/04/15 17:49:42 Running command echo Entering pre_build phase...
[Container] 2016/04/15 17:49:42 Entering pre_build phase... 
[Container] 2016/04/15 17:49:42 Phase complete: PRE_BUILD Success: true 
[Container] 2016/04/15 17:49:42 Entering phase BUILD 
[Container] 2016/04/15 17:49:42 Running command echo Entering build phase... 
[Container] 2016/04/15 17:49:42 Entering build phase...
[Container] 2016/04/15 17:49:42 Running command mvn install 
[Container] 2016/04/15 17:49:44 [INFO] Scanning for projects... 
[Container] 2016/04/15 17:49:44 [INFO]
[Container] 2016/04/15 17:49:44 [INFO] ------------------------------------------------------------------------ 
[Container] 2016/04/15 17:49:44 [INFO] Building Message Utility Java Sample App 1.0 
[Container] 2016/04/15 17:49:44 [INFO] ------------------------------------------------------------------------ 
... 
[Container] 2016/04/15 17:49:55 ------------------------------------------------------- 
[Container] 2016/04/15 17:49:55  T E S T S 
[Container] 2016/04/15 17:49:55 ------------------------------------------------------- 
[Container] 2016/04/15 17:49:55 Running TestMessageUtil 
[Container] 2016/04/15 17:49:55 Inside testSalutationMessage() 
[Container] 2016/04/15 17:49:55 Hi!Robert 
[Container] 2016/04/15 17:49:55 Inside testPrintMessage() 
[Container] 2016/04/15 17:49:55 Robert 
[Container] 2016/04/15 17:49:55 Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 sec
[Container] 2016/04/15 17:49:55  
[Container] 2016/04/15 17:49:55 Results : 
[Container] 2016/04/15 17:49:55  
[Container] 2016/04/15 17:49:55 Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 
...
[Container] 2016/04/15 17:49:56 [INFO] ------------------------------------------------------------------------ 
[Container] 2016/04/15 17:49:56 [INFO] BUILD SUCCESS 
[Container] 2016/04/15 17:49:56 [INFO] ------------------------------------------------------------------------ 
[Container] 2016/04/15 17:49:56 [INFO] Total time: 11.845 s 
[Container] 2016/04/15 17:49:56 [INFO] Finished at: 2016-04-15T17:49:56+00:00 
[Container] 2016/04/15 17:49:56 [INFO] Final Memory: 18M/216M 
[Container] 2016/04/15 17:49:56 [INFO] ------------------------------------------------------------------------ 
[Container] 2016/04/15 17:49:56 Phase complete: BUILD Success: true 
[Container] 2016/04/15 17:49:56 Entering phase POST_BUILD 
[Container] 2016/04/15 17:49:56 Running command echo Entering post_build phase... 
[Container] 2016/04/15 17:49:56 Entering post_build phase... 
[Container] 2016/04/15 17:49:56 Phase complete: POST_BUILD Success: true 
[Container] 2016/04/15 17:49:57 Preparing to copy artifacts 
[Container] 2016/04/15 17:49:57 Assembling file list 
[Container] 2016/04/15 17:49:57 Expanding target/messageUtil-1.0.jar 
[Container] 2016/04/15 17:49:57 Found target/messageUtil-1.0.jar 
[Container] 2016/04/15 17:49:57 Creating zip artifact
```

在此範例中，CodeBuild 成功完成建置前、建置和建置後建置階段。它執行了單位測試並成功建置了 `messageUtil-1.0.jar` 檔案。

### 步驟 9：取得建置輸出成品
<a name="getting-started-cli-output"></a>

(上一個步驟：[步驟 8：檢視詳細建置資訊](#getting-started-cli-build-log))

在此步驟中，您會取得 CodeBuild 建置並上傳至輸出儲存貯體`messageUtil-1.0.jar`的檔案。

您可以使用 CodeBuild 主控台或 Amazon S3 主控台來完成此步驟。



**取得建置輸出成品AWS CodeBuild （主控台）**

1. 在 CodeBuild 主控台仍開啟，且建置詳細資訊頁面仍顯示在上一個步驟中時，選擇**建置詳細資訊**索引標籤，然後向下捲動至**成品**區段。
**注意**  
如果未顯示建置詳細資訊頁面，請在導覽列中選擇**建置歷史記錄**，然後選擇**建置執行**連結。

1. Amazon S3 資料夾的連結位於**成品上傳位置**下方。此連結會在 Amazon S3 中開啟 資料夾，您可以在其中找到`messageUtil-1.0.jar`建置輸出成品檔案。

**取得建置輸出成品 (Amazon S3 主控台）**

1. 開啟位於 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

1. 打開 `codebuild-region-ID-account-ID-output-bucket`。

1. 開啟 `codebuild-demo-project` 資料夾。

1. 開啟 `target` 資料夾，您會在其中找到 `messageUtil-1.0.jar` 建置輸出成品檔案。

### 步驟 10：刪除 S3 儲存貯體
<a name="getting-started-cli-clean-up"></a>

(上一個步驟：[步驟 9：取得建置輸出成品](#getting-started-cli-output))

若要避免持續向您的 AWS 帳戶收取費用，您可以刪除本教學課程中使用的輸入和輸出儲存貯體。如需說明，請參閱[《Amazon Simple Storage Service 使用者指南》中的刪除或清空儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-or-empty-bucket.html)體。 **

如果您使用 IAM 使用者或管理員 IAM 使用者來刪除這些儲存貯體，則使用者必須擁有更多存取許可。在標記 (*\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1* 及 *\$1\$1\$1 END ADDING STATEMENTS HERE \$1\$1\$1*) 之間將下列陳述式新增至使用者的現有存取政策。

這個陳述式中的省略符號 (...) 是為了簡潔起見。請不要移除現有存取政策中的任何陳述式。請勿在政策中輸入這些省略符號。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:DeleteBucket",
        "s3:DeleteObject"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 包裝
<a name="getting-started-cli-next-steps"></a>



在本教學課程中，您曾使用 AWS CodeBuild 將一組 Java 類別檔案建置至 JAR 檔案。您接著檢視了建置的結果。

您現在可以在自己的案例中嘗試使用 CodeBuild。請遵循中的說明進行[規劃組建](planning.md) 若您覺得尚未準備就緒，建議您嘗試組建我們的一些範例。如需詳細資訊，請參閱[CodeBuild 使用以案例為基礎的範例](use-case-based-samples.md)。