

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

# 在 AWS 中使用第三方 Git 源存储库 CodePipeline
<a name="use-third-party-git-source-repositories-in-aws-codepipeline"></a>

*Kirankumar Chandrashekar，Amazon Web Services*

## Summary
<a name="use-third-party-git-source-repositories-in-aws-codepipeline-summary"></a>

此模式描述了如何将 AWS CodePipeline 与第三方 Git 源存储库配合使用。

[AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts-continuous-delivery-integration.html) 是一项持续交付服务，可自动执行构建、测试和部署软件的任务。该服务目前支持由 [AWS CodeCommit](https://aws.amazon.com/codecommit) 和 Atlassian Bit GitHub bucket 管理的 Git 存储库。但是，部分企业使用与其单点登录（SSO）服务和 Microsoft Active Directory 集成的第三方 Git 存储库进行身份验证。您可以 CodePipeline 通过创建自定义操作和 webhook 将这些第三方 Git 存储库用作来源。

Webhook 是一种 HTTP 通知，用于检测其他工具（例如 GitHub 存储库）中的事件，并将这些外部事件连接到管道。当您在中创建 webhook 时 CodePipeline，该服务会返回一个网址，您可以在 Git 存储库 webhook 中使用该网址。**如果您将代码推送到 Git 存储库的特定分支，Git webhook 会通过此 URL 启动 CodePipeline webhook，并将管道的源代码阶段设置为 “进行中”。**当管道处于此状态时，作业工作人员会轮 CodePipeline 询自定义作业，运行该作业，并将成功或失败状态发送到 CodePipeline。在本示例中，由于管道处于源代码阶段，因此作业工作程序使用所轮询的作业提供的对象密钥获取 Git 存储库的内容，压缩内容，然后将其上传到存储管道构件的 Amazon Simple Storage Service (Amazon S3) 存储桶。您还可以将自定义操作的过渡与 Amazon 中的事件关联起来 CloudWatch，并根据该事件启动任务工作人员。通过此设置，您可以使用该服务本身不支持的第三方 Git 存储库作为来源。 CodePipeline

## 先决条件和限制
<a name="use-third-party-git-source-repositories-in-aws-codepipeline-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户
+ 支持 webhook 的 Git 存储库，可通过互联网连接到 CodePipeline webhook 网址 
+ AWS 命令行界面（AWS CLI）[已安装](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)以使用 AWS 账户

## 架构
<a name="use-third-party-git-source-repositories-in-aws-codepipeline-architecture"></a>

此模式涉及这些步骤：

1. 用户将代码提交到至 Git 存储库。

1. 调用 Git 网络钩子。

1.  CodePipeline webhook 被称为。

1. 管道设置为**进行中**，源阶段设置为**进行中**状态。

1. 源阶段操作启动 CloudWatch 事件规则，表示该规则已启动。

1. 该 CloudWatch 事件启动一个 Lambda 函数。

1. Lambda 函数获取自定义操作作业详细信息。

1. Lambda 函数启动 AW CodeBuild S 并将所有与工作相关的信息传递给它。

1. CodeBuild 从 Secrets Manager 获取访问 HTTPS Git 的 SSH 公钥或用户证书。

1. CodeBuild 克隆特定分支的 Git 存储库。

1. CodeBuild 压缩存档并将其上传到用作 CodePipeline 项目存储的 S3 存储桶。

![\[使用第三方 Git 源代码存储库作为 AWS CodePipeline 源代码的工作流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/84284bec-b39d-466a-9fd9-994be2c953df/images/85555dab-7317-40f5-86a7-ccb8987c5bf3.png)


 

## 工具
<a name="use-third-party-git-source-repositories-in-aws-codepipeline-tools"></a>
+ [AWS CodePipeline](https://aws.amazon.com/codepipeline/) — AWS CodePipeline 是一项完全托管的[持续交付](https://aws.amazon.com/devops/continuous-delivery/)服务，可帮助您自动执行发布管道，实现快速可靠的应用程序和基础设施更新。 CodePipeline 根据您定义的发布模型，针对每次代码变更自动执行发布过程的构建、测试和部署阶段。这让您可以快速而可靠地交付各种功能和更新。您可以将 AWS CodePipeline 与第三方服务（例如 GitHub 您自己的自定义插件）集成。
+ [AWS Lambda](https://aws.amazon.com/lambda/) – AWS Lambda 让您无需预调配或管理服务器即可运行代码。借助 Lambda，您可以为几乎任何类型的应用程序或后端服务运行代码，而无需进行任何管理。您只需上传您的代码，Lambda 就会处理以高可用性运行和扩展您的代码所需一切。您可以将您的代码设置为自动从其他 Amazon Web Services 启动，或者直接从任何 Web 或移动应用程序调用。
+ [AWS CodeBuild](https://aws.amazon.com/codebuild/) — AWS CodeBuild 是一项完全托管的[持续集成](https://aws.amazon.com/devops/continuous-integration/)服务，可编译源代码、运行测试并生成可随时部署的软件包。使用 CodeBuild，您无需预置、管理和扩展自己的构建服务器。 CodeBuild 持续扩展并同时处理多个构建，因此您的构建不会排队等待。您可以使用预先打包的构建环境快速开始，也可以创建使用您自己的构建工具的自定义构建环境。
+ [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) – AWS Secrets Manager 可帮助您保护访问您的应用程序、服务和 IT 资源所需密钥。该项服务让您可以在数据库凭证、API 密钥和其他密钥的整个生命周期内对其进行轮换、管理和检索。用户和应用程序通过调用 Secrets Manager 来检索机密 APIs，而不必以纯文本格式对敏感信息进行硬编码。Secrets Manager 通过与Amazon Relational Database Service (Amazon RDS)、Amazon Redshift 和Amazon DocumentDB 的内置集成，提供密钥轮换。可以扩展该服务以支持其他类型的机密，包括 API 密钥和 OAuth 令牌。此外，Secrets Manager 使您能够使用精细权限控制对密钥的访问，并集中审计 AWS 云、第三方服务和本地环境资源的密钥轮换。
+ [Ama](https://aws.amazon.com/cloudwatch/) zon CloudWatch — Amazon CloudWatch 是一项专为 DevOps 工程师、开发人员、站点可靠性工程师 (SREs) 和 IT 经理构建的监控和观察服务。 CloudWatch 为您提供数据和切实可行的见解，以监控您的应用程序、响应系统范围的性能变化、优化资源利用率并获得统一的运营状况视图。 CloudWatch 以日志、指标和事件的形式收集监控和运营数据，为您提供在 AWS 和本地服务器上运行的 AWS 资源、应用程序和服务的统一视图。您可以使用 CloudWatch 来检测环境中的异常行为、设置警报、并排可视化日志和指标、采取自动操作、解决问题以及发现见解，以保持应用程序平稳运行。
+ [Amazon S3](https://aws.amazon.com/s3/) – Amazon Simple Storage Service (Amazon S3) 是一项对象存储服务，可让您存储和保护任意数量的数据，用于网站、移动应用程序、备份和还原、归档、企业应用程序、IoT 设备和大数据分析。Amazon S3 提供 easy-to-use管理功能，可帮助您整理数据并配置经过微调的访问控制，以满足您的特定业务、组织和合规要求。

## 操作说明
<a name="use-third-party-git-source-repositories-in-aws-codepipeline-epics"></a>

### 在中创建自定义操作 CodePipeline
<a name="create-a-custom-action-in-codepipeline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 AWS CLI 或 AWS 创建自定义操作 CloudFormation。 | 此步骤涉及创建自定义源操作，该操作可在特定区域 AWS 账户中用于管道的源代码阶段。您必须使用 AWS CLI 或 AWS CloudFormation （不是控制台）来创建自定义源操作。有关本文和其他操作说明中描述的命令和步骤的更多信息，请参阅此模式末尾的 “相关资源”部分。在 AWS CLI 中，使用 create-custom-action-type命令。使用--configuration-properties提供作业工作人员在轮询 CodePipeline 作业时需要处理的所有参数。请务必记下提供给 --provider 和 --action-version 选项的值，这样您就可以在使用此自定义源代码阶段创建管道时使用相同的值。您也可以使用资源类型在 AWS CloudFormation 中创建自定义源操作 AWS::CodePipeline::CustomActionType。 | 常规 AWS | 

### 设置身份验证
<a name="set-up-authentication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 SSH 密钥对。 | 创建 Secure Shell (SSH) 密钥对。有关说明，请参阅 GitHub 文档。 | 系统/工程师 DevOps  | 
| 在 AWS Secrets Manager 中创建密钥。 | 从 SSH 密钥对中复制私钥的内容，然后在 AWS Secrets Manager 创建密钥。此密钥用于在访问 Git 存储库时进行身份验证。 | 常规 AWS | 
| 将公有密钥添加至 Git 存储库。 | 将 SSH 密钥对中的公钥添加到 Git 存储库账户设置中，以便根据私钥进行身份验证。 | 系统/工程师 DevOps  | 

### 创建管道和网络钩子
<a name="create-a-pipeline-and-webhook"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建包含自定义源操作的管道。 | 在中创建管道 CodePipeline。配置源阶段时，选择之前创建的自定义源操作。您可以在 AWS CodePipeline 控制台或 AWS CLI 中执行此操作。 CodePipeline 提示您输入您在自定义操作上设置的配置属性。该信息是作业工作程序处理自定义操作作业的必要条件。按向导进行操作，为管道创建下一个阶段。 | 常规 AWS | 
| 创建一个 CodePipeline webhook。 | 为您使用自定义源操作构建的管道创建网络钩子。您必须使用 AWS CLI 或 AWS CloudFormation （不是控制台）来创建 Webhook。在 AWS CLI 中，运行 put-webhook 命令并为网络钩子选项提供相应值。记下命令返回的网络钩子 URL。如果您使用 AWS CloudFormation 创建 Webhook，请使用资源类型 AWS::CodePipeline::Webhook。请务必从创建的资源中输出网络钩子网址，并记录。 | 常规 AWS | 
| 创建 Lambda 函数和项目。 CodeBuild  | 在此步骤中，您将使用 Lambda 和 CodeBuild 创建一个任务工作线程，该工作人员将轮询 CodePipeline 自定义操作的任务请求，运行该作业，并将状态结果返回到。 CodePipeline创建一个 Lambda 函数，当管道的自定义源操作阶段转换为 “进行中” 时，该函数由 Amazon CloudWatch Events 规则启动。当 Lambda 函数启动时，它应通过轮询作业来获取自定义操作作业的详细信息。您可以使用 PollForJobs API 返回此信息。获得轮询的作业信息后，Lambda 函数应返回确认，然后使用从自定义操作的配置属性中所获得的数据处理该信息。当工作人员准备好与 Git 仓库对话时，你可以启动一个 CodeBuild 项目，因为使用 SSH 客户端可以方便地处理 Git 任务。 | 常规 AWS，代码开发人员 | 

### 在中创建活动 CloudWatch
<a name="create-an-event-in-cloudwatch"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 CloudWatch 事件规则。 | 创建一个 CloudWatch 事件规则，每当管道的自定义操作阶段转换为 “进行中” 时，该规则就会将 Lambda 函数作为目标启动。 | 常规 AWS | 

## 相关资源
<a name="use-third-party-git-source-repositories-in-aws-codepipeline-resources"></a>

**在中创建自定义操作 CodePipeline**
+ [在中创建和添加自定义操作 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-create-custom-action.html)
+ [AWS::CodePipeline::CustomActionType 资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html)

**设置身份验证**
+ [通过 AWS Secrets Manager 创建和管理密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managing-secrets.html)

**创建管道和网络钩子**
+ [在中创建管道 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html)
+ [put-webhook 命令参考](https://docs.aws.amazon.com/cli/latest/reference/codepipeline/put-webhook.html)
+ [AWS::CodePipeline::Webhook 资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html)
+ [PollForJobs API 参考](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html)
+ [在中创建和添加自定义操作 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-create-custom-action.html)
+ [在 AWS 中创建构建项目 CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/create-project.html)

**创建事件**
+ [通过 Amazon CloudWatch Events 检测管道状态的变化并做出反应](https://docs.aws.amazon.com/codepipeline/latest/userguide/detect-state-changes-cloudwatch-events.html)

**其他参考资料**
+ [使用中的管道 CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines.html)
+ [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)