CodeBuild 入门 - Amazon CodeBuild
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

CodeBuild 入门

在以下教程中,您可以使用 Amazon CodeBuild 将示例源代码输入文件的集合构建到源代码的可部署版本中。

两个教程具有相同的输入和结果,但一个教程使用的是 Amazon CodeBuild 控制台,另一个教程使用的是 Amazon CLI。

重要

建议您不要使用 Amazon 根账户来完成本教程。

通过控制台开始使用 Amazon CodeBuild

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

您可以通过如下方式使用 CodeBuild:CodeBuild 控制台、Amazon CodePipeline、Amazon CLI 或 Amazon 开发工具包。本教程演示如何使用 CodeBuild 控制台。有关使用 CodePipeline 的信息,请参阅 将 CodeBuild 与 CodePipeline 结合使用

重要

本教程中的步骤要求您创建可能会对您的 Amazon 账户产生费用的资源(例如,S3 存储桶)。这包括 CodeBuild 可能产生的费用,以及与 Amazon S3、Amazon KMS 和 CloudWatch Logs 相关的 Amazon 资源和操作可能产生的费用。有关更多信息,请参阅 Amazon CodeBuild 定价Amazon S3 定价Amazon Key Management Service 定价Amazon CloudWatch 定价

步骤 1:创建源代码

(一部分:通过控制台开始使用 Amazon CodeBuild

在此步骤中,您将创建需要 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()); } }

    此类文件用于将 message 类中的 MessageUtil 变量设置为 Robert。然后,通过检查输出中是否出现字符串 messageRobert 来测试是否成功设置 Hi!Robert 变量。

  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

步骤 2:创建 buildspec 文件

(上一步:步骤 1:创建源代码

在此步骤中,您将创建一个构建规范 (build spec) 文件。buildspec 是构建命令和相关设置的集合,采用 YAML 格式,由 CodeBuild 用来运行构建任务。如果没有 buildspec,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
重要

因为 buildspec 声明必须为有效的 YAML,所以 buildspec 声明中的空格至关重要。如果 buildspec 声明中的空格数与此不匹配,则构建可能会立即失败。您可以使用 YAML 验证程序测试 buildspec 声明是否为有效的 YAML。

注意

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

在此 buildspec 声明中:

  • version 表示正在使用的 buildspec 标准的版本。此 buildspec 声明使用最新版本 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 创建和存储构建输出构件的方式来命名的。在您自己的构建项目中,这些文件和目录名称会有所不同。

有关更多信息,请参阅Buildspec 参考

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

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

步骤 3:创建两个 S3 存储桶

(上一步:步骤 2:创建 buildspec 文件

尽管您可以为本教程使用单个存储桶,但使用两个存储桶使您可以更容易地查看构建输入的来源以及构建输出的去向。

  • 其中一个存储桶(输入存储桶)用于存储构建输入。在本教程中,此输入存储桶的名称为 codebuild-region-ID-account-ID-input-bucket,其中 region-ID 是存储桶的 Amazon 区域,account-ID 是您的 Amazon 账户 ID。

  • 另一个存储桶(输出存储桶)用于存储构建输出。在本教程中,此输出存储桶的名称为 codebuild-region-ID-account-ID-output-bucket

如果您为这些存储桶选择了不同的名称,请务必在本教程中使用它们。

这两个存储桶必须与您的构建项目处在同一个 Amazon 区域中。例如,如果您指示 CodeBuild 在美国东部(俄亥俄州)区域运行构建任务,则存储桶也必须位于美国东部(俄亥俄州)区域中。

有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的创建存储桶

注意

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

步骤 4:上传源代码和 buildspec 文件

(上一步:步骤 3:创建两个 S3 存储桶

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

使用操作系统的 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 的 buildspec 文件,或者将 buildspec 声明作为构建项目定义的一部分包含。请勿创建包含存储库源代码和 buildspec 文件的 ZIP 文件。

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

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

步骤 5:创建构建项目

(上一步:步骤 4:上传源代码和 buildspec 文件

在此步骤中,您将创建一个构建项目,Amazon CodeBuild 将使用它来运行构建项目。构建项目包含有关如何运行构建的信息,包括从何处获取源代码、要使用的构建环境、要运行的构建命令以及将构建输出存储在何处。构建环境是 CodeBuild 用于运行构建的操作系统、编程语言运行时和工具的组合。构建环境以 Docker 映像的形式表示。有关更多信息,请参阅 Docker 文档网站上的 Docker 概述

对于此构建环境,您需要指示 CodeBuild 使用包含 Java 开发工具包 (JDK) 和 Apache Maven 的 Docker 映像。

创建构建项目
  1. 登录 Amazon Web Services 管理控制台 并打开 Amazon CodeBuild 控制台 (https://console.aws.amazon.com/codesuite/codebuild/home)。

  2. 使用 Amazon 区域选择器选择支持 CodeBuild 的 Amazon 区域。有关更多信息,请参阅 Amazon Web Services 一般参考 中的 Amazon CodeBuild 端点和配额

  3. 如果显示了 CodeBuild 信息页面,请选择创建构建项目。否则,请在导航窗格中,展开构建,选择构建项目,然后选择创建构建项目

  4. 创建构建项目页面上的项目配置中,对于项目名称,输入此构建项目的名称(在此示例中为 codebuild-demo-project)。构建项目名称在您的各个 Amazon 账户内必须是唯一的。如果您使用其他名称,请确保在本教程中通篇使用它。

    注意

    创建构建项目页面上,您可能会看到类似于以下内容的错误消息:您没有权限执行此操作。最可能的原因是,您用来登录 Amazon Web Services 管理控制台 的用户身份无权创建构建项目。要修复此问题,请从 Amazon Web Services 管理控制台 注销,然后使用属于以下任一 IAM 实体的凭证重新登录:

    这两个选项都可让您获得创建构建项目所需的管理员权限,以便您能够完成本教程。建议您始终使用完成任务所需的最低权限。有关更多信息,请参阅 Amazon CodeBuild 权限参考

  5. 中,对于源提供商,选择 Amazon S3

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

  7. 对于 S3 对象键,输入 MessageUtil.zip

  8. 环境中,对于环境映像,让托管映像处于选中状态。

  9. 对于操作系统,选择 Amazon Linux

  10. 对于运行时,选择标准

  11. 对于映像,选择 aws/codebuild/amazonlinux-x86_64-standard:corretto11

  12. 服务角色中,将新建服务角色保持选中状态,并将角色名称保持不变。

  13. 对于 buildspec,将使用 buildspec 文件保留为选中状态。

  14. 构件中,对于类型,选择 Amazon S3

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

  16. 名称路径留空。

  17. 选择创建构建项目

步骤 6:运行构建

(上一步:步骤 5:创建构建项目

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

运行构建
  1. https://console.aws.amazon.com/codesuite/codebuild/home 打开 Amazon CodeBuild 控制台。

  2. 在导航窗格中,选择构建项目

  3. 在构建项目列表中,选择 codebuild-demo-project,然后选择启动构建。构建会立即开始。

步骤 7:查看汇总的构建信息

(上一步:步骤 6:运行构建

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

查看汇总的构建信息

  1. 如果未显示 codebuild-demo-project:<build-ID> 页面,请在导航栏中,选择构建历史记录。接下来,在构建项目列表中,对于项目,选择与 codebuild-demo-project 对应的构建运行链接。应该只有一个匹配的链接。(如果您之前已完成本教程,请在已完成列中选择具有最新值的链接。)

  2. 构建状态页面上,在阶段详细信息中,应显示以下构建阶段,并且状态列中为已成功

    • SUBMITTED

    • QUEUED

    • PROVISIONING (正在预置

    • DOWNLOAD_SOURCE

    • INSTALL

    • PRE_BUILD

    • BUILD

    • POST_BUILD

    • UPLOAD_ARTIFACTS

    • FINALIZING

    • COMPLETED

    构建状态中,应显示已成功

    如果您看到的是正在进行,请选择刷新按钮。

  3. 在每个构建阶段的旁边,持续时间值表示构建阶段持续的时间。结束时间值表示构建阶段的结束时间。

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

(上一步:步骤 7:查看汇总的构建信息

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

注意

为了保护敏感信息,CodeBuild 日志中隐藏以下内容:

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

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

  3. 在本教程中,大多数日志事件包含的是关于 CodeBuild 下载构建相关文件并将其安装到构建环境中的详细信息,您可能并不关心这些信息。您可以使用筛选事件框来减少显示的信息。例如,如果您在筛选事件中输入 "[INFO]",则仅显示那些包含 [INFO] 的事件。有关更多信息,请参阅《Amazon CloudWatch 用户指南》中的筛选条件和模式语法

步骤 9:获取构建输出构件

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

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

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

获取构建输出构件(Amazon CodeBuild 控制台)
  1. 上一步完成后,CodeBuild 控制台仍处于打开状态,构建详细信息页面也继续显示,您可以选择构建详细信息选项卡并滚动到构件部分。

    注意

    如果未显示构建详细信息页面,请在导航栏中选择构建历史记录,然后选择构建运行链接。

  2. 指向 Amazon S3 文件夹的链接位于构件上传位置下方。该链接会打开 Amazon S3 文件夹,您可以在这里找到 messageUtil-1.0.jar 构建输出构件文件。

获取构建输出构件(Amazon S3 控制台)
  1. 通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 打开 codebuild-region-ID-account-ID-output-bucket

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

  4. 打开 target 文件夹,您可以在此处找到 messageUtil-1.0.jar 构建输出构件文件。

步骤 10:删除 S3 存储桶

(上一步:步骤 9:获取构建输出构件

为防止您的 Amazon 账户持续产生费用,您可以删除本教程中使用的输入和输出存储桶。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的删除或清空存储桶

如果您使用 IAM 用户或管理员 IAM 用户删除这些存储桶,则该用户必须具有更多访问权限。将标记(### BEGIN ADDING STATEMENT HERE ###### END ADDING STATEMENTS HERE ###)之间的下列语句添加到用户的现有访问策略中。

此语句中的省略号 (...) 旨在力求简洁。请勿删除现有访问策略中的任何语句。请勿在策略中输入这些省略号。

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

总结

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

您现在可以尝试在自己的场景中使用 CodeBuild。按照计划构建中的说明进行操作。如果您觉得自己还没准备好,可以尝试构建一些示例。有关更多信息,请参阅 基于使用场景的 CodeBuild 示例

通过 Amazon CodeBuild 开始使用 Amazon CLI

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

您可以通过如下方式使用 CodeBuild:CodeBuild 控制台、Amazon CodePipeline、Amazon CLI 或 Amazon 开发工具包。本教程演示如何将 CodeBuild 与 Amazon CLI 结合使用。有关使用 CodePipeline 的信息,请参阅将 CodeBuild 与 CodePipeline 结合使用

重要

本教程中的步骤要求您创建可能会对您的 Amazon 账户产生费用的资源(例如,S3 存储桶)。这包括 CodeBuild 可能产生的费用,以及与 Amazon S3、Amazon KMS 和 CloudWatch Logs 相关的 Amazon 资源和操作可能产生的费用。有关更多信息,请参阅 CodeBuild 定价Amazon S3 定价Amazon Key Management Service 定价Amazon CloudWatch 定价

步骤 1:创建源代码

(一部分:通过 Amazon CodeBuild 开始使用 Amazon CLI

在此步骤中,您将创建需要 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()); } }

    此类文件用于将 message 类中的 MessageUtil 变量设置为 Robert。然后,通过检查输出中是否出现字符串 messageRobert 来测试是否成功设置 Hi!Robert 变量。

  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

步骤 2:创建 buildspec 文件

(上一步:步骤 1:创建源代码

在此步骤中,您将创建一个构建规范 (build spec) 文件。buildspec 是构建命令和相关设置的集合,采用 YAML 格式,由 CodeBuild 用来运行构建任务。如果没有 buildspec,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
重要

因为 buildspec 声明必须为有效的 YAML,所以 buildspec 声明中的空格至关重要。如果 buildspec 声明中的空格数与此不匹配,则构建可能会立即失败。您可以使用 YAML 验证程序测试 buildspec 声明是否为有效的 YAML。

注意

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

在此 buildspec 声明中:

  • version 表示正在使用的 buildspec 标准的版本。此 buildspec 声明使用最新版本 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 创建和存储构建输出构件的方式来命名的。在您自己的构建项目中,这些文件和目录名称会有所不同。

有关更多信息,请参阅Buildspec 参考

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

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

步骤 3:创建两个 S3 存储桶

(上一步:步骤 2:创建 buildspec 文件

尽管您可以为本教程使用单个存储桶,但使用两个存储桶使您可以更容易地查看构建输入的来源以及构建输出的去向。

  • 其中一个存储桶(输入存储桶)用于存储构建输入。在本教程中,此输入存储桶的名称为 codebuild-region-ID-account-ID-input-bucket,其中 region-ID 是存储桶的 Amazon 区域,account-ID 是您的 Amazon 账户 ID。

  • 另一个存储桶(输出存储桶)用于存储构建输出。在本教程中,此输出存储桶的名称为 codebuild-region-ID-account-ID-output-bucket

如果您为这些存储桶选择了不同的名称,请务必在本教程中使用它们。

这两个存储桶必须与您的构建项目处在同一个 Amazon 区域中。例如,如果您指示 CodeBuild 在美国东部(俄亥俄州)区域运行构建任务,则存储桶也必须位于美国东部(俄亥俄州)区域中。

有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的创建存储桶

注意

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

步骤 4:上传源代码和 buildspec 文件

(上一步:步骤 3:创建两个 S3 存储桶

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

使用操作系统的 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 的 buildspec 文件,或者将 buildspec 声明作为构建项目定义的一部分包含。请勿创建包含存储库源代码和 buildspec 文件的 ZIP 文件。

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

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

步骤 5:创建构建项目

(上一步:步骤 4:上传源代码和 buildspec 文件

在此步骤中,您将创建一个构建项目,Amazon CodeBuild 将使用它来运行构建项目。构建项目包含有关如何运行构建的信息,包括从何处获取源代码、要使用的构建环境、要运行的构建命令以及将构建输出存储在何处。构建环境是 CodeBuild 用于运行构建的操作系统、编程语言运行时和工具的组合。构建环境以 Docker 映像的形式表示。有关更多信息,请参阅 Docker 文档网站上的 Docker 概述

对于此构建环境,您需要指示 CodeBuild 使用包含 Java 开发工具包 (JDK) 和 Apache Maven 的 Docker 映像。

创建构建项目
  1. 使用 Amazon CLI 运行 create-project 命令:

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

    输出中将显示 JSON 格式的数据。将数据复制到已安装 create-project.json 的本地计算机或实例上某个位置的名为 Amazon CLI 的文件中。如果您选择使用其他文件名,请务必在本教程中使用该名称。

    按照以下格式修改所复制的数据,然后保存结果:

    { "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 资源名称 (ARN)(如 arn:aws:iam::account-ID:role/role-name)。要创建该文件,请参阅 允许 CodeBuild 与其他 Amazon 服务进行交互

    在此数据中:

    • 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:5.0 表示 CodeBuild Docker 映像存储库中的 Docker 映像)。aws/codebuild/standard 是 Docker 映像的名称。5.0 是 Docker 映像的标签。

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

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

    注意

    原始 JSON 格式数据中的其他可用值,如 descriptionbuildspecauth (包括 typeresource)、pathnamespaceTypename (对于 artifacts)、packagingenvironmentVariables (包括 namevalue)、timeoutInMinutesencryptionKeytags (包括 keyvalue) 为可选的值。本教程中未使用这些值,因此它们没有在这里显示。有关更多信息,请参阅 创建构建项目 (Amazon 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: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。这很可能是因为您在使用用户的凭证配置 Amazon CLI 时,该用户没有足够的权限,无法使用 CodeBuild 创建构建项目。要修复此问题,请使用属于以下任一 IAM 实体的凭证配置 Amazon CLI:

步骤 6:运行构建

(上一步:步骤 5:创建构建项目

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

运行构建
  1. 使用 Amazon 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: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:查看汇总的构建信息

(上一步:步骤 6:运行构建

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

查看汇总的构建信息
  • 使用 Amazon 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 在构建过程中运行的一组构建阶段。有关每个构建阶段的信息将分别列出,其中包含: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 控制台查看这些哈希值。选中构建输出构件旁边的框,然后依次选择操作属性。在属性窗格中,展开元数据,然后查看 x-amz-meta-codebuild-content-md5x-amz-meta-codebuild-content-sha256 的值。(在 Amazon S3 控制台中,构建输出构件的 ETag 值不应解释为 MD5 或 SHA-256 哈希值。)

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

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

    注意

    Amazon S3 元数据有一个名为 x-amz-meta-codebuild-buildarn 的 CodeBuild 标头,其中包含将构件发布到 Amazon S3 的 CodeBuild 构建的 buildArn。添加 buildArn 是为了允许对通知进行源跟踪并引用生成构件的构建。

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

(上一步:步骤 7:查看汇总的构建信息

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

注意

为了保护敏感信息,CodeBuild 日志中隐藏以下内容:

查看详细的构建信息
  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 下载构建相关文件并将其安装到构建环境中的详细信息,您可能并不关心这些信息。您可以使用筛选事件框来减少显示的信息。例如,如果您在筛选事件中输入 "[INFO]",则仅显示那些包含 [INFO] 的事件。有关更多信息,请参阅《Amazon CloudWatch 用户指南》中的筛选条件和模式语法

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

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

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

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

获取构建输出构件(Amazon CodeBuild 控制台)
  1. 上一步完成后,CodeBuild 控制台仍处于打开状态,构建详细信息页面也继续显示,您可以选择构建详细信息选项卡并滚动到构件部分。

    注意

    如果未显示构建详细信息页面,请在导航栏中选择构建历史记录,然后选择构建运行链接。

  2. 指向 Amazon S3 文件夹的链接位于构件上传位置下方。该链接会打开 Amazon S3 文件夹,您可以在这里找到 messageUtil-1.0.jar 构建输出构件文件。

获取构建输出构件(Amazon S3 控制台)
  1. 通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 打开 codebuild-region-ID-account-ID-output-bucket

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

  4. 打开 target 文件夹,您可以在此处找到 messageUtil-1.0.jar 构建输出构件文件。

步骤 10:删除 S3 存储桶

(上一步:步骤 9:获取构建输出构件

为防止您的 Amazon 账户持续产生费用,您可以删除本教程中使用的输入和输出存储桶。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的删除或清空存储桶

如果您使用 IAM 用户或管理员 IAM 用户删除这些存储桶,则该用户必须具有更多访问权限。将标记(### BEGIN ADDING STATEMENT HERE ###### END ADDING STATEMENTS HERE ###)之间的下列语句添加到用户的现有访问策略中。

此语句中的省略号 (...) 旨在力求简洁。请勿删除现有访问策略中的任何语句。请勿在策略中输入这些省略号。

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

总结

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

您现在可以尝试在自己的场景中使用 CodeBuild。按照计划构建中的说明进行操作。如果您觉得自己还没准备好,可以尝试构建一些示例。有关更多信息,请参阅 基于使用场景的 CodeBuild 示例