使用 AWS(Amazon Web Services)实现无服务器 CI/CD 管道。

2025-06-11

使用 AWS(Amazon Web Services)实现无服务器 CI/CD 管道。

本系列文章重点介绍如何使用 AWS 服务实现无服务器 CI/CD。在实施过程中,我们将介绍许多新的 AWS 服务。由于主题的复杂性,本文分为两部分。您将阅读第一部分,我们将在其中实现持续集成(CodeBuild 项目、CodePipeline 以及使用 Jest 的测试用例)。

要遵循本文中提到的步骤,您应该拥有自己的AWS 免费套餐帐户

在开始实施本系列文章之前您应该了解什么?

  1. 对git 工作流程有基本的了解
  2. 我们正在使用CodeBuildCodePipelineS3无服务器框架等实现 CI/CD。因此您需要对这些 AWS 服务有充分的了解。
  3. 如果您陷入困境,好奇心可以帮助您摆脱障碍。

如果您不了解 AWS 服务,我会尝试尽可能简单地向您解释。

让我们深入了解 CI/CD

什么是持续集成(CI)/持续交付(CD)?

持续集成 (CI)是软件开发的一个开发和测试阶段。当开发人员对软件代码进行更改时,这些更改会立即被签入共享源代码。代码签入后,会触发自动构建流程和测试,以确保更改不会破坏软件应用程序。它帮助我们更快地发现编码错误,从而避免在代码合并到共享源代码之前出现错误。

持续交付(CD)意味着随着编码的改变、新功能或错误修复通过自动构建测试,我们必须在将更改发布到用户端之前进行一组配置并尽可能快速地交付。

在本文中,我们将创建一个体重观察应用程序,该应用程序每天询问体重,并将该体重存储在数据库中。

我们将在 GitHub 上创建一个新的仓库。weight-watchers为仓库命名,无需填写描述,直接点击 即可Create Repository Button。成功创建weight-watchers仓库后,我们就可以将其克隆到本地机器上,编写代码了。您可以根据自己的方便,使用 SSH 或 HTTP 方式克隆仓库。

如果你坚持克隆存储库,请点击此链接来帮助你

git clone git@github.com:sagar-gavhane/weight-watchers.git

为了简单起见,我们使用 GitHub。如果您想使用 CodeCommit,请随意在 AWS CodeCommit 上创建一个存储库并克隆它。

什么是 AWS CodeCommit?

AWS CodeCommit 是由 Amazon Web Services 托管的版本控制服务,可用于在云端私密存储和管理源代码。可以说,它是GitHub 的替代方案,唯一的区别在于您无法将存储库公开。与其他版本控制服务相比,CodeCommit 与 CodeBuild 和 CodePipeline 的集成度更高。

将必要的文件和包添加到项目

添加 .gitignore 文件以忽略运行时生成的跟踪文件夹和文件,或一些机密文件,以避免上传到存储库。将https://www.gitignore.io/api/node的原始内容粘贴到创建的 .gitignore 文件中。

touch .gitignore && gedit .gitignore

让我们使用 npm init 命令创建一个 package.json 文件。

npm init --y

我们使用 express-js 创建 API 端点。通过以下命令安装项目依赖项。

npm install aws-sdk body-parser express serverless-http --save

好的,等一下,让我快速解释一下项目依赖关系。

aws-sdk - aws-sdk 提供 AWS 服务的 API,可用于构建应用程序。该 API 允许开发人员构建使用 AWS 服务的库或应用程序。不同语言有不同的 aws-sdk,我们使用的是 JavaScript 语言的 aws-sdk。

body-parser - body-parser 提取传入请求流的整个主体部分,并将其公开到 req.body 中。这意味着我们使用 post 方法发送的任何数据都存储在 req.body 中。

express - Express 是一个轻量级的 Web 应用程序框架,可帮助您在服务器端将 Web 应用程序组织成 MVC 架构。我们使用它来创建 API 端点。

serverless-http - serverless-http 模块允许您“包装” Express API 以用于无服务器应用。它不处理任何 HTTP 服务器、端口或套接字。

再一步,让buildspec.yml我们在项目中添加一个文件,创建一个名为 buildspec.yml 的文件,并添加以下代码片段。稍后,我将向您解释 buildspec 文件在 CI/CD 流水线中的作用。

构建规范.yml

version: 0.2
phases:
  install:
    commands:
      - npm install
      - npm test
Enter fullscreen mode Exit fullscreen mode

现在是将更改提交到存储库的好时机。请继续阅读下一部分,了解如何创建可靠的 CI/CD 流水线。

git add . && git commit -m "initial commit"

git push origin master

设置 S3 存储桶(简单存储服务)

Amazon S3 是一个对象存储平台,用于存储和检索来自任何位置的任意数量的数据。在开始创建管道之前,我们必须设置一个 S3 存储桶来存储构建工件。构建工件是指构建过程中输出的文件,我们希望保存这些文件以备将来使用。

前往 AWS 控制台,从服务下拉菜单中选择 S3 服务,点击“创建存储桶”并输入存储桶名称。这里我使用的是weight-watchers-artifacts。因此,我添加了-artifacts“S3 bucket”以便更容易找到我的存储桶。S3 bucket 名称是唯一的,因此您必须输入后缀随机数。选择一个区域,然后点击“下一步”。将 S3 bucket 的默认设置保留原样。

s3存储桶创建快照

我强烈建议在本文中只选择一个区域。我坚持使用美国东部(弗吉尼亚北部)区域,并且检查一下你选择的区域中是否提供必要的服务。

配置 AWS CodeBuild 项目

AWS CodeBuild 是一项持续集成服务,它可以编译源代码、运行测试并生成可部署的软件包。我们只需要使用适当的设置创建 CodeBuild 项目。

CodeBuild 快照优先

从服务下拉菜单中找到 CodeBuild 服务,进入 CodeBuild 仪表板后,点击“创建项目”按钮。为了方便命名,我已为weight-watchers-builder项目命名。选择 GitHub 作为源提供商(如果您使用的是 CodeCommit,请选择 CodeCommit)。系统会提示您进行 GitHub 身份验证,请验证您的 GitHub 帐户。输入您的仓库完整 URL,我输入的是https://github.com/sagar-gavhane/weight-watchers仓库 URL。在Source: What to build本节中,其余设置请默认跳过。

CodeBuild 如何构建

转到Environment: How to build本节。选择构建环境有两种方式:使用 AWS CodeBuild 镜像或指定的 Docker 镜像。我坚持使用 AWS CodeBuild 镜像。我选择了 Ubuntu 作为操作系统,Node.js 作为运行时环境,并指定了特定的运行时版本aws/codebuild/nodejs:8.11.0

构建规范,我们将使用buildspec.yml位于存储库根目录中的文件。现在只需选择Use the buildspec.yml in the source code root directorybuildspec name即可buildspec.yml

如果您了解建筑设置,那么请随意根据您的要求切换设置。

CodeBuild 工件

现在,是时候告诉我们的 CodeBuild 项目将工件保存到我们创建的 S3 存储桶中了。Artifacts: Where to put the artifacts from this build project在“类型”部分中,选择“名称” Amazon S3,并将路径设置为空。存储桶名称,我将选择“压缩”格式weight-watchers-artifacts,并将工件打包为 zip 文件。

其余设置:缓存、服务角色和 VPC。本文无需对缓存和 VPC 进行任何设置。

CodeBuild 服务角色

转到Service role本节。在本节中,我们将需要一个 IAM 服务角色,当您的构建运行时,它将承担此角色。此服务角色将授予其将日志写入 CloudWatch 和将工件写入 S3 的权限。选择create a service role in your account它将为我们创建一个服务角色。我已将角色名称指定为codebuild-weight-watchers-builder-service-role

好的,我们不需要更改任何高级设置。点击continue按钮查看我们目前为止的构建内容。

CodeBuild 审查

恭喜!!您已成功创建 CodeBuild 项目。稍事休息,我知道坚持读到这里很难,但我们会一步步提升我们的知识和技能。

配置 CodePipeline

AWS CodePipeline 是一项持续交付服务,可帮助我们快速可靠地交付功能和更新。您可以定义发布流程工作流,并描述新代码更改在发布过程中的进展情况。

管道由一系列阶段(例如,构建、测试和部署)组成。每个阶段由一系列操作组成,这些操作是诸如构建代码或部署到测试环境之类的任务。

理论讲得够多了!让我们专注于创建我们自己的管道。从服务下拉菜单中选择 CodePipeline。CodePipeline 的创建分为 6 个步骤:命名、来源、构建、部署、服务角色、审核。

CodePipeline 名称

在步骤中Name,输入您的管道名称,作为命名约定,我将选择管道名称,然后weight-watchers-pipeline点击下一步按钮。

CodePipeline 源

在步骤中Source,选择源提供商作为 GitHub 存储库(如果您在 CodeCommit 上创建了存储库,则选择 CodeCommit)。系统将提示您进行 GitHub 身份验证。请验证您的 GitHub 帐户。身份验证成功后,您就可以输入存储库名称和分支名称了。我将使用http://github.com/sagar-gavhane/weight-watchersmaster 作为存储库名称和分支名称。跳过Change detection options此部分,然后进入下一步。

CodePipeline 构建

在 中Build step,选择您想要使用的构建提供商,我坚持使用 CodeBuild。转到Configure your project部分,选择您的项目构建器名称。我们已经在本文开头创建了一个项目构建器,因此我将选择它,weight-watchers-builder然后进入下一步。

CodePipeline 部署

在 中Deploy step,选择要提供的部署No Deployment。稍后我们将编辑管道并添加一个部署阶段。转到下一步。

CodePipeline 服务角色

在步骤中Service Role,我们的管道需要一个角色,该角色授予访问 CodeBuild 项目并监视 CloudWatch 事件的权限。现在,我们选择现成的服务角色AWS-CodePipeline-Service。但是,如果您选择的自定义角色配置不正确,AWS CodePipeline 可能无法按预期工作。

CodePipeline 评论

完成,您已完成 CodePipeline 配置,只需快速检查管道,然后点击创建管道按钮。

恭喜!您的管道已成功创建。

使用 Jest 配置测试环境。

Jest 是一个令人愉快的 JavaScript 测试框架,由开源贡献者和 Facebook 员工社区创建和维护。

使用 jestjs 编写一个简单的单元测试,检查给定的数字是否为素数。在__test__目录中创建一个名为的文件primeNumber.test.js,并复制粘贴以下代码片段。在代码片段中,我们编写了一个函数,如果给定的数字为素数,则返回 true,否则返回 false。

在编写代码之前,安装 jestjs 作为开发依赖项。

npm install jest --save-dev

primeNumber.test.js

function isPrime(num) {
  for (var i = 2; i < num; i++) if (num % i === 0) return false;
  return num !== 1;
}

describe("test prime number", () => {
  it("17 is a prime number", () => {
    expect(isPrime(17)).toBe(true);
  });
});
Enter fullscreen mode Exit fullscreen mode

对我们的 package.json 文件进行一些小修改,并像在脚本部分中一样添加脚本。我们必须在 CodeBuild 执行期间运行 npm test 命令。"test":
"jest"

"scripts": {
  "test": "jest"
},`
Enter fullscreen mode Exit fullscreen mode

CodePipeline 完成

好的!无论您在本地机器上对项目做了什么修改weight-watcher,请将更改提交到 GitHub 并在weight-watchers-pipeline管道中检查发布变更。如果两个阶段都成功通过,您就创建了自己的 CI 管道。

感谢您阅读这篇文章,我理解您可能遇到了问题,或者对本文有好的建议。别忘了点赞并评论您的问题或反馈。

下一篇文章我们将实现CD(持续交付),欢迎随时关注。祝您拥有美好的一天!

祝您编码愉快...

鏂囩珷鏉ユ簮锛�https://dev.to/sagar/implement-a-serverless-cicd-pipeline-with-aws-amazon-web-services-438f
PREV
通过 Context 在 React 中实现暗黑模式
NEXT
Web Worker 的工作原理(实际示例)