AWS CodePipeline中CodeBuild重复运行循环问题求助
AWS CodeBuild重复循环触发问题排查与解决
我搭建了基于AWS CodePipeline -> CodeBuild -> CodeDeploy的CI/CD流水线,后续在CodePipeline中添加了人工审批环节,但现在遇到了CodeBuild重复运行的循环问题,进而导致CodeDeploy被反复触发。
正常触发流程(GitHub代码变更时):
- CodePipeline源阶段触发
- CodeBuild构建Docker镜像并推送到ECR
- CodeDeploy执行build.sh文件,在EC2实例中创建Docker容器
原本所有步骤运行正常,添加人工审批后出现了循环问题。
可能的原因
- CodePipeline源触发器配置错误:CodeBuild的输出产物(如S3桶中的构建文件)被误设为源阶段的触发源,导致每次CodeBuild完成后再次触发Pipeline。
- GitHub Webhook重复触发:存在重复的Webhook配置,或CodeBuild流程中存在修改GitHub仓库的操作(如推送tag/文件),引发新一轮Pipeline触发。
- CodePipeline阶段逻辑错误:添加人工审批后,阶段跳转逻辑异常,导致构建阶段被重复调用。
- ECR镜像推送触发额外Pipeline:若有其他Pipeline或CloudWatch事件规则监听ECR镜像变更,可能间接触发当前Pipeline重复运行。
解决方案
检查CodePipeline源触发器
进入CodePipeline控制台,确认源阶段仅监听GitHub仓库的代码变更事件,而非CodeBuild输出的S3存储桶或ECR镜像资源。
验证GitHub Webhook配置
登录GitHub仓库的「Settings -> Webhooks」页面:
- 确认仅存在一个指向AWS CodePipeline的Webhook
- 仅勾选
push事件(避免全量事件触发) - 检查CodeBuild流程中是否存在
git push等修改GitHub仓库的操作,如有则移除
排查CodePipeline阶段配置
查看Pipeline的阶段编排,确认人工审批环节的位置正确,不存在循环跳转逻辑(如审批后错误回到构建阶段)。
检查ECR相关触发器
查看是否有其他Pipeline或CloudWatch事件规则监听ECR镜像推送事件,若有则调整规则范围,避免触发当前Pipeline。
相关配置文件
CodeBuild用buildspec.yml
version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - echo Build started on `date` - echo Building the Docker image... - docker pull 889801477235.dkr.ecr.ap-south-1.amazonaws.com/node-15-slim - docker tag 889801477235.dkr.ecr.ap-south-1.amazonaws.com/node-15-slim node:15-slim - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG - echo $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG - echo $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
CodeDeploy用buildspec.yml
version: 0.0 os: linux files: - source: / destination: /home/ec2-user/First-Alert_Backend hooks: AfterInstall: - location: build.sh timeout: 400 runas: root
build.sh
#!/bin/bash docker stop first_alert_backend docker rm first_alert_backend docker pull 889801477235.dkr.ecr.ap-south-1.amazonaws.com/first_alert_backend docker tag 889801477235.dkr.ecr.ap-south-1.amazonaws.com/first_alert_backend first_alert_backend docker run -d --network first_alert_network --link first_alert_mariadb:db --name first_alert_backend first_alert_backend docker image rm 889801477235.dkr.ecr.ap-south-1.amazonaws.com/first_alert_backend
内容的提问来源于stack exchange,提问作者Mohamed Anser Ali
相关产品推荐
相关产品推荐

