1. 简介

AWS CodeBuild 是一项在云中完全托管的构建服务。CodeBuild 可编译源代码,运行单元测试,并构建可供部署的项目。

CodeBuild 使您无需预置、管理和扩展自己的构建服务器。它提供了适用于常用编程语言的预先打包的构建环境以及 Apache Maven 和 Gradle 等构建工具。

您还可以在 CodeBuild 中自定义构建环境以使用您自己的构建工具。CodeBuild 可自动扩展以满足峰值构建请求。

CodeBuild 具有以下优势:

  • 完全托管 – 利用 CodeBuild,您无需设置、修补、更新和管理自己的构建服务器。
  • 按需 – CodeBuild 可以按需扩展以满足您的构建需求。您只需为使用的构建分钟数付费。
    • 免费套餐:每月 100 分钟的 build.general1.small 构建操作时间。CodeBuild 免费套餐不会在为期 12 个月的 AWS 免费套餐结束时自动过期。它可供新的和现有 AWS 客户使用。
  • 开箱即用 – CodeBuild 提供了适用于最热门编程语言的预配置构建环境。您只需指向您的构建脚本以开始首次构建即可。

CodeBuild 的工作原理:

  1. 作为输入,您必须为 CodeBuild 提供构建项目。
  2. CodeBuild 使用构建项目创建构建环境。
  3. CodeBuild将源代码下载到构建环境中,然后使用构建项目中定义的或源代码中直接包含的构建规范 (buildspec)。
  4. 如果存在任何构建输出,则该构建环境会将其输出上传到 S3 存储桶。构建环境也可以执行您在构建规范中指定的任务(例如,将构建通知发送到 Amazon SNS 主题)。
  5. 在构建运行时,构建环境会将信息发送到 CodeBuild 和 Amazon CloudWatch Logs。
  6. 在构建运行时,您可以使用 AWS CodeBuild 控制台、AWS CLI 或 AWS SDKs 从 CodeBuild 中获取汇总的构建信息,并从 Amazon CloudWatch Logs 中获取详细的构建信息。如果您使用 AWS CodePipeline 运行构建,则可以从 CodePipeline 获取有限的构建信息。

    1. ![](https://cdn.nlark.com/yuque/0/2020/png/1471554/1605160068578-239bae4b-199c-494f-922e-f7a0c109138d.png#align=left&display=inline&height=380&margin=%5Bobject%20Object%5D&originHeight=380&originWidth=550&size=0&status=done&style=shadow&width=550)

2. CodeBuild 入门示例

2.1 创建两个 S3 存储桶

使用两个存储桶使您可以更容易地查看构建输入的来源以及构建输出的去向。

  • 其中一个存储桶(输入存储桶)用于存储构建输入: codebuild-region-ID-account-ID-input-bucket
  • 另一个存储桶(输出存储桶)用于存储构建输出: codebuild-region-ID-account-ID-output-bucket

这两个存储桶必须与您的生成项目处在同一个 AWS 区域中。

2.2 创建源代码

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

  1. 在您的本地计算机或实例上的空目录中,创建此目录结构。image.png
  2. 创建 MessageUtil.java ,然后保存在 src/main/java 目录中。

    1. MessageUtil 构造函数用于设置字符串;
    2. printMessage 方法用于创建输出;
    3. salutationMessage 方法用于输出 Hi! 后跟字符串; ```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; } } ```

  3. 创建 TestMessageUtil.java ,然后将它保存在 /src/test/java 目录中;

    1. 此类文件将 message 类中的 MessageUtil 变量设置为 Robert。
    2. 然后,它通过检查输出中是否显示字符串 message 和 Robert 来进行测试,以查看 Hi!Robert 变量是否已成功设置。 ```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()); } }

  1. 4. 创建 `pom.xml` ,然后保存在根 (顶级) 目录中;
  2. 1. Maven 通过此 pom 构建 JAR 包,然后运行指定测试;
  3. ```xml
  4. <project xmlns="http://maven.apache.org/POM/4.0.0"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  7. <modelVersion>4.0.0</modelVersion>
  8. <groupId>org.example</groupId>
  9. <artifactId>messageUtil</artifactId>
  10. <version>1.0</version>
  11. <packaging>jar</packaging>
  12. <name>Message Utility Java Sample App</name>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. <scope>test</scope>
  19. </dependency>
  20. </dependencies>
  21. <build>
  22. <plugins>
  23. <plugin>
  24. <groupId>org.apache.maven.plugins</groupId>
  25. <artifactId>maven-compiler-plugin</artifactId>
  26. <version>3.8.0</version>
  27. </plugin>
  28. </plugins>
  29. </build>
  30. </project>
  1. 最终目录结构

image.png

2.3 创建 buildspec 文件

buildspec 是一个 YAML 文件,包含了构建命令和相关配置,如果没有 buildspec.yaml 构建规范,CodeBuild 就无法将您的构建输入成功转换为构建输出,也无法在构建环境中找到构建输出项目以上传到输出存储桶中。

buildspec.yaml 保存在根(顶级)目录:

  1. version: 0.2
  2. phases:
  3. install:
  4. runtime-versions:
  5. java: corretto11
  6. pre_build:
  7. commands:
  8. - echo Nothing to do in the pre_build phase...
  9. build:
  10. commands:
  11. - echo Build started on `date`
  12. - mvn install
  13. post_build:
  14. commands:
  15. - echo Build completed on `date`
  16. artifacts:
  17. files:
  18. - target/messageUtil-1.0.jar

在此生成规范声明中:

  • version 表示正在使用的生成规范标准的版本。此生成规范声明使用最新版本 0.2
  • phases 表示您可以指示 CodeBuild 运行命令的生成阶段。这些构建阶段在这里列出为 installpre_buildbuildpost_build。 您无法更改这些构建阶段名称的拼写,也无法创建更多构建阶段名称。
    本示例中,在 build 阶段,CodeBuild 运行 mvn install 命令。此命令指示 Apache Maven 编译和测试 Java 类文件,然后将编译完的文件打包为构建输出项目。出于完整性考虑,本示例的每个构建阶段中都放了几条 echo 命令。您稍后查看本教程中详细的构建信息时,这些 echo 命令的输出可以帮助您更好地理解 CodeBuild 运行命令的方式以及顺序。(尽管此示例中包含了所有构建阶段,但如果您不打算在某个构建阶段运行任何命令,则无需包含该构建阶段。) 对于每个构建阶段,CodeBuild 按照列出的顺序,从头到尾运行每个指定命令(一次运行一个命令)。
  • artifacts 表示 CodeBuild 上传到输出存储桶的一组构建输出项目。files 表示要包含在构建输出中的文件。CodeBuild 上传在构建环境的 messageUtil-1.0.jar 相对目录中找到的单个 target 文件。文件 messageUtil-1.0.jar 和目录 target 只是根据本示例中 Apache Maven 创建和存储构建输出项目的方式来命名的。在您自己的生成项目中,这些文件和目录名称会有所不同。

此时,您的目录结构应如下所示:image.png

2.4 上传源代码和构建规范文件

使用操作系统的 ZIP 实用工具,创建一个名为 MessageUtil.zip 的文件,其中包含 MessageUtil.java、TestMessageUtil.java、pom.xml 和 buildspec.yml。image.png :::info 重要
请不要包含 (root directory name) 目录,而只包含 (root directory name) 目录中的目录和文件。 :::

MessageUtil.zip 文件上传至名为 codebuild-region-ID-account-ID-input-bucket输入存储桶中

2.5 创建构建项目

image.png
image.png
image.png
image.png
image.png
image.png

2.6 启动构建

image.png

2.7 查看构建信息

image.png