为 CodeCommit 源创建 EventBridge 规则 (CLI) - AWS CodePipeline

为 CodeCommit 源创建 EventBridge 规则 (CLI)

调用 put-rule 命令,在命令中指定:

  • 唯一地标识创建的规则的名称。在使用 CodePipeline 创建的与您的 AWS 账户关联的所有管道中,该名称必须是唯一的。

  • 规则使用的源事件模式和详细信息字段。有关更多信息,请参阅 Amazon EventBridge 和事件模式

创建以 CodeCommit 作为事件源并以 CodePipeline 作为目标的 EventBridge 规则
  1. 为 EventBridge 添加权限以使用 CodePipeline 调用规则。有关更多信息,请参阅针对 Amazon EventBridge 使用基于资源的策略

    1. 使用以下示例创建信任策略以允许 EventBridge 代入服务角色。将信任策略命名为 trustpolicyforEB.json

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. 使用以下命令创建 Role-for-MyRule 角色并附加信任策略。

      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
    3. 为名为 MyFirstPipeline 的管道创建权限策略 JSON,如此示例中所示。将权限策略命名为 permissionspolicyforEB.json

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:StartPipelineExecution" ], "Resource": [ "arn:aws:codepipeline:us-west-2:111122223333:MyFirstPipeline" ] } ] }
    4. 使用以下命令将 CodePipeline-Permissions-Policy-for-EB 权限策略附加到 Role-for-MyRule 角色。

      我为何做出此更改? 向角色添加此策略将为 EventBridge 创建权限。

      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
  2. 调用 put-rule 命令并包含 --name--event-pattern--role-arn 参数。

    我为何做出此更改? 此命令将允许 CloudFormation 创建事件。

    以下示例命令创建一个名为 MyCodeCommitRepoRule 的规则。

    aws events put-rule --name "MyCodeCommitRepoRule" --event-pattern "{\"source\":[\"aws.codecommit\"],\"detail-type\":[\"CodeCommit Repository State Change\"],\"resources\":[\"repository-ARN\"],\"detail\":{\"referenceType\":[\"branch\"],\"referenceName\":[\"main\"]}}" --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
  3. 要将 CodePipeline 添加为目标,请调用 put-targets 命令并包含以下参数:

    • --rule 参数与您使用 rule_name 创建的 put-rule 结合使用。

    • --targets 参数与目标列表中该目标的列表 Id 以及目标管道的 ARN 结合使用。

    以下示例命令为名为 MyCodeCommitRepoRule 的规则指定此内容,目标 Id 由数字 1 组成,这指示此内容位于规则的目标列表中,而这是目标 1。示例命令还为管道指定一个示例 ARN。管道在存储库中发生更改时启动。

    aws events put-targets --rule MyCodeCommitRepoRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
  4. (可选)要为特定映像 ID 配置具有源覆盖的输入转换器,请在 CLI 命令中使用以下 JSON:以下示例配置了覆盖,其中:

    • actionName,本示例中的 Source,是在创建管道时定义的动态值,不是从源事件派生的。

    • revisionType,本示例中的 COMMIT_ID,是在创建管道时定义的动态值,不是从源事件派生的。

    • revisionValue,本示例中的 <revisionValue>,是从源事件变量派生的。

    { "Rule": "my-rule", "Targets": [ { "Id": "MyTargetId", "Arn": "pipeline-ARN", "InputTransformer": { "sourceRevisions": { "actionName": "Source", "revisionType": "COMMIT_ID", "revisionValue": "<revisionValue>" }, "variables": [ { "name": "Branch_Name", "value": "value" } ] } } ] }
编辑您的管道的 PollForSourceChanges 参数
重要

使用此方法创建管道时,如果 PollForSourceChanges 参数未明确设置为 false,则默认为 true。添加基于事件的更改检测时,必须将参数添加到输出并将其设置为 false 以禁用轮询。否则,您的管道将针对单个源更改启动两次。有关更多信息,请参阅 PollForSourceChanges 参数的有效设置

  1. 运行 get-pipeline 命令以将管道结构复制到 JSON 文件中。例如,对于名为 MyFirstPipeline 的管道,运行以下命令:

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    该命令不会返回任何结果,但您创建的文件将出现在您运行命令所在的目录中。

  2. 在任何纯文本编辑器中打开 JSON 文件并通过将 PollForSourceChanges 参数更改为 false 来编辑源阶段,如此示例中所示。

    我为何做出此更改? 将此参数更改为 false 将关闭定期检查,因此您只能使用基于事件的更改检测。

    "configuration": { "PollForSourceChanges": "false", "BranchName": "main", "RepositoryName": "MyTestRepo" },
  3. 如果您要使用通过 get-pipeline 命令检索到的管道结构,请删除 JSON 文件中的 metadata 行。否则,update-pipeline 命令无法使用它。删除 "metadata": { } 行以及 "created""pipelineARN""updated" 字段。

    例如,从结构中删除以下各行:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" },

    保存该文件。

  4. 要应用更改,请运行 update-pipeline 命令,指定管道 JSON 文件:

    重要

    务必在文件名前包含 file://。此命令中需要该项。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    该命令会返回编辑后的管道的整个结构。

    注意

    update-pipeline 命令会停止管道。如果在运行 update-pipeline 命令时正在通过管道运行修订,则该运行会被停止。您必须手动启动管道,通过升级后的管道运行此修订。使用 start-pipeline-execution 命令手动启动您的管道。