使用 AWS 和 AW CodePipeline S CDK 设置 CI/CD 管道 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS 和 AW CodePipeline S CDK 设置 CI/CD 管道

创建者:Konstantin Zarudaev (AWS)、Cizer Pereira (AWS)、Lars Kinder (AWS) 和 Yasha Dabas (AWS)

代码存储库: CodePipeline 带有 CI/CD 的 AWS

环境:PoC 或试点

技术: DevOps

工作负载:开源

AWS 服务:AWS CodePipeline

主页

通过持续交付 (CI/CD) 实现软件构建和发布过程的自动化,支持可重复构建和向用户快速交付新功能。您可快速轻松测试每个代码更改,也可以在发布软件之前捕捉并修复错误。通过在暂存和发布过程中运行每项更改,您可验证应用程序或基础设施代码的质量。CI/CD 体现了一种文化、一套操作原则以及一系列实践,可帮助应用程序开发团队更频繁、更可靠地交付代码变更。该实现也被称之为 CI/CD 管线。

此模式定义了 Amazon Web Services (AWS) 上可重复使用的持续集成和持续交付 (CI/CD) 管线。AWS CodePipeline 管道是使用 AW S Cloud Development Kit (AWS CDK) v2 编写的。

使用 CodePipeline,您可以通过 AWS 管理控制台界面、AWS 命令行界面 (AWS CLI)、AWS 或 AWS 软件开发工具包对软件发布过程的不同阶段进行建模。 CloudFormation此模式演示了使用 AWS CDK 的实现 CodePipeline 及其组件。除了构造库外,AWS CDK 还包括一个工具包(CLI 命令 cdk),它是与您的 AWS CDK 应用程序交互的主要工具。除其他功能外,该工具包还提供将一个或多个堆栈转换为 CloudFormation 模板并将其部署到 AWS 账户的功能。

该管线包括验证第三方库安全性的测试,有助于确保在指定环境中快速、自动发布。您可通过对应用程序进行验证来提高应用程序的整体安全性。

这种模式的目的是加快您使用 CI/CD 管道来部署代码,同时确保您部署的资源符合 DevOps 最佳实践。实施示例代码后,您将拥有一个 AWS, CodePipeline其中包含整理、测试、安全检查、部署和部署后流程。此模式还包括 Makefile 步骤。通过 Makefile,开发人员可以在本地重现 CI/CD 步骤并提高开发过程的速度。

先决条件和限制

先决条件

  • 一个有效的 Amazon Web Services account

  • 基本定义如下:

    • AWS CDK

    • AWS CloudFormation

    • AWS CodePipeline

    • TypeScript

限制

此模式 TypeScript 仅将 AWS CDK 用于。它不包含 AWS CDK 支持的其他语言。

产品版本

使用以下工具的最新版本:

  • AWS 命令行界面(AWS CLI)

  • cfn_nag

  • git-remote-codecommit

  • Node.js

架构

目标技术堆栈

  • AWS CDK

  • AWS CloudFormation

  • AWS CodeCommit

  • AWS CodePipeline

目标架构

该管道由 AWS CodeCommit 存储库的更改触发 (SampleRepository)。一开始, CodePipeline 构建工件,更新自身,然后启动部署过程。生成的管线将解决方案部署至三个独立的环境:

  • 开发 – 在活跃的开发环境进行三步代码检查

  • 测试 - 集成和回归测试环境

  • Prod – 生产环境

开发阶段包含的三个步骤是 linting、安全性和单元测试。这些步骤并行运行,以加快流程。为确保管线仅提供可运行的构件,每当流程中的某个步骤失败时,它就会停止运行。开发阶段部署后,管线运行验证测试以验证结果。如果成功,管线会将构件部署到测试环境,其中包含部署后验证。最后一步是将构件部署至 Prod 环境。

下图显示了从 CodeCommit 存储库到由执行的构建和更新过程的工作流程 CodePipeline、三个开发环境步骤,以及三个环境中每个环境中的后续部署和验证。

开发环境包括 linting、安全和单元测试,所有这些都包括部署和验证。

工具

Amazon Web Services

  • AWS Cloud Development Kit (AWS CDK) 是一个软件开发框架,可帮助您在代码中定义和预调配 Amazon Web Services Cloud 基础设施。

  • AWS CloudFormation 可帮助您设置 AWS 资源,快速一致地配置这些资源,并在 AWS 账户和区域的整个生命周期中对其进行管理。在这种模式中, CloudFormation 模板可用于创建 CodeCommit 存储库和 C CodePipeline I/CD 管道。

  • AWS CodeCommit 是一项版本控制服务,可帮助您私下存储和管理 Git 存储库,而无需管理自己的源代码控制系统。

  • AWS CodePipeline 是一项 CI/CD 服务,可帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件更改所需的步骤。

  • AWS 命令行界面(AWS CLI)是一种开源工具,它可帮助您通过命令行 Shell 中的命令与 Amazon Web Services 交互。

其他工具

  • cfn_nag 是一个开源工具,可在 CloudFormation 模板中查找模式以识别潜在的安全问题。

  • git-remote-codecommit是一个通过扩展 Git 从 CodeCommit 存储库中推送和提取代码的实用工具。

  • Node.js 是一个事件驱动的 JavaScript 运行时环境,专为构建可扩展的网络应用程序而设计。

代码

此模式的代码可在 GitHub AWS CodePipeline with CI/CD 实践存储库中找到。

最佳实践

查看资源(例如 AWS Identity and Access Management (IAM) 策略),以确认它们符合您的组织最佳实践。

操作说明

任务描述所需技能

在 macOS 或 Linux 上安装工具。

如果您使用的是 macOS 或 Linux,则可以通过在首选终端中运行以下命令或使用 Homebrew for Linux 安装这些工具。

brew install brew install git-remote-codecommit brew install ruby brew-gem brew-gem install cfn-nag
DevOps 工程师

通过 AWS Cloud9 安装工具。

如果您使用 AWS Cloud9,请运行以下命令来安装这些工具。

gem install cfn-nag

注意:AWS Cloud9 应该安装 Node.js 和 npm。要检查安装或版本,请运行以下命令。

node -v npm -v
DevOps 工程师

设置 AWS CLI。

要设置 AWS CLI,请使用适合操作系统的说明:

DevOps 工程师
任务描述所需技能

下载或克隆代码。

要获取此模式使用的代码,请执行以下操作之一:

  • 从 GitHub repo 的版本中下载最新的源代码,然后将下载的文件解压缩到一个文件夹中。

  • 通过运行以下命令克隆项目。

git clone --depth 1 https://github.com/aws-samples/aws-codepipeline-cicd.git

从克隆的存储库中删除 .git 目录。

cd ./aws-codepipeline-cicd rm -rf ./.git

稍后,您将使用新创建的 AWS CodeCommit 存储库作为远程来源。

DevOps 工程师

连接至 Amazon Web Services account。

您可使用临时安全令牌或登录区身份验证进行连接。要确认您使用的是正确的账户和 AWS 区域,请运行以下命令。

AWS_REGION="eu-west-1" ACCOUNT_NUMBER=$(aws sts get-caller-identity --query Account --output text) echo "${ACCOUNT_NUMBER}"
DevOps 工程师

引导环境。

要引导 AWS CDK 环境,请运行以下命令。

npm install npm run cdk bootstrap "aws://${ACCOUNT_NUMBER}/${AWS_REGION}"

成功引导环境后,应该显示以下输出。

⏳ Bootstrapping environment aws://{account}/{region}... ✅ Environment aws://{account}/{region} bootstrapped

有关更多信息,请参阅 AWS CDK 文档中的 AWS CDK 引导

DevOps 工程师

合成模板。

要合成 AWS CDK 应用程序,请使用 cdk synth 命令。

npm run cdk synth

您应当看到如下输出。

Successfully synthesized to <path-to-directory>/aws-codepipeline-cicd/cdk.out Supply a stack id (CodePipeline, Dev-MainStack) to display its template.
DevOps 工程师

部署 CodePipeline 堆栈。

现在,您已经引导并合成了 CloudFormation 模板,可以对其进行部署。部署将创建 CodePipeline 管道和 CodeCommit 存储库,这将是管道的来源和触发器。

npm run cdk -- deploy CodePipeline --require-approval never

运行命令后,您应该会看到 CodePipeline 堆栈的成功部署和输出信息。CodePipeline.RepositoryName为您提供 AWS 账户中 CodeCommit 存储库的名称。

CodePipeline: deploying... CodePipeline: creating CloudFormation changeset... ✅ CodePipeline Outputs: CodePipeline.RepositoryName = SampleRepository Stack ARN: arn:aws:cloudformation:REGION:ACCOUNT-ID:stack/CodePipeline/STACK-ID
DevOps 工程师

设置远程 CodeCommit 存储库和分支。

成功部署后, CodePipeline 将启动管道的首次运行,您可以在 AWS CodePipeline 控制台中找到该管道。由于 AWS CDK 且 CodeCommit 不启动默认分支,因此此初始管道运行将失败并返回以下错误消息。

The action failed because no branch named main was found in the selected AWS CodeCommit repository SampleRepository. Make sure you are using the correct branch name, and then try again. Error: null

要修复此错误,请将远程源设置为 SampleRepository,然后创建所需 main 分支。

RepoName=$(aws cloudformation describe-stacks --stack-name CodePipeline --query "Stacks[0].Outputs[?OutputKey=='RepositoryName'].OutputValue" --output text) echo "${RepoName}" # git init git branch -m master main git remote add origin codecommit://${RepoName} git add . git commit -m "Initial commit" git push -u origin main
DevOps 工程师
任务描述所需技能

提交更改,以激活管线。

成功完成初始部署后,您应该拥有完整的 CI/CD 管线,其中包含一个 main 分支 SampleRepository 作为源分支。一旦您提交对 main 分支的更改,管线就会启动并运行以下操作序列:

  1. 从 CodeCommit 存储库中获取您的代码。

  2. 构建您的代码。

  3. 更新管线本身 (UpdatePipeline)。

  4. 运行三个并行作业以进行 linting、安全性和单元测试检查。

  5. 如果成功,管线会将 Main 堆栈从 ./lib/main-stack.ts 部署至开发环境。

  6. 对已部署资源进行部署后检查。您可以在 CodePipeline 控制台中按照所有 CodePipeline 步骤和结果进行操作。

  7. 成功后,管线将对测试和生产环境重复部署和验证。

DevOps 工程师
任务描述所需技能

使用 Makefile 运行开发过程。

您可使用 make 命令在本地运行整个管线,也可以运行单个步骤(例如 make linting)。

要使用 make 进行测试,请执行以下操作:

  • 实现本地管线:make

  • 仅运行单元测试:make unittest

  • 部署到当前账户:make deploy

  • 清理环境:make clean

应用程序开发者、 DevOps 工程师
任务描述所需技能

删除 AWS CDK 应用程序资源。

要清理您的 AWS CDK 应用程序,请运行以下命令。

cdk destroy --all

请注意,引导启动期间创建的 Amazon Simple Storage Service (Amazon S3) 存储桶将不会自动删除。它们需要允许删除的保留策略,或者您需要在您的 Amazon Web Services account 中手动删除它们。

DevOps 工程师

故障排除

问题解决方案

该模板未按预期工作。

如果出现问题且模板无法正常工作,请确保您具备以下条件:

  • 工具的正确版本。

  • 访问目标 Amazon Web Services account (网络连接)。

  • 有足够的权限访问 Amazon Web Services account。

相关资源