系列导读: 上一篇我们总结了 S3 触发模式的 8 个大坑。本篇开始玩更高级的——用 CodeCommit Git 仓库作为代码源,实现 每次 git push 自动触发 的 CI/CD 流水线。相比 S3 模式,CodeCommit 触发更自动化、更适合开发团队协作。


目标

完成本篇后,你将拥有一个真正意义上的持续交付流水线

CodeCommit 触发模式 CI/CD 流水线架构

工作流:

开发者 git push → CodeCommit → EventBridge → CodePipeline → CodeBuild → CodeDeploy → EC2

核心体验:

  • ✅ 修改代码 → git push → 30秒内自动部署

  • ✅ 分支策略:main 分支自动部署,develop 分支只构建不部署

  • ✅ 原生 AWS 集成,权限统一用 IAM 管理

  • ✅ 支持 Pull Request 构建(预览环境)


与 S3 模式的对比

维度

S3 触发模式

CodeCommit 触发模式

代码源

S3 桶(手动上传 zip)

CodeCommit Git 仓库

触发方式

轮询或 S3 事件通知

EventBridge(CloudWatch Events)

自动化程度

⭐⭐(需要手动打包上传)

⭐⭐⭐⭐⭐(git push 自动触发)

适用场景

跨团队交付 / 手动审批

开发团队内部 CI/CD

分支策略

不支持

支持(main/develop/feature 分支不同策略)

Pull Request

❌ 不支持

✅ 支持(PR 触发独立构建)

权限管理

S3 bucket policy + IAM

纯 IAM(更简洁)

结论: 如果你的代码已经在 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 事件。你不需要手动配置事件规则。

第七步:验证自动触发

  1. 首次触发(如果你在创建仓库时已经推送了代码,流水线应该已经运行了):

# 查看流水线执行状态
aws codepipeline get-pipeline-state --name mfmsapp-pipeline

# 查看执行历史
aws codepipeline list-pipeline-executions \
    --pipeline-name mfmsapp-pipeline \
    --max-results 5
  1. 测试自动触发:修改代码,再次推送

# 进入仓库目录
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 触发模式的核心优势是分支策略。你可以让不同分支触发不同的行为:

分支

行为

用途

main

自动构建 + 自动部署到生产环境

正式发布

develop

自动构建,但不部署

开发集成测试

feature/*

不自动触发,手动触发构建

功能开发、PR 预览

实现多分支策略

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 仓库。

解决方案:

  1. 在 CodePipeline 所在账号创建 跨账号 IAM 角色,授权 CodePipeline 使用

  2. 或者直接把代码迁移到流水线同账号的 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 触发失败排查表

症状

检查项

命令/操作

git push 后无反应

CodePipeline Source 阶段配置

aws codepipeline get-pipeline --name xxx

PollForSourceChanges 是否为 true

查看配置输出

EventBridge 规则是否存在

aws events list-rules --name-prefix CodePipeline

IAM 权限:CodePipeline 能否读取 CodeCommit

附加 AWSCodePipelineServiceRole

触发但 Build 失败

CodeBuild 能否访问源码

检查 CodeBuild 项目的 source.type=CODECOMMIT

CodeBuild 角色权限

附加 AWSCodeBuildAdminAccess

Deploy 失败

CodeDeploy Agent 状态

EC2 上 systemctl status codedeploy-agent

EC2 标签匹配

EC2 标签 Name=mfmsapp-server

CodeDeploy 应用/部署组配置

aws deploy get-deployment-group


完整配置清单

在开始之前,确认你已准备好:

  • CodeCommit 仓库已创建

  • 源码已推送到 CodeCommit(main 分支)

  • EC2 实例(Amazon Linux 2023)已启动并运行

  • EC2 实例标签:Name = mfmsapp-server

  • EC2 已安装并启动 CodeDeploy Agent

  • IAM 角色:CodePipeline、CodeBuild、CodeDeploy 角色(已附加托管策略或自定义策略)

  • CodeDeploy 应用和部署组已创建

  • CodeBuild 项目已创建(source type=CODECOMMIT,artifacts type=CODEPIPELINE)

  • CodePipeline 已创建(Source 阶段用 CodeCommit provider)


官方文档参考

主题

文档链接

CodePipeline + CodeCommit 集成

AWS 官方教程

CodeCommit 事件架构

EventBridge 事件模式

跨账号访问 CodeCommit

跨账号配置

CodeBuild 构建规范

buildspec 参考


下一篇预告

第 05 篇:CodeCommit 模式避坑指南

CodeCommit 触发虽然自动化程度高,但也有一些隐藏的坑:

  • EventBridge 触发延迟问题

  • 构建缓存配置不当导致构建慢

  • 多分支策略的实现细节

  • PR 预览环境的搭建

下一篇详细盘点,帮你用得更顺手。


本文档内容基于 2026 年 4 月 AWS 官方文档整理。AWS 服务可能随时更新,如遇差异请以 AWS 官方文档 为准。