系列导读: 上一篇我们总结了 S3 触发模式的 8 个大坑。本篇开始玩更高级的——用 CodeCommit Git 仓库作为代码源,实现 每次 git push 自动触发 的 CI/CD 流水线。相比 S3 模式,CodeCommit 触发更自动化、更适合开发团队协作。
目标
完成本篇后,你将拥有一个真正意义上的持续交付流水线:

工作流:
开发者 git push → CodeCommit → EventBridge → CodePipeline → CodeBuild → CodeDeploy → EC2
核心体验:
✅ 修改代码 →
git push→ 30秒内自动部署✅ 分支策略:
main分支自动部署,develop分支只构建不部署✅ 原生 AWS 集成,权限统一用 IAM 管理
✅ 支持 Pull Request 构建(预览环境)
与 S3 模式的对比
结论: 如果你的代码已经在 CodeCommit(或 GitHub/Bitbucket),优先用 CodeCommit 触发模式。只有当你需要完全手动控制(如第三方系统交付)时才用 S3 模式。
准备工作
在开始之前,你需要:
✅ AWS 账号,AWS CLI 已配置
✅ 一台 Amazon EC2 实例(Amazon Linux 2023),已安装 CodeDeploy Agent
✅ CodeCommit 仓库已创建(如果是第一次用,先创建仓库)
检查前提条件
# 1. AWS CLI 可用
aws sts get-caller-identity
# 2. EC2 实例已安装 CodeDeploy Agent(参考第 02 篇安装步骤)
# 在 EC2 上运行
sudo systemctl status codedeploy-agent
# 3. EC2 实例有 mfmsapp-server 标签(用于 CodeDeploy 目标匹配)
# 在 EC2 控制台查看实例的标签
# Key: Name, Value: mfmsapp-server
方案 A:全新搭建(从零开始)
如果你是第一次配置 CodeCommit 触发模式,按以下步骤操作。
第一步:创建 CodeCommit 仓库
# 设置变量
export AWS_REGION="ap-northeast-1"
export REPO_NAME="mfmsapp-repo"
# 创建 CodeCommit 仓库
aws codecommit create-repository \
--repository-name "$REPO_NAME" \
--region "$AWS_REGION"
# 获取仓库的 HTTPS 克隆 URL
aws codecommit get-repository \
--repository-name "$REPO_NAME" \
--query 'repositoryMetadata.cloneUrlHttp' \
--output text
# 输出示例:https://codecommit.ap-northeast-1.amazonaws.com/v1/repos/mfmsapp-repo
⚠️ 注意: CodeCommit 需要 IAM 认证才能推送。如果你是第一次用,需要配置 Git 凭证:
# 方法 1:使用 AWS CLI 生成的凭证(推荐) aws codecommit credential-helper --get # 方法 2:配置 git-remote-codecommit git config --global credential.helper '!aws codecommit credential-helper $@' git config --global credential.UseHttpPath true
第二步:克隆仓库并推送代码
# 1. 克隆空仓库
git clone https://codecommit.ap-northeast-1.amazonaws.com/v1/repos/mfmsapp-repo
cd mfmsapp-repo
# 2. 复制 mfmsapp 源代码(参考第 02 篇的源码结构)
# 确保目录结构正确:
# .
# ├── main.go
# ├── go.mod
# ├── buildspec.yml
# ├── appspec.yml
# └── scripts/
# ├── start.sh
# ├── before_install.sh
# └── after_install.sh
# 3. 提交并推送
git add .
git commit -m "Initial commit: mfmsapp v1"
git push origin main
此时你应该已经触发了一次流水线! 继续下面的步骤创建 CodePipeline,它会自动检测到 CodeCommit 的新提交并开始运行。
第三步:创建 IAM 服务角色
CodePipeline、CodeBuild、CodeDeploy 各自的执行角色。这里我们使用托管策略简化配置(生产环境再收紧)。
# 1. 创建 CodePipeline 服务角色(如果不存在)
aws iam create-role \
--role-name AWSCodePipelineServiceRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": ["codepipeline.amazonaws.com"]},
"Action": ["sts:AssumeRole"]
}]
}'
# 附加托管策略
aws iam attach-role-policy \
--role-name AWSCodePipelineServiceRole \
--policy-arn arn:aws:iam::aws:policy/AWSCodePipelineServiceRole
# 2. 创建 CodeBuild 服务角色
aws iam create-role \
--role-name AWSCodeBuildServiceRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": ["codebuild.amazonaws.com"]},
"Action": ["sts:AssumeRole"]
}]
}'
aws iam attach-role-policy \
--role-name AWSCodeBuildServiceRole \
--policy-arn arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess
# 3. 创建 CodeDeploy 服务角色(如果不存在)
aws iam create-role \
--role-name AWSCodeDeployRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": ["codedeploy.amazonaws.com"]},
"Action": ["sts:AssumeRole"]
}]
}'
aws iam attach-role-policy \
--role-name AWSCodeDeployRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole
⚠️ 关键提醒: CodeDeploy 角色需要额外权限才能访问 EC2。如果 EC2 实例有 CodeDeploy 标签(Key=Name, Value=mfmsapp-server),CodeDeploy 会自动匹配。确保 EC2 实例已正确打标签。
第四步:创建 CodeDeploy 应用和部署组
# 获取 CodeDeploy 角色 ARN
CODEDEPLOY_ROLE_ARN=$(aws iam get-role \
--role-name AWSCodeDeployRole \
--query 'Role.Arn' --output text)
# 创建 CodeDeploy 应用
aws deploy create-application \
--application-name mfmsapp \
--compute-platform Server
# 创建部署组(部署到所有带 mfmsapp-server 标签的 EC2 实例)
aws deploy create-deployment-group \
--application-name mfmsapp \
--deployment-group-name mfmsapp-prod \
--service-role-arn "$CODEDEPLOY_ROLE_ARN" \
--ec2-tag-filters Key=Name,Value=mfmsapp-server,Type=KEY_AND_VALUE \
--deployment-config-name CodeDeployDefault.OneAtATime
第五步:创建 CodeBuild 项目
CODEBUILD_ROLE_ARN=$(aws iam get-role \
--role-name AWSCodeBuildServiceRole \
--query 'Role.Arn' --output text)
aws codebuild create-project \
--name mfmsapp-build \
--source type=CODECOMMIT,location="$REPO_NAME" \
--artifacts type=CODEPIPELINE \
--environment type=LINUX_CONTAINER,image=aws/codebuild/amazonlinux2-x86_64-standard:5.0,computeType=BUILD_GENERAL1_SMALL \
--service-role "$CODEBUILD_ROLE_ARN"
关键区别: 与 S3 模式不同,这里的 --source 用的是 type=CODECOMMIT,而不是 S3。
第六步:创建 CodePipeline(支持 EventBridge 触发)
现在创建 CodePipeline,Source 阶段使用 CodeCommit 作为源,自动配置 EventBridge 触发器。
PIPELINE_ROLE_ARN=$(aws iam get-role \
--role-name AWSCodePipelineServiceRole \
--query 'Role.Arn' --output text)
aws codepipeline create-pipeline \
--pipeline name=mfmsapp-pipeline \
--pipeline-type V2 \
--role-arn "$PIPELINE_ROLE_ARN" \
--stages '[
{
"name": "Source",
"actions": [{
"name": "SourceAction",
"actionTypeId": {
"category": "Source",
"owner": "AWS",
"provider": "CodeCommit",
"version": "1"
},
"outputArtifacts": [{"name": "SourceArtifact"}],
"configuration": {
"RepositoryName": "'"$REPO_NAME"'",
"BranchName": "main",
"PollForSourceChanges": "true"
},
"runOrder": 1
}]
},
{
"name": "Build",
"actions": [{
"name": "BuildAction",
"actionTypeId": {
"category": "Build",
"owner": "AWS",
"provider": "CodeBuild",
"version": "1"
},
"inputArtifacts": [{"name": "SourceArtifact"}],
"outputArtifacts": [{"name": "BuildArtifact"}],
"configuration": {
"ProjectName": "mfmsapp-build"
},
"runOrder": 1
}]
},
{
"name": "Deploy",
"actions": [{
"name": "DeployAction",
"actionTypeId": {
"category": "Deploy",
"owner": "AWS",
"provider": "CodeDeploy",
"version": "1"
},
"inputArtifacts": [{"name": "BuildArtifact"}],
"configuration": {
"ApplicationName": "mfmsapp",
"DeploymentGroupName": "mfmsapp-prod"
},
"runOrder": 1
}]
}
]'
重点: PollForSourceChanges: "true" 对于 CodeCommit,AWS 会自动创建对应的 EventBridge 规则来监听 codecommit Repository State Change 事件。你不需要手动配置事件规则。
第七步:验证自动触发
首次触发(如果你在创建仓库时已经推送了代码,流水线应该已经运行了):
# 查看流水线执行状态
aws codepipeline get-pipeline-state --name mfmsapp-pipeline
# 查看执行历史
aws codepipeline list-pipeline-executions \
--pipeline-name mfmsapp-pipeline \
--max-results 5
测试自动触发:修改代码,再次推送
# 进入仓库目录
cd ~/workspace/mfmsapp-repo
# 修改任意文件(例如更新版本号)
echo "// Version: v1.1" >> main.go
# 提交并推送
git add .
git commit -m "Update version to v1.1"
git push origin main
# 等待 10-30 秒,查看流水线是否自动开始新执行
aws codepipeline get-pipeline-state --name mfmsapp-pipeline
预期: 推送后 30 秒内,Source 阶段变为 "InProgress",随后 Build、Deploy 依次执行。
方案 B:从 S3 模式迁移到 CodeCommit 模式
如果你已经按第 02、03 篇搭建了 S3 触发模式,现在想切换到 CodeCommit,按以下步骤迁移:
步骤 1:创建 CodeCommit 仓库并推送代码
# 创建仓库(如果还没有)
aws codecommit create-repository --repository-name mfmsapp-repo
# 将现有代码推送到 CodeCommit(替换 remote 地址)
cd ~/workspace/mfmsapp
git remote rename origin origin-s3-backup
git remote add origin https://codecommit.ap-northeast-1.amazonaws.com/v1/repos/mfmsapp-repo
git push -u origin main
步骤 2:更新 CodePipeline 的 Source 阶段
# 获取当前流水线定义(JSON)
aws codepipeline get-pipeline --name mfmsapp-pipeline > pipeline.json
# 编辑 pipeline.json,修改 Source 阶段:
# 将 "provider": "S3" 改为 "provider": "CodeCommit"
# 删除 S3 相关的 configuration(S3Bucket、S3ObjectKey)
# 添加 CodeCommit 配置:
# "RepositoryName": "mfmsapp-repo",
# "BranchName": "main",
# "PollForSourceChanges": "true"
# 更新流水线
aws codepipeline update-pipeline --pipeline file://pipeline.json
步骤 3:删除 S3 桶(可选)
确认新的 CodeCommit 流水线正常工作后,可以删除旧的 S3 源桶:
# 确认桶名(第 02 篇创建的)
export SOURCE_BUCKET="awscodepipeline-demo-xxx"
# 删除桶(⚠️ 桶必须为空才能删除)
aws s3 rm s3://$SOURCE_BUCKET --recursive
aws s3api delete-bucket --bucket $SOURCE_BUCKET
高级配置:多分支策略
CodeCommit 触发模式的核心优势是分支策略。你可以让不同分支触发不同的行为:
实现多分支策略
1. 为 develop 分支创建不部署的流水线
# 创建第二个 CodePipeline(仅构建,无 Deploy 阶段)
aws codepipeline create-pipeline \
--pipeline name=mfmsapp-pipeline-develop \
--pipeline-type V2 \
--role-arn "$PIPELINE_ROLE_ARN" \
--stages '[
{
"name": "Source",
"actions": [{
"name": "SourceAction",
"actionTypeId": {
"category": "Source",
"owner": "AWS",
"provider": "CodeCommit",
"version": "1"
},
"outputArtifacts": [{"name": "SourceArtifact"}],
"configuration": {
"RepositoryName": "'"$REPO_NAME"'",
"BranchName": "develop", // 👈 区别在这里
"PollForSourceChanges": "true"
},
"runOrder": 1
}]
},
{
"name": "Build",
"actions": [{
"name": "BuildAction",
"actionTypeId": {
"category": "Build",
"owner": "AWS",
"provider": "CodeBuild",
"version": "1"
},
"inputArtifacts": [{"name": "SourceArtifact"}],
"outputArtifacts": [{"name": "BuildArtifact"}],
"configuration": {
"ProjectName": "mfmsapp-build"
},
"runOrder": 1
}]
}
// 没有 Deploy 阶段
]'
2. 为 Pull Request 创建预览环境(可选)
CodeCommit 支持 Pull Request 触发。你可以配置一个独立的流水线,为每个 PR 构建一个临时预览环境(例如部署到独立的 EC2 实例或 ECS 任务)。
配置方法:
# 创建 PR 触发的 CodePipeline
aws codepipeline create-pipeline \
--pipeline name=mfmsapp-pipeline-pr \
--pipeline-type V2 \
--role-arn "$PIPELINE_ROLE_ARN" \
--stages '[...]' \
--trigger-type EVENT_BASED
然后在 CodeCommit 仓库设置中,配置 PR 事件触发该流水线。这需要更复杂的 EventBridge 规则,生产环境可参考 AWS 官方文档。
CodeCommit 模式专属坑点
虽然 CodeCommit 触发比 S3 简单,但也有自己的坑。
坑 1:Webhook 延迟比 S3 慢
现象: git push 后,流水线 30-60 秒才开始,而 S3 模式 5-10 秒就触发了。
原因: CodeCommit 通过 EventBridge 触发,EventBridge 检测到 codecommit Repository State Change 事件后,需要调用 CodePipeline 的 StartPipelineExecution API,中间有延迟。
解决方案:
这是正常现象,无法优化
如果对实时性要求极高(<5 秒),继续用 S3 模式
大多数团队可以接受 30 秒延迟
坑 2:推送大文件失败
现象: 推送超过 2GB 的文件时,git push 失败,提示 "fatal: The remote end hung up unexpectedly"。
原因: CodeCommit 有单个文件大小限制 2GB,单次推送总大小限制 6GB(具体限制查最新文档)。
解决方案:
不要把二进制文件(如大型模型、测试数据)提交到 Git
二进制文件用 S3 + 下载脚本的方式处理
如果必须存大文件,考虑 Git LFS(但 CodeCommit 对 LFS 支持有限)
坑 3:跨账号访问 CodeCommit 需要额外配置
现象: 流水线在账号 A,代码在账号 B 的 CodeCommit,触发失败。
原因: CodePipeline 默认只能访问同账号的 CodeCommit 仓库。
解决方案:
在 CodePipeline 所在账号创建 跨账号 IAM 角色,授权 CodePipeline 使用
或者直接把代码迁移到流水线同账号的 CodeCommit
# 创建跨账号角色(简化示例)
aws iam create-role \
--role-name CrossAccountCodeCommitRead \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::PIPELINE_ACCOUNT_ID:root"},
"Action": "sts:AssumeRole"
}]
}'
# 附加 CodeCommit 只读策略
aws iam attach-role-policy \
--role-name CrossAccountCodeCommitRead \
--policy-arn arn:aws:iam::aws:policy/AWSCodeCommitReadOnly
然后在 CodePipeline 的 Source 阶段配置中,指定 role-arn 为该跨账号角色。
坑 4:EventBridge 规则冲突
现象: 引入了其他 EventBridge 规则监听同一个 CodeCommit 仓库,导致一次提交触发多次流水线执行。
原因: 如果你手动创建了 EventBridge 规则监听 codecommit Repository State Change 事件,而 CodePipeline 的 Source 阶段也自带触发机制,就会重复。
解决方案: 确保只保留一个触发器:
如果 CodePipeline 使用
PollForSourceChanges: "true",不要额外创建 EventBridge 规则如果需要更精细的事件过滤(例如只监听 main 分支),才手动创建 EventBridge 规则
排障:CodeCommit 触发失败排查表
完整配置清单
在开始之前,确认你已准备好:
CodeCommit 仓库已创建
源码已推送到 CodeCommit(main 分支)
EC2 实例(Amazon Linux 2023)已启动并运行
EC2 实例标签:
Name = mfmsapp-serverEC2 已安装并启动 CodeDeploy Agent
IAM 角色:CodePipeline、CodeBuild、CodeDeploy 角色(已附加托管策略或自定义策略)
CodeDeploy 应用和部署组已创建
CodeBuild 项目已创建(source type=CODECOMMIT,artifacts type=CODEPIPELINE)
CodePipeline 已创建(Source 阶段用 CodeCommit provider)
官方文档参考
下一篇预告
第 05 篇:CodeCommit 模式避坑指南
CodeCommit 触发虽然自动化程度高,但也有一些隐藏的坑:
EventBridge 触发延迟问题
构建缓存配置不当导致构建慢
多分支策略的实现细节
PR 预览环境的搭建
下一篇详细盘点,帮你用得更顺手。
本文档内容基于 2026 年 4 月 AWS 官方文档整理。AWS 服务可能随时更新,如遇差异请以 AWS 官方文档 为准。