我想解决 AWS CodePipeline 运行多次的问题。
简短描述
AWS CodePipeline 运行多次有以下两个常见原因:
要解决此问题,请先查看管道历史记录,以确认导致管道运行两次的原因。
如果由于存在多个相同的 CloudWatch Events 规则而触发管道启动,请删除或禁用任何重复的规则。
如果由于轮询而触发管道启动,请阅读“了解 PollForSourceChanges 参数的默认行为”部分。然后根据您的场景,完成以下其中一个部分的步骤:
- 如果您使用 AWS CloudFormation 创建管道,请完成“更新 AWS CloudFormation 模板”部分中的步骤。
- 如果您使用 AWS 命令行界面 (AWS CLI) 创建管道,请完成“使用 JSON 文件更新管道”部分中的步骤。
- 如果您使用 AWS SDK 创建管道,请完成“根据您的语言的配置语法更新管道”部分中的步骤。
**重要事项:**使用创建管道时使用的相同方法更新管道。避免对管道进行带外更改,并确保完成仅适用于您场景的部分中的步骤。例如,如果您使用 AWS CloudFormation 创建管道,则请仅按照“更新 AWS CloudFormation 模板”部分中的步骤进行操作。
解决方法
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI。
确认导致出现问题的原因
- 打开 CodePipeline 控制台。
- 对于 Name(名称),选择管道的名称。
- 选择 View history(查看历史记录)。
- 在 Trigger(触发器)列中,检查是否存在因重复的 CloudWatch Events 规则触发的管道启动或因轮询而触发的管道启动。
- 如果存在因多个相同的 CloudWatch Events 规则而触发的启动,请删除或停用任何重复的规则。
如果由于轮询而触发管道启动,请继续阅读以下故障排除部分。
了解 pollForSourceChanges 参数的默认行为
以下内容决定了 PollForSourceChanges 和 CloudWatch Events 规则的行为:
- PollForSourceChanges 参数的默认行为由用于创建管道的方法决定。
- 在许多情况下,PollForSourceChanges 的值默认设置为 true,必须将其禁用。
- 如果您使用 CodePipeline 控制台创建管道,则源检测方法会自动设置为 Amazon CloudWatch Events。
- 如果您使用 AWS CloudFormation、AWS CLI 或 AWS SDK 创建管道,且未指定更改检测方法,则 PollForSourceChanges 将默认设置为 true(具体取决于创建方法)。
- 如果您使用 CodePipeline 控制台以外的方法创建管道,然后使用控制台进行带外更新,则 CodePipeline 会自动创建额外的 CloudWatch Events 规则。
- 如果您在 AWS CloudFormation 模板中创建 CloudWatch Events 规则,或者创建适用于 GitHub 版本 1 存储库的 Webhook,且未设置 PollForSourceChanges 参数,则您最终可使用两种方法来检测源中的更改。这会导致您的管道运行两次。
确认您的配置符合这些规则。
更新您的 AWS CloudFormation 模板
在您的 AWS CloudFormation 模板或管道配置文件中,将 PollForSourceChanges 参数设置为 false。
**注意:**默认情况下,PollForSourceChanges 参数设置为 true。
有关 GitHub 版本 1 Webhook 的详细信息,请参阅使用 Webhook 启动管道。
使用 JSON 文件更新管道
-
将您的管道结构复制到 JSON 文件中:
$ aws codepipeline get-pipeline --name NAME_OF_YOUR_PIPELINE > pipeline.json
-
在文本编辑器中打开 pipeline.json 文件,然后将 PollForSourceChanges 参数添加到源操作配置部分。将参数设置为 false。
-
从文件中删除以下元数据字段:
"metadata":{}
"created"
"pipelineARN"
"updated"
**重要事项:**必须从 pipeline.json 文件中删除这些元数据行,以便以下 update-pipeline 命令可以使用该文件。
-
保存 pipeline.json 文件,然后运行以下 update-pipeline 命令,以将更改应用于该文件:
$ aws codepipeline update-pipeline --cli-input-json file://pipeline.json
有关详细信息,请参阅编辑管道 (AWS CLI)。
根据您的语言的配置语法更新管道
有关更新管道的说明,请参阅您的语言对应的 SDK 文档。
例如,如果您使用 Python 部署管道,则可以在管道的配置部分中将 PollForSourceChanges 设置为 false。