

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

# 自动为 Java 和 Python 项目创建动态 CI 管道
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically"></a>

*Aromal Raj Jayarajan、Vijesh Vijayakumaran Nair、MAHESH RAGHUNANDANAN 和 Amarnath Reddy，Amazon Web Services*

## Summary
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-summary"></a>

此模式说明如何使用 AWS 开发人员工具自动为 Java 和 Python 项目创建动态持续集成（CI）管道。

随着技术堆栈的多样化和开发活动的增加，创建和维护在整个组织中保持一致的 CI 管道可能会变得困难。通过在 AWS Step Functions 中自动执行该流程，您可以确保 CI 管道的使用和方法保持一致。

为了自动创建动态 CI 管道，此模式使用以下变量输入：
+ 编程语言（仅限 Java 或 Python）
+ 管道名称
+ 所需管道阶段

**注意**  
Step Functions 使用多个 AWS 服务编排管道创建。有关此解决方案中使用的 Amazon Web Services 的更多信息，请参阅此模式的**工具**部分。

## 先决条件和限制
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 部署此解决方案的同一 AWS 区域 中的 Amazon S3 存储桶
+ 一个 AWS Identity and Access Management (IAM) [委托人](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)，拥有创建此解决方案所需资源所需的 AWS CloudFormation 权限

**限制**
+ 此模式仅支持 Java 和 Python 项目。
+ 在此模式中预置的 IAM 角色遵循最低权限原则。必须根据您的 CI 管道需要创建的特定资源更新 IAM 角色的权限。

## 架构
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-architecture"></a>

**目标技术堆栈**
+ AWS CloudFormation
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS CodePipeline
+ IAM
+ Amazon Simple Storage Service（Amazon S3）
+ AWS Systems Manager
+ AWS Step Functions
+ AWS Lambda
+ Amazon DynamoDB

**目标架构**

下图显示了使用 AWS 开发人员工具自动为 Java 和 Python 项目创建动态 CI 管道的示例工作流程。

![\[使用 AWS 工具自动为 Java 和 Python 项目创建动态 CI 管道的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/bef2ccb8-68b3-4c0f-9ee7-4b93e9422d9c/images/b5ed003f-cf16-4130-8bfb-2bc2cb9a0d33.png)


下图显示了如下工作流：

1. AWS 用户以 JSON 格式提供用于创建 CI 管道的输入参数。此输入将启动一个 Step Functions 工作流（*状态机*），该工作流使用 AWS 开发人员工具创建 CI 管道。

1. Lambda 函数读取名为 **input-reference** 的文件夹，该文件夹存储在 Amazon S3 存储桶中，然后生成 **buildspec.yml** 文件。此生成的文件定义了 CI 管道阶段，并存储回存储参数引用的同一 Amazon S3 存储桶中。

1. Step Functions 会检查 CI 管道创建工作流程的依赖关系是否存在任何更改，并根据需要更新依赖关系堆栈。

1. Step Functions 在 CloudFormation 堆栈中创建 CI 管道资源，包括 CodeCommit 存储库、 CodeBuild 项目和 CodePipeline 管道。

1.  CloudFormation 堆栈将所选技术堆栈（Java 或 Python）的示例源代码和 **buildspec.yml** 文件复制到存储库。 CodeCommit 

1. CI 管道运行时详细信息存储在 DynamoDB 表中。

**自动化和扩缩**
+ 此模式仅供在单个开发环境中使用。需要更改配置才能跨多个开发环境使用。
+ 要添加对多个 CloudFormation 堆栈的支持，您可以创建其他 CloudFormation 模板。有关更多信息，请参阅 CloudFormation 文档 CloudFormation中的 [AWS 入门](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.html)。

## 工具
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-tools"></a>

**工具**
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 是一项无服务器编排服务，可让您搭配使用 AWS Lambda 函数和其他 Amazon Web Services 来构建业务关键型应用程序。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，而无需预置或管理服务器。它仅在需要时运行您的代码，并且能自动扩缩，因此您只需为使用的计算时间付费。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管的构建服务，可帮助您编译源代码、运行单元测试和生成可随时部署的项目。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) 是一项版本控制服务，可帮助您私下存储和管理 Git 存储库，而无需管理自己的源代码控制系统。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可帮助您快速建模和配置软件发布的不同阶段，并自动执行持续发布软件变更所需的步骤。
+ [AWS Identity and Access Management (AWS IAM) ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)通过控制验证和授权使用您 AWS 资源的用户，帮助您安全地管理对您 AWS 资源的访问。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可帮助您创建和控制加密密钥，以帮助保护您的数据。
+ [Amazon Simple Storage Service(Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可帮助您设置 AWS 资源，快速一致地配置这些资源，并在 AWS 账户和区域的整个生命周期中对其进行管理。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) 提供安全的分层存储，用于配置数据管理和密钥管理。

**代码**

此模式的代码可在 GitHub [automated-ci-pipeline-creation](https://github.com/aws-samples/automated-ci-pipeline-creation)存储库中找到。存储库包含创建此模式中概述的目标架构所需的 CloudFormation 模板。

## 最佳实践
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-best-practices"></a>
+ 请勿在 CloudFormation 模板或 Step Functions 操作配置中直接输入令牌或密码等凭据（*机密*）。如果这样做，该信息将显示在 DynamoDB 日志中。相反，请使用 AWS Secrets Manager 来设置和存储密钥。然后，根据需要在 CloudFormation 模板和 Step Functions 操作配置中引用 Secrets Manager 中存储的密钥。有关更多信息，请参阅 Secrets Manager 文档中的[什么是 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。
+ 为存储在 Amazon S3 中的 CodePipeline 项目配置服务器端加密。有关更多信息，请参阅 CodePipeline 文档中的[为存储在 Amazon S3 中的项目配置服务器端加密](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html)。 CodePipeline
+ 在配置 IAM 角色时应用最低权限。有关更多信息，请参阅 IAM 文档中的[应用最低权限许可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 确保您的 Amazon S3 存储桶不可公开访问。有关更多信息，请参阅 [Amazon S3 文档中的为您的 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configuring-block-public-access-bucket.html)配置阻止公有访问设置。
+ 确保您为 Amazon S3 存储桶激活版本控制。有关更多信息，请参阅 Amazon S3 文档中的[在 S3 存储桶中使用版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。
+ 配置 IAM policy 时使用 IAM Access Analyzer。该工具提供可操作的建议，以帮助您编写安全且实用的 IAM policy。有关更多信息，请参阅 IAM 文档中的[使用 AWS Identity and Access Management Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。
+ 如果可能，请在配置 IAM policy 时定义特定的访问条件。
+ 激活 Amazon CloudWatch 日志以进行监控和审计。有关更多信息，请参阅[什么是 Amazon CloudWatch 日志？](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 在 CloudWatch 文档中。

## 操作说明
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-epics"></a>

### 配置先决条件
<a name="configure-the-prerequisites"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Amazon S3 存储桶。 | 创建 Amazon S3 存储桶（或使用现有存储桶）来存储解决方案所需的 CloudFormation 模板、源代码和输入文件。有关更多信息，请参阅 [Amazon S3 文档中的步骤 1](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)：创建您的第一个 S3 存储桶。Amazon S3 存储桶必须位于您要将解决方案部署到的同一 AWS 区域中。 | AWS DevOps | 
| 克隆 GitHub 存储库。 | 在终端窗口中运行以下命令来克隆 GitHub [automated-ci-pipeline-creation](https://github.com/aws-samples/automated-ci-pipeline-creation)存储库：<pre>git clone https://github.com/aws-samples/automated-ci-pipeline-creation.git</pre>有关更多信息，请参阅 GitHub 文档[中的克隆存储库](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)。 | AWS DevOps | 
| 将解决方案模板文件夹从克隆的 GitHub 存储库上传到您的 Amazon S3 存储桶。 | 复制克隆的 **Solution-Templates** 文件夹中的内容，并将其上传到您创建的 Amazon S3 存储桶中。有关更多信息，请参阅 Amazon S3 文档中的[上传数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。请确认仅上传 **Solution-Templates** 文件夹的内容。您只能在 Amazon S3 存储桶的根级别上传文件。 | AWS DevOps | 

### 部署解决方案
<a name="deploy-the-solution"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用克隆存储库中的 template.yml 文件创建 CloudFormation 堆栈来部署解决方案。 GitHub  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)您在创建堆栈时，该堆栈会在**堆栈**页面列出，其状态为 **CREATE\$1IN\$1PROGRESS**。请确保等待堆栈的状态更改为 **CREATE\$1COMPLETE**，然后再完成此模式中的其余步骤。 | AWS 管理员，AWS DevOps | 

### 测试设置
<a name="test-the-setup"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 运行您创建的步骤函数。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)**JSON 格式**<pre>{<br />  "details": {<br />    "tech_stack": "Name of the Tech Stack (python/java)",<br />    "project_name": "Name of the Project that you want to create with",<br />    "pre_build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "post_build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "reports": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />  }<br />}</pre>**Java JSON 输入示例**<pre>{<br />  "details": {<br />    "tech_stack": "java",<br />    "project_name": "pipeline-java-pjt",<br />    "pre_build": "yes",<br />    "build": "yes",<br />    "post_build": "yes",<br />    "reports": "yes"<br />  }<br />}</pre>**Python JSON 输入示例**<pre>{<br />  "details": {<br />    "tech_stack": "python",<br />    "project_name": "pipeline-python-pjt",<br />    "pre_build": "yes",<br />    "build": "yes",<br />    "post_build": "yes",<br />    "reports": "yes"<br />  }<br />}</pre> | AWS 管理员，AWS DevOps | 
| 确认 CI 管道的 CodeCommit 存储库已创建。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| 检查 CodeBuild 项目资源。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| 验证 CodePipeline 阶段。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| 确认 CI 管道已成功运行。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 

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


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除中的资源堆栈 CloudFormation。 | 在中删除 CI 管道的资源堆栈 CloudFormation。有关更多信息，请参阅 CloudFormation 文档中的在 [AWS CloudFormation 控制台上删除堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。请确认删除名为 **<project\$1name>-stack** 的堆栈。 | AWS DevOps | 
| 在 Amazon S3 中删除 CI 管道的依赖关系，然后 CloudFormation。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)确保删除名为的堆栈**pipeline-creation-dependencies-stack**。 | AWS DevOps | 
| 删除 Amazon S3 模版存储桶。 | 删除您在此模式的**配置先决条件**部分中创建的 Amazon s3 存储桶，该存储桶存储此解决方案的模板。有关更多信息，请参阅 Amazon S3 文档中的[删除存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。 | AWS DevOps | 

## 相关资源
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-resources"></a>
+ [创建使用 Lambda 的 Step Functions 状态机](https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-creating-lambda-state-machine.html)（AWS Step Functions 文档）
+ [AWS Step Funct WorkFlow ions 工作室](https://docs.aws.amazon.com/step-functions/latest/dg/workflow-studio.html)（AWS Step Functions 文档）
+ [DevOps 还有 AWS](https://aws.amazon.com/devops/)
+ [AWS 是如何 CloudFormation 运作的？](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html) （AWS CloudFormation 文档）
+ [包含 CI/CD AWS CodeCommit、AWS CodeBuild CodeDeploy、AWS 和 AWS CodePipeline](https://aws.amazon.com/blogs/devops/complete-ci-cd-with-aws-codecommit-aws-codebuild-aws-codedeploy-and-aws-codepipeline/)（AWS 博客文章）
+ [IAM 和 AWS STS 配额、名称要求和字符限制](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html)（IAM 文档）