AWS CodeBuild
用户指南 (API 版本 2016-10-06)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

CodeBuild 入门

在本演练中,您将使用 AWS CodeBuild 将一系列示例源代码输入文件(称为生成输入构件构建输入)生成为一个可部署的源代码版本(称为构建输出构件构建输出)。具体来说,您将指示 CodeBuild 使用 Apache Maven(一种常用的生成工具)将一组 Java 类文件生成为 Java 存档 (JAR) 文件。您无需熟悉 Apache Maven 或 Java 即可完成本演练。

重要

完成本演练会对您的 AWS 账户产生费用。这些费用包括可能针对 CodeBuild 和 AWS 资源以及与 Amazon S3、AWS KMS 和 CloudWatch Logs 相关的操作收取的费用。有关更多信息,请参阅 CodeBuild 定价Amazon S3 定价AWS Key Management Service 定价Amazon CloudWatch 定价

步骤 1:创建或使用 Amazon S3 存储桶来存储构建输入和输出

要完成本演练,您需要两个 Amazon S3 存储桶:

  • 其中一个存储桶用于存储生成输入(输入存储桶)。在本演练中,我们将此输入存储桶命名为 codebuild-region-ID-account-ID-input-bucket,其中 region-ID 表示存储桶的 AWS 区域,account-ID 表示您的 AWS 账户 ID。

  • 另一个存储桶用于存储生成输出(输出存储桶)。在本演练中,我们将此输出存储桶命名为 codebuild-region-ID-account-ID-output-bucket

如果您为任何一个存储桶选择其他名称,请确保在整个演练中使用此名称进行替换。

这两个存储桶必须与您的生成项目处在同一个 AWS 区域中。例如,如果您指示 CodeBuild 在 US East (Ohio) 区域中运行生成,则这些存储桶也必须位于 US East (Ohio) 区域中。

要创建存储桶,请参阅 Amazon Simple Storage Service 用户指南中的创建存储桶

注意

您可以为此演练使用给单个存储桶,但是,使用两个存储桶更容易查看生成输入的来源以及生成输出的去向。

尽管 CodeBuild 也支持存储在 CodeCommit、GitHub 和 Bitbucket 存储库中的构建输入,但本演练不说明如何使用它们。有关更多信息,请参阅规划构建

步骤 2:创建用于构建的源代码

在此步骤中,您将创建需要 CodeBuild 生成到输出存储桶的源代码。此源代码包含两个 Java 类文件和一个 Apache Maven 项目对象模型 (POM) 文件。

  1. 在您的本地计算机或实例上的空目录中,创建此目录结构。

    (root directory name) `-- src |-- main | `-- java `-- test `-- java
  2. 使用您选择的文本编辑器创建此文件,将其命名为 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! 后跟字符串。

  3. 创建此文件,将其命名为 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。然后,通过检查输出中是否出现字符串 RobertHi!Robert 来测试是否成功设置 message 变量。

  4. 创建此文件,将其命名为 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.javaTestMessageUtil.java 文件转换为名为 messageUtil-1.0.jar 的文件,然后运行指定测试。

此时,您的目录结构应如下所示。

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

步骤 3:创建生成规范

在此步骤中,您将创建一个构建规范文件。生成规范 是生成命令和相关设置的集合,采用 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。

注意

您可以在创建构建项目时单独声明构建命令,而不是将构建规范文件包含在源代码中。如果您需要使用其他构建命令来构建源代码,而不是每次更新源代码存储库,这个方法很有用。有关更多信息,请参阅生成规范语法

在此生成规范声明中:

  • version 表示正在使用的生成规范标准的版本。此生成规范声明使用最新版本 0.2

  • phases 表示您可以指示 CodeBuild 运行命令的生成阶段。这些构建阶段包括 installpre_buildbuildpost_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 创建和存储构建输出项目的方式来命名的。在您自己的生成项目中,这些文件和目录名称会有所不同。

有关更多信息,请参阅 生成规范参考

此时,您的目录结构应如下所示。

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

步骤 4:将源代码和生成规范添加到输入存储桶中

在此步骤中,您将源代码和构建规范文件添加到输入存储桶中。

使用操作系统的 ZIP 实用工具,创建一个名为 MessageUtil.zip 的文件,其中包含 MessageUtil.javaTestMessageUtil.javapom.xmlbuildspec.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 文件。

仅对于存储在 Amazon S3 存储桶中的构建输入,您需要创建一个包含源代码的 ZIP 文件和一个 (按照惯例) 位于根(顶级)位置的名为 buildspec.yml 的构建规范文件,或者将生成规范声明作为构建项目定义的一部分包含。

如果您要为构建规范文件使用其他名称,或者要在根位置之外的位置引用生成规范,则可指定生成规范覆盖作为构建项目定义的一部分。有关更多信息,请参阅构建规范文件名称和存储位置

步骤 5:创建构建项目

在此步骤中,您将创建一个构建项目,AWS CodeBuild 将使用它来运行构建项目。构建项目 定义 CodeBuild 如何运行构建。它包括的信息有源代码获取位置、要使用的生成环境、要运行的生成命令和存储生成输出的位置等。 生成环境 是由操作系统、编程语言运行时和 CodeBuild 用于运行生成任务的工具组成的。 构建环境以 Docker 镜像的形式表示。(有关更多信息,请参阅 Docker 文档网站上的 Docker 概述主题。) 对于此生成环境,您需要指示 CodeBuild 使用包含 Java 开发工具包 (JDK) 和 Apache Maven 的 Docker 镜像。

您可以使用 CodeBuild 控制台或 AWS CLI 控制台完成此步骤。

注意

您可以通过多种方式使用 CodeBuild:通过 CodeBuild 控制台、AWS CodePipeline、AWS CLI 或 AWS 开发工具包。本演练将展示如何使用 CodeBuild 控制台和 AWS CLI。要了解如何使用 CodePipeline,请参阅将 AWS CodePipeline 与 CodeBuild 结合使用。要了解如何使用 AWS 开发工具包,请参阅直接运行 AWS CodeBuild

创建构建项目 (控制台)

  1. 通过以下网址登录 AWS Management Console并打开 AWS CodeBuild 控制台:https://console.amazonaws.cn/codesuite/codebuild/home

  2. 在 AWS 区域选择器中,选择一个支持 CodeBuild 的区域。有关更多信息,请参阅 Amazon Web Services General Reference 中的“区域和终端节点”主题中的 CodeBuild

  3. 如果显示 CodeBuild 信息页面,请选择 Create build project (创建构建项目)。否则,请在导航窗格上展开 Build (构建),然后依次选择 Build projects (构建项目)Create build project (创建构建项目)

  4. Create build project (创建生成项目) 页面上的 Project Configuration (项目配置) 中,对于 Project name (项目名称),输入此生成项目的名称(在此示例中为 codebuild-demo-project)。构建项目名称在您的各个 AWS 账户内必须是唯一的。如果您使用其他名称,请确保在整个演练中使用此名称进行替换。

    注意

    Create build project (创建生成项目) 页面上,您可能会看到类似于以下内容的错误消息:User: user-ARN is not authorized to perform: codebuild:ListProjects (用户: user-ARN 未授权执行 codebuild:CreateProject)。这很可能是因为您以 IAM 用户身份登录 AWS Management Console,而此用户身份没有足够的权限,无法在控制台中使用 CodeBuild。要修复此问题,请从 AWS Management Console注销,然后使用属于以下任一 IAM 实体的凭证重新登录:

    • 您的 AWS 根账户。我们不建议这么做。有关更多信息,请参阅 IAM 用户指南中的账户根用户

    • AWS 账户中的 IAM 管理员用户。有关更多信息,请参阅 IAM 用户指南中的创建您的第一个 IAM 管理员用户和组

    • 您的 AWS 账户中的 IAM 用户,已向该 IAM 用户或其所属的 IAM 组附加名为 AWSCodeBuildAdminAccessAmazonS3ReadOnlyAccessIAMFullAccess 的 AWS 托管策略。IAM如果您的 AWS 账户中没有 IAM 用户或组具有这些权限,并且您无法将这些权限添加到您的 IAM 用户或组,请与 AWS 账户管理员联系以寻求帮助。有关更多信息,请参阅适用于 CodeBuild 的 AWS 托管(预定义)策略

  5. Source (源) 中,对于 Source provider (源提供商),选择 Amazon S3

  6. 对于 Bucket (存储桶),选择 codebuild-region-ID-account-ID-input-bucket

  7. 对于 S3 object key (S3 对象键),输入 MessageUtil.zip

  8. Environment (环境) 中,对于 Environment image (环境映像),让 Managed image (托管映像) 处于选中状态。

  9. 对于 Operating system (操作系统),选择 Amazon Linux 2

  10. 对于 Runtime(s) (运行时),选择 Standard (标准)

  11. 对于 Image (映像),选择 aws/codebuild/amazonlinux2-x86_64-standard:1.0

  12. Service role (服务角色) 中,将 New service role (新建服务角色) 保持选中状态,并将 Role name (角色名称) 保持不变。

  13. 对于 Buildspec (生成规范),将 Use a buildspec file (使用构建规范文件) 保留为选中状态。

  14. Artifacts (构件) 中,对于 Type (类型),选择 Amazon S3

  15. 对于 Bucket name (存储桶名称),选择 codebuild-region-ID-account-ID-output-bucket

  16. Name (名称)Path (路径) 留空。

  17. 选择 Create build project (创建构建项目)

    向前跳至 步骤 6:运行构建

创建构建项目 (AWS CLI)

  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:2.0", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "serviceIAMRole" }

    serviceIAMRole 替换为 CodeBuild 服务角色的 Amazon 资源名称 (ARN)(如 arn:aws:iam::account-ID:role/role-name)。如需创建一个角色,请参阅创建 CodeBuild 服务角色

    在此数据中:

    • name 表示此构建项目的必需标识符 (在本示例中为 codebuild-demo-project)。构建项目名称在您账户的所有构建项目中必须是唯一的。

    • 对于 sourcetype 是一个必需值,表示源代码的存储库类型(在本示例中,S3 表示 Amazon S3 存储桶)。

    • 对于 sourcelocation 表示源代码的路径 (在本示例中,为输入存储桶名称后跟 ZIP 文件名称)。

    • 对于 artifactstype 是一个必需值,表示生成输出项目的存储库类型(在本示例中,S3 表示 Amazon S3 存储桶)。

    • 对于 artifactslocation 表示您先前创建或识别的输出存储桶的名称 (在本示例中为 codebuild-region-ID-account-ID-output-bucket)。

    • 对于 environmenttype 是一个必需值,表示构建环境的类型 (LINUX_CONTAINER 是目前唯一允许的值)。

    • 对于 environmentimage 是一个必需值,表示此构建项目使用的 Docker 映像名称和标签组合,由 Docker 映像存储库类型指定(在本例中,aws/codebuild/standard:2.0 表示 CodeBuild Docker 映像存储库中的 Docker 映像)。aws/codebuild/standard 是 Docker 映像的名称。1.0 是 Docker 映像的标签。

      要查找您可以在自己方案中使用的更多 Docker 镜像,请参阅 生成环境参考

    • 对于 environmentcomputeType 是一个必需值,表示 CodeBuild 将会使用的计算资源(在本示例中为 BUILD_GENERAL1_SMALL)。

    注意

    原始 JSON 格式数据中的其他可用值,如 descriptionbuildspecauth (包括 typeresource)、pathnamespaceTypename (对于 artifacts)、packagingenvironmentVariables (包括 namevalue)、timeoutInMinutesencryptionKeytags (包括 keyvalue) 为可选的值。本演练中未使用这些值,因此没有在这里显示。有关更多信息,请参阅创建构建项目 (AWS CLI)

  2. 切换到您刚才保存的文件所在的目录,然后再次运行 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:2.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 用于加密生成输出项目的 AWS KMS 客户主密钥 (CMK) 的 ARN。

      • arn 表示构建项目的 ARN。

注意

在运行 create-project 命令后,可能输出类似于以下内容的错误消息:User: user-ARN is not authorized to perform: codebuild:CreateProject (用户: user-ARN 未授权执行: codebuild:ListProjects)。这很可能是因为您在使用 IAM 用户的凭证配置 AWS CLI 时,该用户没有足够的权限,无法使用 CodeBuild 创建生成项目。要修复此问题,请使用属于以下任一 IAM 实体的凭证配置 AWS CLI:

  • 您的 AWS 根账户。我们不建议这么做。有关更多信息,请参阅 IAM 用户指南中的账户根用户

  • AWS 账户中的 IAM 管理员用户。有关更多信息,请参阅 IAM 用户指南中的创建您的第一个 IAM 管理员用户和组

  • 您的 AWS 账户中的 IAM 用户,已向该 IAM 用户或其所属的 IAM 组附加名为 AWSCodeBuildAdminAccessAmazonS3ReadOnlyAccessIAMFullAccess 的 AWS 托管策略。IAM如果您的 AWS 账户中没有 IAM 用户或组具有这些权限,并且您无法将这些权限添加到您的 IAM 用户或组,请与 AWS 账户管理员联系以寻求帮助。有关更多信息,请参阅 适用于 CodeBuild 的 AWS 托管(预定义)策略

步骤 6:运行构建

在此步骤中,您将指示 AWS CodeBuild 使用构建项目中的设置来运行构建。

您可以使用 CodeBuild 控制台或 AWS CLI 控制台完成此步骤。

运行构建 (控制台)

  1. Open the AWS CodeBuild console at https://console.amazonaws.cn/codesuite/codebuild/home.

  2. 在导航窗格中,选择 Build projects

  3. 在构建项目列表中,选择 codebuild-demo-project,然后选择 Start build (启动构建)

  4. Start build (启动构建) 页面上,选择 Start build (启动构建)

  5. 向前跳至 步骤 7:查看汇总的构建信息

运行构建 (AWS CLI)

  1. 使用 AWS CLI 运行 start-build 命令:

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

    project-name 替换为上一步中的构建项目名称 (如 codebuild-demo-project)。

  2. 如果成功,输出中将显示与以下内容类似的数据:

    { "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:2.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:查看汇总的构建信息

在此步骤中,您将查看有关生成状态的汇总信息。

您可以使用 AWS CodeBuild 控制台AWS CLI 完成此步骤。

查看汇总的构建信息 (控制台)

  1. 如果未显示 codebuild-demo-project:build-ID 页面,请在导航栏中,选择 Build history (构建历史记录)。接下来,在生成项目列表中,对于 Project (项目),选择 codebuild-demo-projectBuild run (生成运行) 链接。应该只有一个匹配的链接。(如果您以前完成过本演练,请选择最近值的 Completed (已完成) 列中的链接。)

  2. 在构建详细信息页面上的 Phase details 中,应显示构建阶段的列表,并且 Status 列中的值为 Succeeded

    • SUBMITTED

    • QUEUED

    • PROVISIONING

    • DOWNLOAD_SOURCE

    • INSTALL

    • PRE_BUILD

    • BUILD

    • POST_BUILD

    • UPLOAD_ARTIFACTS

    • FINALIZING

    • COMPLETED

    Build Status (构建状态) 中,应显示 Succeeded (已成功)

    如果您看到的是 In Progress (正在进行),请选择刷新按钮以查看最新进度。

  3. 在每个构建阶段的旁边,Duration 值表示构建阶段持续的时间。End time (结束时间) 值表示生成阶段的结束时间。

    向前跳至 步骤 8:查看详细的构建信息

查看汇总的构建信息 (AWS CLI)

使用 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:2.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 在生成过程中运行的一组生成阶段。有关每个生成阶段的信息将分别列出,其中包含:startTimeendTimedurationInSeconds (采用 Unix 时间格式的生成阶段开始时间和结束时间,以及生成阶段的持续时间,以秒为单位),以及 phaseType (如 SUBMITTEDPROVISIONINGDOWNLOAD_SOURCEINSTALLPRE_BUILDBUILDPOST_BUILDUPLOAD_ARTIFACTSFINALIZINGCOMPLETED),还有 phaseStatus (如 SUCCEEDEDFAILEDFAULTTIMED_OUTIN_PROGRESSSTOPPED)。首次运行 batch-get-builds 命令时,可能不会有很多 (或没有) 阶段。使用相同构建 ID 再次运行 batch-get-builds 命令后,输出中应当会出现更多构建阶段。

    • logs 表示 Amazon CloudWatch Logs 中有关构建日志的信息。

    • md5sumsha256sum 表示构建输出项目的 MD5 和 SHA-256 哈希值。只有在生成项目的 packaging 值设置为 ZIP 时,这些内容才会显示在输出中。(在本演练中您未设置此值。) 您可以将这些哈希值和校验和工具一起使用,确认文件的完整性和真实性。

      注意

      您还可以使用 Amazon S3 控制台查看这些哈希值。选中构建输出项目旁边的框,然后依次选择 ActionsProperties。在 Properties 窗格中,展开 Metadata,然后查看 x-amz-meta-codebuild-content-md5x-amz-meta-codebuild-content-sha256 的值。(在 Amazon S3 控制台中,构建输出项目的 ETag 值不应解释为 MD5 或 SHA-256 哈希值。)

      如果您使用 AWS 开发工具包来获取这些哈希值,这些值会被命名为 codebuild-content-md5codebuild-content-sha256

    • endTime 表示构建过程结束的时间,采用 Unix 时间格式。

步骤 8:查看详细的构建信息

在此步骤中,您将查看有关 CloudWatch Logs 中生成项目的详细信息。

您可以使用 CodeBuild 控制台或 AWS CLI 控制台完成此步骤。

查看详细的构建信息 (控制台)

  1. 上一步完成后,构建详细页面继续显示,Build logs 中显示了构建日志的最后 10,000 行内容。要在 CloudWatch Logs 中查看完整构建日志,请选择 View entire log (查看完整日志) 链接。

  2. 在 CloudWatch Logs 日志流中,您可以浏览日志事件。默认情况下,只显示最近的一组日志事件。要查看以前的日志事件,请滚动到列表开头。

  3. 在本演练中,大多数日志事件包含的都是关于 CodeBuild 下载构建相关文件并将其安装到构建环境中的详细信息,您可能并不关心这些信息。您可以使用 Filter events 框来减少显示的信息。例如,如果您在 Filter events (筛选事件) 框中输入 "[INFO]",则只显示包含 [INFO] 的事件。有关更多信息,请参阅Amazon CloudWatch User Guide中的筛选器和模式语法

向前跳至 步骤 9:获取构建输出项目

查看详细的构建信息 (AWS CLI)

  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)。

  2. 在 CloudWatch Logs 日志流中,您可以浏览日志事件。默认情况下,只显示最近的一组日志事件。要查看以前的日志事件,请滚动到列表开头。

  3. 在本演练中,大多数日志事件包含的都是关于 CodeBuild 下载构建相关文件并将其安装到构建环境中的详细信息,您可能并不关心这些信息。您可以使用 Filter events 框来减少显示的信息。例如,如果您在 Filter events (筛选事件) 框中输入 "[INFO]",则只显示包含 [INFO] 的事件。有关更多信息,请参阅 Amazon CloudWatch User Guide中的筛选器和模式语法

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:获取构建输出项目

在此步骤中,您会得到 CodeBuild 生成并上传到输出存储桶的 messageUtil-1.0.jar 文件。

您可以使用 CodeBuild 控制台Amazon S3 控制台完成此步骤。

获取构建输出项目 (CodeBuild 控制台)

  1. 上一步完成后,CodeBuild 控制台仍处于打开状态,生成详细信息页面也继续显示,在 Build Status (构建状态) 中,选择 View artifacts (查看构件) 链接。这将打开 Amazon S3 中用于构建输出项目的文件夹。(如果未显示构建详细信息页面,请在导航栏中选择 Build history,然后选择 Build run 链接。)

  2. 打开名为 target 的文件夹,您可以在此处找到名为 messageUtil-1.0.jar 的生成输出项目文件。

    向前跳至 步骤 10:清除

获取构建输出项目 (Amazon S3 控制台)

  1. Open the Amazon S3 console at https://console.amazonaws.cn/s3/.

  2. 打开名为 codebuild-region-ID-account-ID-output-bucket 的存储桶。

  3. 打开名为 codebuild-demo-project 的文件夹。

  4. 打开名为 target 的文件夹,您可以在此处找到名为 messageUtil-1.0.jar 的生成输出项目文件。

步骤 10:清除

为防止您的 AWS 账户持续产生费用,您可以删除本演练中使用的输入存储桶。有关说明,请参阅 Amazon Simple Storage Service Developer Guide 中的删除或清空存储桶

如果您使用 IAM 用户而不是 AWS 根账户或管理员 IAM 用户来删除此存储桶,则该用户必须拥有额外的访问权限。(不建议使用 AWS 根账户。) 将标记 (### BEGIN ADDING STATEMENT HERE ###### END ADDING STATEMENTS HERE ###) 之间的下列语句添加到用户的现有访问策略中。为简洁起见,使用了省略号 (...)。请勿删除现有访问策略中的任何语句。请勿在策略中输入这些省略号。

{ "Version": "2012-10-17", "Id": "...", "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Effect": "Allow", "Action": [ "s3:DeleteBucket", "s3:DeleteObject" ], "Resource": "*" } ### END ADDING STATEMENT HERE ### ] }

后续步骤

在本演练中,您使用 AWS CodeBuild 将 一组 Java 类文件构建为一个 JAR 文件。然后查看了构建的结果。

您现在可以按照 规划构建 中的说明,尝试在自己的方案中使用 CodeBuild。如果您觉得自己还没准备好,可以尝试生成一些示例。有关更多信息,请参阅示例