使用 亚马逊云科技 CodeBuild 在私有子网中运行 GitHub 操作

作者: 布莱恩·比奇 |

上周,开发者工具团队宣布, 亚马逊云科技 CodeBuild 现在支持 GitHub Actions。 亚马逊云科技 Code Build 是一项完全托管的持续集成服务,允许您构建和测试代码。CodeBuild 编译版本被定义为 YAML 格式的编译命令和相关设置的集合,称为 BuildSpec。现在,你可以直接在 BuildSpec 中定义 GitHub 操作步骤,并将它们与 CodeBuild 命令一起运行。在这篇文章中,我将使用 Liquibase GitHub Ac tion在私有子网中部署对 Amazon Aurora 数据库的更改。

背景

GitHub Marketplace 包含由第三方和开源社区开发的大量操作目录。在撰写本文时,市场上有近20,000个动作可用。使用市场上的操作可以为您节省时间和精力,而这些时间和精力将花在编写构建过程中所需的各种工具的安装和配置上。

虽然我喜欢 GitHub 操作,但我经常想在 亚马逊云科技 中运行我的构建。例如,我可能想访问私有 VPC 中的资源,或者只是减少构建服务和我的资源之间的延迟。我可以通过 在 亚马逊弹性计算云(亚马逊 EC2) 上托管 GitHub Action Runner 来实现这一点 。但是,托管 GitHub Action 运行器需要额外的精力来配置和维护托管运行器的环境。

亚马逊云科技 CodeBuild 是一项完全托管的持续集成服务。CodeBuild 不需要持续维护,它可以 访问私有子网 中的资源 。你现在可以在 亚马逊云科技 CodeBuild 中使用 GitHub 操作了。此功能通过丰富的 GitHub Actions 市场简化了 CodeBuild 的配置和管理。在下一节中,我将解释如何配置 CodeBuild 以运行 GitHub 操作。

草率排练

在本演练中,我将配置 亚马逊云科技 CodeBuild 以使用 Liquibase GitHub Action 将变更日志部署到托管在私有子网中的亚马逊 Aurora 上的 PostgreSQL 数据库。如下图所示,亚马逊云科技 CodeBuild 将被配置为与我的 Aurora 实例一起在私有子网中运行。首先,CodeBuild 将使用 NAT 网关下载 GitHub 操作来访问互联网。其次,CodeBuild 会将变更日志应用到私有子网中的 Aurora 实例。

Architecture diagram showing CodeBuild and Aurora in a private subnet with internet access provided by a NAT gateway

我已经有一个 GitHub 存储库,里面有 Liquibase 的配置属性和变更日志,如下图所示。Liquibase 配置不是这篇博客文章的重点,但你可以在 Li qu ibase 入门 中阅读更多内容。我的来源还包括buildspec.yaml文件,我将在本文后面解释。

GitHub repository with Liquibase change set

要创建我的构建项目,我在 亚马逊云科技 控制台中打开 CodeBu ild ,然后选择 创建构建项目 。然后,我为构建提供名称和可选描述。我的项目名为 li quibas e-blog-post。

如果您已经连接到 GitHub,则可以使用 个人访问令牌 进行 连接 ,如下图所示。

GitHub configuration in CodeBuild showing the GitHub personal access token

成功连接到 GitHub 后,我可以将 URL 粘贴到我的存储库中,如下图所示。

CodeBuild configuration showing the GitHub repository URL

我将我的构建环境配置为使用 Amazon Linux 2 上的标准构建环境。GitHub 操作是使用 JavaScript 或 Docker 容器构建的。如果操作使用 Docker 容器,则必须启用 特权标 志。Liquibase 镜像使用的是 Docker 容器,因此,我选中该复选框以启用特权模式。

Environment configuration showing the standard image on Linux and the privileged flag enabled.

对于 VPC 配置,我选择托管我的 Aurora 实例的 VPC 和私有子网,然后单击 验证 VPC 设置 以确保我的配置正确无误。

VPC configuration with private subnet selected

我的 Buildspec 文件包含在源代码中。因此,我选择 “ 使用构建规范文件”, 然后在存储库中输入构建规范文件的路径。

Buildspec configuration with Use a build spec file selected

我的 buildspec.yaml 文件包含以下内容。请注意, pre_build 阶段包括一系列命令。 CodeBuild 一直支持命令,包括一系列要运行的命令行命令。在这种情况下,我只是记录一些环境变量以供以后调试。

version: 0.2
phases:
  pre_build:
    commands:
      - echo $AWS_DEFAULT_REGION
      - echo $URL
  build: 
    steps:
      - uses: liquibase-github-actions/update@v4.21.1
        with:
          changelogFile: changelog-root.xml
          url: ${{ env.URL }}
          username: postgres
          password: ${{ $env.PASSWORD }}
          headless: true

另请注意, 构建 阶段包括一系列 步骤 。步骤是新的,用于运行 GitHub 操作。每个构建阶段都支持命令列表或步骤列表,但不能同时支持两者。在此示例中,我使用一些配置参数指定了 Liquibase 更新操作(liquib ase-github-actions/ update)。你可以在 GitHub 上的 Li quibase 更新操作存储库中看到完整的 参数列表。

我想提请你注意我的 buildspec .yml 中使用的环境变量。请注意,我将数据库的 URL 和密码作为环境变量传递。这使我可以轻松地将这些值从一个环境更改到另一个环境。我已经在 CodeBuild 项目定义中配置了这些环境变量,如下图所示。URL 配置为纯文本,密码配置为密钥管理器。在 CodeBuild 中运行 GitHub 操作还有一个好处,那就是我可以轻松访问存储在 亚马逊云科技 Secrets Manager 中的密钥 和存储在 A WS Systems Manager 参数存储 中的配置数据。

Environment Variables used to configure the URL and PASSWORD.

还需要注意的是,在使用 GitHub 操作时,用于访问 buildspec.yaml 中的环境变量的语法 是不同的。GitHub 操作使用环境 上下文访问 环境 变量 。因此,在 pre_build 阶段,我使用的是 CodeBuild 语法,格式为 $NAME。 但是,在 构建 阶段,我使用的是 GitHub 语法,格式为 $ {{env: Name}}。

配置完成后,我选择 创建构建项目, 然后手动启动构建以测试配置。在以下示例中,您可以看到来自 Liquibase 更新的日志。请注意,两个变更集已成功应用于数据库。


####################################################
##   _     _             _ _                      ##
##  | |   (_)           (_) |                     ##
##  | |    _  __ _ _   _ _| |__   __ _ ___  ___   ##
##  | |   | |/ _` | | | | | '_ \ / _` / __|/ _ \  ##
##  | |___| | (_| | |_| | | |_) | (_| \__ \  __/  ##
##  \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___|  ##
##              | |                               ##
##              |_|                               ##
##                                                ##
##  Get documentation at docs.liquibase.com       ##
##  Get certified courses at learn.liquibase.com  ##
##  Free schema change activity reports at        ##
##      https://hub.liquibase.com                 ##
##                                                ##
####################################################
Starting Liquibase at 18:33:23 (version 4.21.1 #9070)
Liquibase Version: 4.21.1
Liquibase Open Source 4.21.1 by Liquibase
Running Changeset: changelogs/changelog-1.0.0.xml::1::BobR
Running Changeset: changelogs/changelog-1.0.1.xml::2::BobR
  
UPDATE SUMMARY
Run: 2
Previously run: 0
Filtered out: 0
-------------------------------
Total change sets: 2
  
Liquibase: Update has been successful.
Liquibase command 'update' was executed successfully.
  
Phase complete: BUILD State: SUCCEEDED
Phase context status code: Message:
Entering phase POST_BUILD

如果我连接到 Aurora 数据库并描述这些表,你会看到 Liquibase 已经创建了 角色表(定义见 Liquibase 快速入门 )以及 Li quibase 审计 表 databas echangeloglog 和 datab asechangeloglock。 一切都按我的预期运行,而且我不必安装和配置 Liquibase!


mydatabase=> \dt
List of relations
Schema  |         Name          | Type  |  Owner
--------+-----------------------+-------+----------
public  | actor                 | table | postgres
public  | databasechangelog     | table | postgres
public  | databasechangeloglock | table | postgres
(3 rows)

在这个示例中,我向你展示了如何使用在 CodeBuild 中运行的 Liquibase GitHub Action 更新私有子网中的 Aurora 数据库。GitHub 操作提供了丰富的预配置操作目录,简化了配置。CodeBuild 提供托管服务,可简化我的构建环境的配置和维护。结合使用我可以获得 CodeBuild 和 GitHub Actions 的最佳功能。

清理

在这篇演练中,我向你展示了如何创建 CodeBuild 项目。如果您不再需要该项目,则只需在控制台中将其删除即可。如果您创建了本文中未解释的其他资源,例如 Aurora 数据库,则还应将其删除。

结论

GitHub Marketplace 包含由第三方和开源社区开发的近 20,000 个操作的目录。亚马逊云科技 CodeBuild 是一项完全托管的持续集成服务,可与其他 亚马逊云科技 服务紧密集成。在这篇文章中,我使用了适用于 Liquibase 的 GitHub Action 将更新部署到私有子网中的数据库。我很高兴看到在 CodeBuild 中支持 GitHub Actions 时你会做什么。你可以在 亚马逊云科技 Code Build 的 GitHub 操作运行 器中详细了解这项激动人心的新功能。