使用CodePipeline、CodeBuild、CodeCommit完整克隆失败排查
核心问题
配置OutputArtifactFormat = "CODEBUILD_CLONE_REF"实现完整Git克隆时,CodeBuild阶段出现repository not found for primary source and source version xxxxx错误,但默认CODE_ZIP格式正常工作。
排查与解决方案
1. 补充CodeBuild角色的缺失权限
CODEBUILD_CLONE_REF模式下,CodeBuild需要额外的CodeCommit权限来获取分支和提交信息,仅codecommit:GitPull和codecommit:GetRepository不够。需为CodeBuild服务角色添加以下权限:
{ "Effect": "Allow", "Action": [ "codecommit:GitPull", "codecommit:GetRepository", "codecommit:GetBranch", "codecommit:GetCommit" ], "Resource": "arn:aws:codecommit:你的区域:你的账号ID:你的仓库名" }
2. 检查Source Action的Assume Role权限
你在CodePipeline的Source action中指定了role_arn = var.assume_role_arn,这个角色需要满足两个条件:
- 信任策略允许CodePipeline扮演它:信任策略需包含
codepipeline.amazonaws.com作为Principal - 自身拥有CodeCommit访问权限:需要配置
codecommit:GetRepository、codecommit:GetBranch、codecommit:GetCommit权限,因为CodePipeline需要先获取仓库克隆元数据传递给CodeBuild
3. 验证仓库资源ARN的准确性
确保所有权限策略中的CodeCommit仓库ARN完全匹配,包括区域、账号ID、仓库名称,注意CodeCommit仓库名是大小写敏感的,检查var.git_repo_source是否与实际仓库名完全一致。
4. 确认KMS密钥的访问权限
由于你使用了KMS加密Artifact Store的S3桶,CodeBuild角色需要具备该KMS密钥的解密权限:
{ "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "你的KMS密钥ARN" }
CODEBUILD_CLONE_REF模式下,CodePipeline会将仓库克隆信息加密存储在S3,CodeBuild需要解密才能获取有效克隆地址。
5. 检查CodeBuild项目的Source配置
确保CodeBuild项目的Source类型为CODEPIPELINE,且没有多余的location配置(你当前注释掉location的操作是正确的,无需修改),避免多个源配置冲突。
内容的提问来源于stack exchange,提问作者MacUsers

