

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

# 自动检测变化并为 monorepo 启动不同的 CodePipeline 管道 CodeCommit
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit"></a>

*Helton Ribeiro、Petrus Batalha 和 Ricardo Morais，Amazon Web Services*

## Summary
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-summary"></a>

**注意**： AWS Cloud9 已不再向新客户开放。的现有客户 AWS Cloud9 可以继续照常使用该服务。[了解详情](https://aws.amazon.com/blogs/devops/how-to-migrate-from-aws-cloud9-to-aws-ide-toolkits-or-aws-cloudshell/)

这种模式可以帮助您自动检测基于 monorepo 的应用程序的源代码的更改，然后在其中启动运行持续集成 AWS CodeCommit 和持续交付（管道）的CI/CD) automation for each microservice. This approach means that each microservice in your monorepo-based application can have a dedicated CI/CD管道，从而确保更好的可见性、更轻松的代码共享以及改进的协作、标准化和可发现性。 AWS CodePipeline 

此模式中描述的解决方案不会在 monorepo 内部的微服务之间执行任何依赖关系分析。它仅检测源代码中的更改并启动匹配的 CI/CD 管道。

该模式 AWS Cloud9 用作集成开发环境 (IDE)，并使用两个 CloudFormation 堆栈 AWS Cloud Development Kit (AWS CDK) 来定义基础架构：`MonoRepoStack`和`PipelinesStack`。`MonoRepoStack`堆栈在中创建 monorepo AWS CodeCommit 和启动管道的 AWS Lambda 函数。 CI/CD `PipelinesStack` 堆栈定义了管道基础设施。

**重要**  
此模式的工作流是概念验证（PoC）。我们建议您仅将其用在测试环境中。如果您想在生产环境中使用此模式的方法，请参阅 AWS Identity and Access Management (IAM) 文档[中的 IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)，并对您的 IAM 角色和进行必要的更改 AWS 服务。 

## 先决条件和限制
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户。
+ AWS Command Line Interface (AWS CLI)，已安装并配置。有关更多信息，请参阅 AWS CLI 文档 AWS CLI中的[安装、更新和卸载](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。 
+ Python 3 和 `pip`，已安装于本地计算机。有关更多信息，请参阅 [Python 文档](https://www.python.org/)。 
+ AWS CDK，已安装并配置。有关更多信息，请参阅 AWS CDK 文档[AWS CDK中的入门](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)。 
+ 已安装和配置的 AWS Cloud9 IDE。有关更多信息，请参阅 AWS Cloud9 文档 AWS Cloud9中的[设置](https://docs.aws.amazon.com/cloud9/latest/user-guide/setting-up.html)。 
+  GitHub [AWS CodeCommit monorepo 多管道触发器](https://github.com/aws-samples/monorepo-multi-pipeline-trigger)存储库，克隆到您的本地计算机上。 
+ 包含要用来生成和部署的应用程序代码的现有目录 CodePipeline。
+ 熟悉 DevOps 最佳实践并有经验. AWS 云为了增加对它的熟悉程度 DevOps，你可以使用 “[使用 DevOps 实践和 AWS 规范指南” AWS Cloud9网站上的 “构建与微服务松散耦合的架构](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/build-a-loosely-coupled-architecture-with-microservices-using-devops-practices-and-aws-cloud9.html)” 模式。 

## 架构
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-architecture"></a>

下图显示了如何使用 AWS CDK 来定义具有两个 AWS CloudFormation 堆栈的基础架构：`MonoRepoStack`和。`PipelinesStack`

![\[使用 AWS CDK 定义包含两个 CloudFormation 堆栈的基础设施的工作流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a3397158-a208-4033-844e-969af13ae8b6/images/b0bb1094-b598-4b3d-ab8b-ad9b0eb45f38.png)


下图显示了如下工作流：

1. 引导过程使用创建 AWS CloudFormation 堆栈和`MonoRepoStack`。 AWS CDK `PipelinesStack`

1. `MonoRepoStack`堆栈会为您的应用程序创建 CodeCommit 存储库，并在每次提交后启动的 `monorepo-event-handler` Lambda 函数。

1. `PipelinesStack`堆栈在 CodePipeline 其中创建由 Lambda 函数启动的管道。每项微服务都必须有定义的基础设施管道。

1. 的管道`microservice-n`由 Lambda 函数启动，并根据中的源代码启动其隔离 CI/CD 阶段。 CodeCommit

1. 的管道`microservice-1`由 Lambda 函数启动，并根据中的源代码启动其隔离 CI/CD 阶段。 CodeCommit

下图显示了 AWS CloudFormation 堆栈`MonoRepoStack`和账户`PipelinesStack`中的部署情况。

![\[在 AWS 账户 MonoRepoStack PipelinesStack 中部署 CloudFormation 堆栈。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a3397158-a208-4033-844e-969af13ae8b6/images/39e60e49-dea2-486d-8a2c-6cae438f69b4.png)


1. 用户在其中一个应用程序微服务中更改代码。

1. 用户将更改从本地存储库推送到 CodeCommit 存储库。

1. 推送活动启动 Lambda 函数，该函数接收所有到存储库的推送。 CodeCommit 

1. Lambda 函数在 Parameter Store（ AWS Systems Manager的一项功能）中读取参数，以检索最新的提交 ID。此参数的命名格式为：`/MonoRepoTrigger/{repository}/{branch_name}/LastCommit`。如果未找到该参数，Lambda 函数会从 CodeCommit 存储库中读取最后一次提交 ID，并将返回的值保存在参数存储中。

1. 识别提交 ID 和更改的文件后，Lambda 函数会识别每个微服务目录的管道并启动所需的管道。 CodePipeline 

## 工具
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-tools"></a>
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)是一个软件开发框架，用于在代码中定义云基础架构并通过它进行配置 CloudFormation。
+ [Python](https://www.python.org/) 是一种可让您快速工作并更高效地集成系统的编程语言。

**代码**

此模式的源代码和模板可在 GitHub [AWS CodeCommit monorepo 多管道](https://github.com/aws-samples/monorepo-multi-pipeline-trigger)触发器存储库中找到。

## 最佳实践
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-best-practices"></a>
+ 此示例架构不包括对已部署基础设施的监控解决方案。如果您要在生产环境中部署此解决方案，建议您启用监控。有关更多信息，请参阅 AWS Serverless Application Model (AWS SAM) 文档中的[使用 Application Insights 监控您的无服务器 CloudWatch 应用程序](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/monitor-app-insights.html)。
+ 编辑此模式提供的示例代码时，请遵循 AWS CDK 文档中[开发和部署云基础设施的最佳实践](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)。
+ 定义微服务管道时，请查看 AWS CodePipeline 文档中的[安全最佳实践](https://docs.aws.amazon.com/codepipeline/latest/userguide/security-best-practices.html)。
+ 您也可以使用 [cdk-na](https://github.com/cdklabs/cdk-nag) g 实用程序检查 AWS CDK 代码以了解最佳实践。此工具使用一组按包分组的规则来评估您的代码。可用的包有：
  + [AWS 解决方案库](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#awssolutions)
  + [健康保险流通与责任法案（HIPAA）安全](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#hipaa-security)
  + [美国国家标准与技术研究院（NIST）800-53 Rev 4](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#nist-800-53-rev-4)
  + [NIST 800-53 第 5 版](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#nist-800-53-rev-5)
  + [支付卡行业数据安全标准 (PCI DSS) 3.2.1](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md#pci-dss-321)

## 操作说明
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-epics"></a>

### 设置环境
<a name="set-up-the-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建虚拟 Python 环境。 | 在 AWS Cloud9 IDE 中，通过运行以下命令创建虚拟 Python 环境并安装所需的依赖项：`make install` | 开发者版 | 
| Bootstrap AWS 账户 和 f AWS 区域 or. AWS CDK | 通过运行以下命令引导所需的 AWS 账户 区域和区域：`make bootstrap account-id=<your-AWS-account-ID> region=<required-region>` | 开发者版 | 

### 为微服务添加新管道
<a name="add-a-new-pipeline-for-a-microservice"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
|  将示例代码添加至应用程序目录。 | 将包含您的示例应用程序代码的目录添加到克隆的 GitHub [AWS CodeCommit monorepo 多](https://github.com/aws-samples/monorepo-multi-pipeline-trigger)管道触发器存储库中的`monorepo-sample`目录中。 | 开发者版 | 
| 编辑 `monorepo-main.json` 文件。 | 将应用程序代码目录名称和管道名称添加至克隆的存储库中的 `monorepo-main.json` 文件。 | 开发者版 | 
| 创建管道。 | 在适用于存储库的 `Pipelines` 目录中，为您的应用程序添加管道 `class`。该目录包含两个示例文件：`pipeline_hotsite.py` 和 `pipeline_demo.py`。每个文件都有三个阶段：源、构建和部署。您可以复制其中一个文件，并根据应用程序要求对其进行更改。  | 开发者版 | 
| 编辑 `monorepo_config.py` 文件。 | 在 `service_map` 中，添加应用程序的目录名称和为管道创建的分类。例如，以下代码显示了 `Pipelines` 目录中的管道定义，该定义使用名为 `pipeline_mysample.py` 的 `MySamplePipeline` 类文件：<pre>...<br /># Pipeline definition imports<br />from pipelines.pipeline_demo import DemoPipeline<br />from pipelines.pipeline_hotsite import HotsitePipeline<br />from pipelines.pipeline_mysample import MySamplePipeline<br /><br />### Add your pipeline configuration here<br />service_map: Dict[str, ServicePipeline]  = {<br />    # folder-name -> pipeline-class<br />    'demo': DemoPipeline(),<br />    'hotsite': HotsitePipeline(),<br />    'mysample': MySamplePipeline()<br />}</pre> | 开发者版 | 

### 部署堆 MonoRepoStack 栈
<a name="deploy-the-monorepostack-stack"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 AWS CloudFormation 堆栈。 | 通过运行`make deploy-core`命令将带有默认参数值的 AWS CloudFormation `MonoRepoStack`堆栈部署到克隆存储库的根目录中。您可以通过运行 `make deploy-core monorepo-name=<repo_name>` 命令更改存储库名称。您可以使用 `make deploy monorepo-name=<repo_name>` 命令同时部署两个管道。 | 开发者版 | 
| 验证 CodeCommit 存储库。 | 通过运行 `aws codecommit get-repository --repository-name <repo_name>` 命令验证资源是否已创建。由于 CloudFormation 堆栈会创建存储 monorepo 的存储 CodeCommit 库，因此如果您已开始向其中推送修改，请不要运行该`cdk destroy MonoRepoStack `命令。 | 开发者版 | 
| 验证 CloudFormation 堆栈结果。 | 通过运行以下命令验证 CloudFormation `MonoRepoStack`堆栈的创建和配置是否正确：<pre>aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE --query 'StackSummaries[?StackName == 'MonoRepoStack']'</pre> | 开发者版 | 

### 部署堆 PipelinesStack 栈
<a name="deploy-the-pipelinesstack-stack"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 CloudFormation 堆栈。 |  AWS CloudFormation `PipelinesStack`堆栈必须在部署堆`MonoRepoStack`栈后部署。当将新微服务添加至 monorepo 的代码库中时，堆栈的大小会增加，并在加入新微服务时重新部署。通过运行`make deploy-pipelines`命令部署 PipelinesStack 堆栈。您也可以通过运行 `make deploy monorepo-name=<repo_name>` 命令同时部署两个管道。以下示例输出显示了`PipelinesStacks`部署在 URLs 实现结束时如何打印微服务的内容：<pre>Outputs:<br />PipelinesStack.demourl = .cloudfront.net<br />PipelinesStack.hotsiteurl = .cloudfront.net</pre> | 开发者版 | 
| 验证 AWS CloudFormation 堆栈结果。 | 通过运行以下命令验证 AWS CloudFormation `PipelinesStacks`堆栈的创建和配置是否正确：<pre>aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE --query 'StackSummaries[?StackName == 'PipelinesStack']'</pre> | 开发者版 | 

### 清理 资源
<a name="clean-up-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除您的 AWS CloudFormation 堆栈。 | 运行 `make destroy`命令。 | 开发者版 | 
| 删除管道的 S3 存储桶。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html) | 开发者版 | 

## 问题排查
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 我遇到了 AWS CDK 问题。 | 请参阅 AWS CDK 文档中的[常见 AWS CDK 问题疑难解答](https://docs.aws.amazon.com/cdk/v2/guide/troubleshooting.html)。 | 
| 我推送了我的微服务代码，但微服务管道未运行。 | **设置验证***验证分支配置：*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)*验证配置文件：*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)**在控制台上排查问题***AWS CodePipeline 支票：*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)*AWS Lambda 疑难解答：*[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html) | 
| 我需要重新部署我所有的微服务。 | 有两种方法可强制重新部署所有微服务。选择适合您要求的选项。**方法 1：删除 Parameter Store 中的参数**此方法涉及删除 Systems Manager Parameter Store 中的特定参数，该参数跟踪上次用于部署的提交 ID。删除此参数后，系统将被迫在下次触发时重新部署所有微服务，因为它会将其视为刷新状态。步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)优点：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)缺点：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)**方法 2：在每个 monorepo 子文件夹中推送一个提交**此方法涉及进行细微的更改，然后将其推送到 monorepo 中的每个微服务子文件夹中，以启动其各自的管道。步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)优点：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html)缺点：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.html) | 

## 相关资源
<a name="automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit-resources"></a>
+ [使用 CDK Pipelines 进行持续集成和交付 (CI/CD)](https://docs.aws.amazon.com/cdk/latest/guide/cdk_pipeline.html)（文档）AWS CDK 
+ [aws-cdk/pipelines 模块（API 参考](https://docs.aws.amazon.com/cdk/api/latest/docs/pipelines-readme.html)AWS CDK 