集成模型参考 - Amazon CodePipeline
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

集成模型参考

我们预先构建了若干第三方服务集成,有助于将现有的客户工具植入管道发布流程。合作伙伴或第三方服务提供商使用集成模型来实现 CodePipeline 中使用的操作类型。

当您计划或使用通过 CodePipeline 中支持的集成模型管理的操作类型时,请使用此参考。

要将您的第三方操作类型认证为合作伙伴与 CodePipeline 的集成,请参阅 Amazon 合作伙伴网络 (APN)。此信息是对 Amazon CLI 参考的补充。

第三方操作类型如何与集成商配合工作

您可以向客户管道中添加第三方操作类型,以完成基于客户资源的任务。集成商管理任务请求并使用 CodePipeline 运行操作。下图显示了为客户创建的要在其管道中使用的第三方操作类型。客户配置操作后,操作将运行并创建任务请求,这些请求将由集成商的操作引擎处理。

该图显示了集成商的操作引擎如何处理第三方操作类型和构件

图中显示以下步骤:

  1. 注册操作定义并在 CodePipeline 中提供。第三方提供商的客户可以使用第三方操作。

  2. 提供商的客户在 CodePipeline 中选择并配置操作。

  3. 操作运行,任务在 CodePipeline 中排队。当任务在 CodePipeline 中准备就绪时,它会发送一个任务请求。

  4. 集成商(第三方轮询 API 或 Lambda 函数的任务工作者)接收任务请求,返回确认信息,然后处理操作的构件。

  5. 集成商返回包含任务结果和延续令牌的成功/失败输出(任务工作者使用成功/失败 API 或 Lambda 函数发送成功/失败输出)。

有关可用于请求、查看和更新操作类型的步骤的信息,请参阅使用操作类型

概念

本节对第三方操作类型使用以下术语:

操作类型

一种可重复的流程,可在执行相同持续交付工作负载的管道中重复使用。操作类型由 OwnerCategoryProviderVersion 标识。例如:

{ "Category": "Deploy", "Owner": "AWS", "Provider": "CodeDeploy", "Version": "1" },

相同类型的所有操作都采用相同的实现。

操作

操作类型的单个实例,即管道阶段内发生的非连续流程之一。这通常包括特定于运行此操作的管道的用户值。

操作定义

操作类型的架构,用于定义配置操作和输入/输出构件所需的属性。

操作执行

为确定客户管道上的操作是否成功而运行的一系列任务。

操作执行引擎

操作执行配置的一个属性,用于定义操作类型使用的集成类型。有效值为 JobWorkerLambda

集成

描述由集成商运行的一个软件,用于实现操作类型。CodePipeline 支持两种集成类型,分别对应于两个支持的操作引擎 JobWorkerLambda

集成商

负责实现操作类型的人。

作业

利用管道和客户背景来执行集成的一项工作。操作执行包含一个或多个任务。

任务工作者

处理客户输入并运行任务的服务。

支持的集成模型

CodePipeline 有两种集成模型:

  • Lambda 集成模型:此集成模型是在 CodePipeline 中处理操作类型的首选方式。当您的操作运行时,Lambda 集成模型使用 Lambda 函数来处理任务请求。

  • 任务工作者集成模型:任务工作者集成模型是以前用于第三方集成的模型。任务工作者集成模型使用一个配置好的任务工作者,可在操作运行时与 CodePipeline API 联系以处理任务请求。

为了进行比较,下表描述了这两种模型的特征:

Lambda 集成模型 任务工作者集成模型
描述 集成商将集成写入为 Lambda 函数,只要有任务可供操作,CodePipeline 就会调用该函数。Lambda 函数不轮询可用的任务,而是等待,直到收到下一个任务请求。 集成商将集成写入为任务工作者,后者会持续轮询客户管道上的可用任务。然后,任务工作者执行任务,并使用 CodePipeline API 将任务结果提交回 CodePipeline。
基础设施 Amazon Lambda 将任务工作者代码部署到集成商的基础设施,例如 Amazon EC2 实例。
开发工作 集成仅包含业务逻辑。 除了包含业务逻辑外,集成还需要与 CodePipeline API 进行交互。
运营工作 由于基础设施只是 Amazon 资源,因此运营工作量较少。 因为任务工作者需要独立的硬件,所以运营工作量较多。
最长任务运行时间 如果集成需要有效运行超过 15 分钟,则无法使用该模型。此操作适用于需要启动流程(例如,在客户的代码构件上启动构建)并在完成后返回结果的集成商。我们不建议集成商持续等待构建完成,而是返回延续。如果从集成商的代码中收到延续,CodePipeline 将在另外 30 秒内创建一个新任务,然后不断核查该任务直到它完成。 使用该模型可以维持长时间运行的任务(数小时/数天)。

Lambda 集成模型

支持的 Lambda 集成模型包括创建 Lambda 函数和为第三方操作类型定义输出。

更新您的 Lambda 函数以处理来自 CodePipeline 的输入

您可以创建新的 Lambda 函数。您可以向 Lambda 函数中添加业务逻辑,只要您的管道上有适用于操作类型的任务,该函数就会运行。例如,鉴于客户和管道的背景,您可能想在服务中为客户开始构建。

使用以下参数更新您的 Lambda 函数以处理来自 CodePipeline 的输入。

格式:

  • jobId:

    • 系统生成的唯一任务 ID。

    • 类型:字符串

    • 模式:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}

  • accountId:

    • 执行任务时要使用的客户 Amazon 账户的 ID。

    • 类型:字符串

    • 模式:[0-9]{12}

  • data:

    • 集成用于完成任务的其他任务信息。

    • 包含以下各项:

      • actionConfiguration:

        • 操作的配置数据。操作配置字段是键值对的映射,供您的客户输入值。设置操作时,键取决于操作类型定义文件中的键参数。在本例中,值取决于指定 UsernamePassword 字段信息的操作的用户。

        • 类型:字符串到字符串映射,目前可选

          示例:

          "configuration": { "Username": "MyUser", "Password": "MyPassword" },
      • encryptionKey:

        • 表示有关用于加密构件存储中数据的密钥(例如,Amazon KMS 密钥)的信息。

        • 内容:数据类型 encryptionKey 的类型,目前可选

      • inputArtifacts:

        • 有关要处理的构件的信息列表,例如测试或构建构件。

        • 内容:数据类型 Artifact 的列表,目前可选

      • outputArtifacts:

        • 有关操作输出的信息列表。

        • 内容:数据类型 Artifact 的列表,目前可选

      • actionCredentials:

        • 表示 Amazon 会话凭证对象。这些凭证是临时凭证,由 Amazon STS 发布。它们可用于访问存储 CodePipeline 管道构件的 S3 桶中的输入和输出构件。

          这些凭证还具有与操作类型定义文件中指定的策略声明模板相同的权限。

        • 内容:数据类型 AWSSessionCredentials 的类型,目前可选

      • actionExecutionId:

        • 操作运行的外部 ID。

        • 类型:字符串

      • continuationToken:

        • 系统生成的令牌(例如部署 ID),任务需要它来异步延续任务。

        • 类型:字符串,目前可选

数据类型:

  • encryptionKey:

    • id:

      • 用于标识密钥的 ID。对于 Amazon KMS 密钥,您可以使用密钥 ID、密钥 ARN 或别名 ARN。

      • 类型:字符串

    • type:

      • 加密密钥的类型,如 Amazon KMS 密钥。

      • 类型:字符串

      • 有效值:KMS

  • Artifact:

    • name:

      • 构件的名称。

      • 类型:字符串,目前可选

    • revision:

      • 构件的修订 ID。根据对象的类型,这可能是提交 ID (GitHub),也可能是修订 ID (Amazon S3)。

      • 类型:字符串,目前可选

    • location:

      • 构件的位置。

      • 内容:数据类型 ArtifactLocation 的类型,目前可选

  • ArtifactLocation:

    • type:

      • 位置中构件的类型。

      • 类型:字符串,目前可选

      • 有效值:S3

    • s3Location:

      • 包含修订的 S3 桶的位置。

      • 内容:数据类型 S3Location 的类型,目前可选

  • S3Location:

    • bucketName:

      • S3 桶的名称。

      • 类型:字符串

    • objectKey:

      • S3 桶中对象的键,在桶中唯一标识该对象。

      • 类型:字符串

  • AWSSessionCredentials:

    • accessKeyId:

      • 会话的访问密钥。

      • 类型:字符串

    • secretAccessKey:

      • 会话的秘密访问密钥。

      • 类型:字符串

    • sessionToken:

      • 会话的令牌。

      • 类型:字符串

示例:

{ "jobId": "01234567-abcd-abcd-abcd-012345678910", "accountId": "012345678910", "data": { "actionConfiguration": { "key1": "value1", "key2": "value2" }, "encryptionKey": { "id": "123-abc", "type": "KMS" }, "inputArtifacts": [ { "name": "input-art-name", "location": { "type": "S3", "s3Location": { "bucketName": "inputBucket", "objectKey": "inputKey" } } } ], "outputArtifacts": [ { "name": "output-art-name", "location": { "type": "S3", "s3Location": { "bucketName": "outputBucket", "objectKey": "outputKey" } } } ], "actionExecutionId": "actionExecutionId", "actionCredentials": { "accessKeyId": "access-id", "secretAccessKey": "secret-id", "sessionToken": "session-id" }, "continuationToken": "continueId-xxyyzz" } }

将 Lambda 函数的结果返回到 CodePipeline

在成功、失败或延续的情况下,集成商的任务工作者资源必须返回有效的负载。

格式:

  • result:任务的结果。

    • 必需

    • 有效值(不区分大小写):

      • Success:表示任务成功且已终止。

      • Continue:表示任务成功且必须延续,例如,为执行相同操作而重新调用任务工作者时。

      • Fail:表示任务失败且已终止。

  • failureType:要与失败的任务关联的失败类型。

    合作伙伴操作的 failureType 类别描述了运行任务时遇到的失败类型。将任务失败结果返回到 CodePipeline 时,集成商会设置该类型以及失败消息。

    • 可选。如果结果是 Fail,则为必填项。

    • 如果 resultSuccessContinue,则必须为空

    • 有效值:

      • ConfigurationError

      • JobFailed

      • PermissionsError

      • RevisionOutOfSync

      • RevisionUnavailable

      • SystemUnavailable

  • continuation:在当前操作执行中,要传递给下一个任务的延续状态。

    • 可选。如果结果是 Continue,则为必填项。

    • 如果 resultSuccessFail,则必须为空。

    • 属性:

      • State:要传递的状态的哈希值。

  • status:操作执行的状态。

    • 可选。

    • 属性:

      • ExternalExecutionId:与任务关联的可选外部执行 ID 或提交 ID。

      • Summary:所发生情况的可选摘要。在失败情况下,这会成为用户看到的失败消息。

  • outputVariables:要传递给下一个操作执行的一组键/值对。

    • 可选。

    • 如果 resultContinueFail,则必须为空。

示例:

{ "result": "success", "failureType": null, "continuation": null, "status": { "externalExecutionId": "my-commit-id-123", "summary": "everything is dandy" }, "outputVariables": { "FirstOne": "Nice", "SecondOne": "Nicest", ... } }

使用延续令牌等待异步流程的结果

continuation 令牌是有效负载的一部分,也是 Lambda 函数的结果。通过它可将任务状态传递给 CodePipeline 并指示任务需要延续。例如,集成商在其资源上为客户启动构建后,它不会等待构建完成,而是通过返回 resultcontinue 并将构建的唯一 ID 返回到 CodePipeline 作为 continuation 令牌,向 CodePipeline 表明它没有最终结果。

注意

Lambda 函数只能运行不超过 15 分钟。如果任务需要运行更长的时间,可以使用延续令牌。

CodePipeline 团队在 30 秒后使用有效负载中的同一 continuation 令牌调用集成商,以便核查任务是否完成。如果构建完成,集成商将返回终端成功/失败结果,否则继续。

为 CodePipeline 提供在运行时调用集成商 Lambda 函数的权限

您可以向集成商 Lambda 函数添加权限,为 CodePipeline 服务提供使用 CodePipeline 服务主体调用该函数的权限:codepipeline.amazonaws.com。您可以使用 Amazon CloudFormation 或命令行来添加权限。有关示例,请参阅使用操作类型

任务工作者集成模型

设计完高层工作流后,您可以创建任务工作者。尽管第三方操作的细节决定了任务工作者需要什么,但大多数第三方操作的任务工作者都包括以下功能:

  • 使用 PollForThirdPartyJobs 轮询来自 CodePipeline 的任务。

  • 使用 AcknowledgeThirdPartyJobPutThirdPartyJobSuccessResultPutThirdPartyJobFailureResult 确认任务并将结果返回到 CodePipeline。

  • 从管道的 Amazon S3 桶中检索构件和/或将构件放入桶。要从 Amazon S3 桶下载构件,您必须创建一个使用签名版本 4 (Sig V4) 签名的 Amazon S3 客户端。Sig V4 是 Amazon KMS 所必需的。

    要将构件上传到 Amazon S3 桶,您还必须将 Amazon S3 PutObject 请求配置为通过 Amazon Key Management Service (Amazon KMS) 使用加密。Amazon KMS 使用 Amazon KMS keys。为得知使用 Amazon 托管式密钥 还是客户管理的密钥来上传构件,您的任务工作者必须查看任务数据并检查加密密钥属性。如果设置了该属性,则在配置 Amazon KMS 时应使用该客户管理的密钥 ID。如果密钥属性为空,则使用 Amazon 托管式密钥。除非另有配置,否则 CodePipeline 使用 Amazon 托管式密钥。

    有关演示如何在 Java 或 .NET 中创建 Amazon KMS 参数的示例,请参阅使用 Amazon SDK 在 Amazon S3 中指定 Amazon Key Management Service。有关适用于 CodePipeline 的 Amazon S3 桶的更多信息,请参阅CodePipeline 概念

为作业辅助角色选择和配置权限管理策略

要在 CodePipeline 中为第三方操作开发任务工作者,您需要一个用于集成用户和权限管理的策略。

最简单的策略是通过创建具有 Amazon Identity and Access Management (IAM) 实例角色的 Amazon EC2 实例,为您的任务工作者添加所需的基础设施,从而允许您轻松扩展集成所需的资源。您可以使用与 Amazon 的内置集成来简化您的任务工作者与 CodePipeline 之间的交互。

了解更多有关 Amazon EC2 的信息,并确定其是否为适合您的集成的正确选择。有关信息,请参阅 Amazon EC2 – 虚拟服务器托管。有关设置 Amazon EC2 实例的更多信息,请参阅 Amazon EC2 Linux 实例入门

另一个需要考虑的策略是使用 IAM 的身份联合验证来集成您的现有身份提供程序系统和资源。如果您已经拥有企业身份提供程序,或已经配置为支持使用网络身份提供程序的用户,则此策略很有用。身份联合验证允许您授予对 Amazon 资源(包括 CodePipeline)的安全访问权限,而不必创建或管理 IAM 用户。您可以利用针对密码安全性要求和凭证轮换的功能和策略。您可以使用示例应用程序作为自己设计的模板。有关信息,请参阅管理联合身份验证

要提供访问权限,请为您的用户、组或角色添加权限:

以下是您可能为搭配第三方任务工作者使用而创建的策略示例。此策略仅作为示例,按原样提供。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:PollForThirdPartyJobs", "codepipeline:AcknowledgeThirdPartyJob", "codepipeline:GetThirdPartyJobDetails", "codepipeline:PutThirdPartyJobSuccessResult", "codepipeline:PutThirdPartyJobFailureResult" ], "Resource": [ "arn:aws:codepipeline:us-east-2::actionType:ThirdParty/Build/Provider/1/" ] } ] }