

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

# AWS CodePipeline 的样品 CodeBuild
<a name="sample-codepipeline"></a>

本节介绍 CodePipeline 和 CodeBuild之间的集成示例。


| 样本 | 说明 | 
| --- | --- | 
|  [CodePipeline/CodeBuild 集成和批量构建示例](#sample-pipeline-batch)  |  这些示例演示了如何使用 AWS CodePipeline 来创建使用批量构建的构建项目。  | 
|  [具有多个输入源和输出工件的 CodePipeline/CodeBuild 集成示例](#sample-pipeline-multi-input-output)  |  此示例演示 AWS CodePipeline 如何使用创建使用多个输入源来创建多个输出构件的构建项目。  | 

## CodePipeline/CodeBuild 集成和批量构建示例
<a name="sample-pipeline-batch"></a>

AWS CodeBuild 支持批量构建。以下示例演示 AWS CodePipeline 如何使用创建使用批量构建的构建项目。

您可以使用 JSON 格式的文件来定义管道的结构，然后将其与一起使用 AWS CLI 来创建管道。有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的 [AWS CodePipeline 管道结构参考](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)。

### 使用单个构件进行批量构建
<a name="sample-pipeline-batch.separate-artifacts"></a>

使用以下 JSON 文件作为管道结构的示例，该结构使用单个构件创建批量构建。要在中启用批量构建 CodePipeline，请将`configuration`对象的`BatchEnabled`参数设置为`true`。

```
{
  "pipeline": {
    "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
    "stages": [
      {
        "name": "Source",
        "actions": [
          {
            "inputArtifacts": [],
            "name": "Source1",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source1"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-input-bucket-name>",
              "S3ObjectKey": "my-source-code-file-name.zip"
            },
            "runOrder": 1
          },
          {
            "inputArtifacts": [],
            "name": "Source2",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source2"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-other-input-bucket-name>",
              "S3ObjectKey": "my-other-source-code-file-name.zip"
            },
            "runOrder": 1
          }
        ]
      },
      {
        "name": "Build",
        "actions": [
          {
            "inputArtifacts": [
              {
                "name": "source1"
              },
              {
                "name": "source2"
              }
            ],
            "name": "Build",
            "actionTypeId": {
              "category": "Build",
              "owner": "AWS",
              "version": "1",
              "provider": "CodeBuild"
            },
            "outputArtifacts": [
              {
                "name": "build1"
              },
              {
                "name": "build1_artifact1"
              },
              {
                "name": "build1_artifact2"
              },
              {
                "name": "build2_artifact1"
              },
              {
                "name": "build2_artifact2"
              }
            ],
            "configuration": {
              "ProjectName": "my-build-project-name",
              "PrimarySource": "source1",
              "BatchEnabled": "true"
            },
            "runOrder": 1
          }
        ]
      }
    ],
    "artifactStore": {
      "type": "S3",
      "location": "<AWS-CodePipeline-internal-bucket-name>"
    },
    "name": "my-pipeline-name",
    "version": 1
  }
}
```

以下是适用于此工作流配置的 CodeBuild buildspec 文件的示例。

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
  secondary-artifacts:
    artifact1:
      files:
        - output_file
    artifact2:
      files:
        - output_file
```

管道的 JSON 文件中指定的输出构件的名称必须与 buildspec 文件中定义的构建和构件的标识符相匹配。语法*buildIdentifier*用于主工件，*buildIdentifier*\$1 *artifactIdentifier* 用于次要工件。

例如，对于输出对象名称`build1`， CodeBuild 会将的主构件上传`build1`到的位置`build1`。对于输出名称`build1_artifact1`， CodeBuild 会将的次要工件`artifact1`上传`build1`到的位置`build1_artifact1`，依此类推。如果只指定了一个输出位置，则名称应为 “*buildIdentifier*只有”。

创建 JSON 文件后，可以创建管道。使用运行 **create-pipelin** e 命令并将文件传递给参数。 AWS CLI `--cli-input-json`有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的[创建管道（CLI）](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

### 使用合并的构件进行批量构建
<a name="sample-pipeline-batch.combined-artifacts"></a>

使用以下 JSON 文件作为管道结构的示例，该结构使用合并的构件创建批量构建。要在中启用批量构建 CodePipeline，请将`configuration`对象的`BatchEnabled`参数设置为`true`。要将构建构件合并到同一位置，请将 `configuration` 对象的 `CombineArtifacts` 参数设置为 `true`。

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-input-bucket-name>",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-other-input-bucket-name>",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "output1 "
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1",
             "BatchEnabled": "true",
             "CombineArtifacts": "true"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "<AWS-CodePipeline-internal-bucket-name>"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

以下是适用于此工作流配置的 CodeBuild buildspec 文件的示例。

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
```

如果为批量生成启用了组合工件，则只允许一个输出。 CodeBuild 会将所有版本的主要构件合并到一个 ZIP 文件中。

创建 JSON 文件后，可以创建管道。使用运行 **create-pipelin** e 命令并将文件传递给参数。 AWS CLI `--cli-input-json`有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的[创建管道（CLI）](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

## 具有多个输入源和输出工件的 CodePipeline/CodeBuild 集成示例
<a name="sample-pipeline-multi-input-output"></a>

一个 AWS CodeBuild 项目可以采用多个输入源。也可以创建多个输出构件。此示例演示 AWS CodePipeline 如何使用创建使用多个输入源来创建多个输出构件的构建项目。有关更多信息，请参阅 [多输入源和输出构件示例](sample-multi-in-out.md)。

您可以使用 JSON 格式的文件来定义管道的结构，然后将其与一起使用 AWS CLI 来创建管道。使用以下 JSON 文件作为管道结构的示例，此管道结构可以创建一个具有多输入源和多输出构件的构建。稍后，此示例会介绍该文件如何指定多个输入和输出。有关更多信息，请参阅《*AWS CodePipeline 用户指南》*中的[CodePipeline 管道结构参考](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)。

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "my-input-bucket-name",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "my-other-input-bucket-name",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "AWS CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "artifact1"
            },
            {
              "name": "artifact2"
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "AWS-CodePipeline-internal-bucket-name"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

 在此 JSON 文件中：
+ 必须将输入源之一指定为 `PrimarySource`。这个源代码是 CodeBuild 查找和运行你的 buildspec 文件的目录。关键字`PrimarySource`用于指定 JSON 文件中 CodeBuild 舞台`configuration`部分的主要来源。
+ 每个输入源都安装在各自的目录中。此目录存储在内置环境变量 `$CODEBUILD_SRC_DIR`（对于主要源）和 `$CODEBUILD_SRC_DIR_yourInputArtifactName`（对于所有其他源）中。对于此示例中的管道，两个输入源目录为 `$CODEBUILD_SRC_DIR` 和 `$CODEBUILD_SRC_DIR_source2`。有关更多信息，请参阅 [构建环境中的环境变量](build-env-ref-env-vars.md)。
+ 管道的 JSON 文件中指定的输出构件的名称必须与 buildspec 文件中定义的辅助构件的名称相匹配。此管道使用以下 buildspec 文件。有关更多信息，请参阅 [buildspec 语法](build-spec-ref.md#build-spec-ref-syntax)。

  ```
  version: 0.2
  
  phases:
    build:
      commands:
        - touch source1_file
        - cd $CODEBUILD_SRC_DIR_source2
        - touch source2_file
  
  artifacts:
    files:
      - '**/*'
    secondary-artifacts:
      artifact1:
        base-directory: $CODEBUILD_SRC_DIR
        files:
          - source1_file
      artifact2:
        base-directory: $CODEBUILD_SRC_DIR_source2
        files:
          - source2_file
  ```

 创建 JSON 文件后，可以创建管道。使用运行 **create-pipelin** e 命令并将文件传递给参数。 AWS CLI `--cli-input-json`有关更多信息，请参阅《AWS CodePipeline 用户指南》**中的[创建管道（CLI）](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。