本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自动为 Java 和 Python 项目创建动态 CI 管道
Aromal Raj Jayarajan、Vijesh Vijayakumaran Nair、MAHESH RAGHUNANDANAN 和 Amazon Web Services 的 Amarnath Reddy
摘要
注意: AWS CodeCommit 不再向新客户开放。的现有客户 AWS CodeCommit 可以继续照常使用该服务。了解更多
此模式说明如何使用 AWS 开发人员工具自动为 Java 和 Python 项目创建动态持续集成(CI)管道。
随着技术堆栈的多样化和开发活动的增加,创建和维护在整个组织中保持一致的 CI 管道可能会变得困难。通过在 AWS Step Functions 中自动执行该流程,您可以确保 CI 管道的使用和方法保持一致。
为了自动创建动态 CI 管道,此模式使用以下变量输入:
- 编程语言(仅限 Java 或 Python) 
- 管道名称 
- 所需管道阶段 
注意
Step Functions 使用多个 AWS 服务来协调管道的创建。有关此解决方案中使用的 Amazon Web Services 的更多信息,请参阅此模式的工具部分。
先决条件和限制
先决条件
- 一个有效的 Amazon Web Services account 
- 部署此解决方案的同一 AWS 区域 中的 Amazon S3 存储桶 
- 一个 AWS Identity and Access Management (IAM) 委托人,该委托人拥有创建此解决方案所需资源所需的 AWS CloudFormation 权限 
限制
- 此模式仅支持 Java 和 Python 项目。 
- 在此模式中预置的 IAM 角色遵循最低权限原则。必须根据您的 CI 管道需要创建的特定资源更新 IAM 角色的权限。 
架构
目标技术堆栈
- 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 用户以 JSON 格式提供用于创建 CI 管道的输入参数。此输入将启动一个 Step Functions 工作流(状态机),该工作流使用 AWS 开发人员工具创建 CI 管道。 
- Lambda 函数读取名为 input-reference 的文件夹,该文件夹存储在 Amazon S3 存储桶中,然后生成 buildspec.yml 文件。此生成的文件定义了 CI 管道阶段,并存储回存储参数引用的同一 Amazon S3 存储桶中。 
- Step Functions 会检查 CI 管道创建工作流程的依赖关系是否存在任何更改,并根据需要更新依赖关系堆栈。 
- Step Functions 在 CloudFormation 堆栈中创建 CI 管道资源,包括 CodeCommit 存储库、 CodeBuild 项目和 CodePipeline 管道。 
- CloudFormation 堆栈将所选技术堆栈(Java 或 Python)的示例源代码和 buildspec.yml 文件复制到存储库中。 CodeCommit 
- CI 管道运行时详细信息存储在 DynamoDB 表中。 
自动化和扩缩
- 此模式仅供在单个开发环境中使用。需要更改配置才能跨多个开发环境使用。 
- 要添加对多个 CloudFormation 堆栈的支持,您可以创建其他 CloudFormation 模板。有关更多信息,请参阅 CloudFormation 文档 CloudFormation中的 AWS 入门。 
工具
工具
- AWS Step Functions 是一项无服务器编排服务,可让您搭配使用 AWS Lambda 函数和其他 Amazon Web Services 来构建业务关键型应用程序。 
- AWS Lambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。 
- AWS CodeBuild 是一项完全托管的构建服务,可帮助您编译源代码、运行单元测试和生成可随时部署的项目。 
- AWS CodeCommit 是一项版本控制服务,可帮助您私下存储和管理 Git 存储库,而无需管理自己的源代码控制系统。 
- AWS CodePipeline 可帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件变更所需的步骤。 
- AWS Identity and Access Management (AWS IAM) 通过控制验证和授权使用您 AWS 资源的用户,帮助您安全地管理对您 AWS 资源的访问。 
- AWS Key Management Service (AWS KMS) 可帮助您创建和控制加密密钥,以帮助保护您的数据。 
- Amazon Simple Storage Service(Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。 
- AWS CloudFormation 可帮助您设置 AWS 资源,快速一致地配置这些资源,并在 AWS 账户和区域的整个生命周期中对其进行管理。 
- Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,可提供快速、可预测和可扩展的性能。 
- AWS Systems Manager Parameter Store 提供安全的分层存储,用于配置数据管理和密钥管理。 
代码
此模式的代码可在 GitHub automated-ci-pipeline-creation
最佳实践
- 请勿在 CloudFormation 模板或 Step Functions 操作配置中直接输入凭据(机密),例如令牌或密码。如果这样做,该信息将显示在 DynamoDB 日志中。相反,请使用 AWS Secrets Manager 来设置和存储密钥。然后,根据需要在 CloudFormation 模板和 Step Functions 操作配置中引用 Secrets Manager 中存储的密钥。有关更多信息,请参阅 Secrets Manager 文档中的什么是 AWS Secrets Manager。 
- 为存储在 Amazon S3 中的 CodePipeline 项目配置服务器端加密。有关更多信息,请参阅 CodePipeline 文档中的为存储在 Amazon S3 中的项目配置服务器端加密。 CodePipeline 
- 在配置 IAM 角色时应用最低权限。有关更多信息,请参阅 IAM 文档中的应用最低权限许可。 
- 确保您的 Amazon S3 存储桶不可公开访问。有关更多信息,请参阅 Amazon S3 文档中的为您的 S3 存储桶配置阻止公有访问设置。 
- 确保您为 Amazon S3 存储桶激活版本控制。有关更多信息,请参阅 Amazon S3 文档中的在 S3 存储桶中使用版本控制。 
- 配置 IAM policy 时使用 IAM Access Analyzer。该工具提供可操作的建议,以帮助您编写安全且实用的 IAM policy。有关更多信息,请参阅 IAM 文档中的使用 AWS Identity and Access Management Access Analyzer。 
- 如果可能,请在配置 IAM policy 时定义特定的访问条件。 
- 激活 Amazon CloudWatch 日志以进行监控和审计。有关更多信息,请参阅什么是 Amazon CloudWatch 日志? 在 CloudWatch 文档中。 
操作说明
| Task | 描述 | 所需技能 | 
|---|---|---|
| 创建 Amazon S3 存储桶。 | 创建 Amazon S3 存储桶(或使用现有存储桶)来存储解决方案所需的 CloudFormation 模板、源代码和输入文件。 有关更多信息,请参阅 Amazon S3 文档中的步骤 1:创建您的第一个 S3 存储桶。 注意Amazon S3 存储桶必须位于您要将解决方案部署到的同一 AWS 区域中。 | AWS DevOps | 
| 克隆 GitHub 存储库。 | 在终端窗口中运行以下命令来克隆 GitHub automated-ci-pipeline-creation 
 有关更多信息,请参阅 GitHub 文档中的克隆存储库 | AWS DevOps | 
| 将解决方案模板文件夹从克隆的 GitHub 存储库上传到您的 Amazon S3 存储桶。 | 复制克隆的 Solution-Templates 文件夹中的内容,并将其上传到您创建的 Amazon S3 存储桶中。 有关更多信息,请参阅 Amazon S3 文档中的上传数据。 注意确保仅上传解决方案模板文件夹的内容。您只能在 Amazon S3 存储桶的根级别上传文件。 | AWS DevOps | 
| Task | 描述 | 所需技能 | 
|---|---|---|
| 使用克隆存储库中的 template.yml 文件创建 CloudFormation 堆栈来部署解决方案。 GitHub | 
 注意创建堆栈时,堆栈会列在堆栈页面上,状态为 CREAT E_IN_PROGRESS。请确保等待堆栈的状态更改为 CREATE_COMPLETE,然后再完成此模式中的其余步骤。 | AWS 管理员,AWS DevOps | 
| Task | 描述 | 所需技能 | 
|---|---|---|
| 运行您创建的步骤函数。 | 
 JSON 格式 
 Java JSON 输入示例 
 Python JSON 输入示例 
 | AWS 管理员,AWS DevOps | 
| 确认 CI 管道的 CodeCommit 存储库已创建。 | 
 | AWS DevOps | 
| 检查 CodeBuild 项目资源。 | 
 | AWS DevOps | 
| 验证 CodePipeline 阶段。 | 
 | AWS DevOps | 
| 确认 CI 管道已成功运行。 | 
 | AWS DevOps | 
| Task | 描述 | 所需技能 | 
|---|---|---|
| 删除中的资源堆栈 CloudFormation。 | 在中删除 CI 管道的资源堆栈 CloudFormation。 有关更多信息,请参阅 CloudFormation 文档中的在 AWS CloudFormation 控制台上删除堆栈。 注意请务必删除名为 -stack 的堆栈<project_name>。 | AWS DevOps | 
| 在 Amazon S3 中删除 CI 管道的依赖关系,然后 CloudFormation。 | 
 注意请务必删除名为的堆栈pipeline-creation-dependencies-stack。 | AWS DevOps | 
| 删除 Amazon S3 模版存储桶。 | 删除您在此模式的配置先决条件部分中创建的 Amazon s3 存储桶,该存储桶存储此解决方案的模板。 有关更多信息,请参阅 Amazon S3 文档中的删除存储桶。 | AWS DevOps | 
相关资源
- 创建使用 Lambda 的 Step Functions 状态机(A WS Step Functions 文档) 
- AWS Step Funct WorkFlow ions Studio(AWS Step Functics 文档) 
- AWS 是如何 CloudFormation 运作的? (AWS CloudFormation 文档) 
- 包含 CI/CD AWS CodeCommit、AWS CodeBuild CodeDeploy、AWS 和 AWS CodePipeline - (AWS 博客文章) 
- IAM 和 AWS STS 配额、名称要求和字符限制(IAM 文档)