配置CodePipeline时触发"File does not exist in artifact [SourceArtifact]"错误,S3存在目标文件
CodePipeline 部署阶段报
File does not exist in artifact [SourceArtifact] 修复方案 核心报错根源
这个报错本质是路径匹配规则不匹配,和S3桶里实际有没有存储目标文件没有关系:
- CodePipeline 的
SourceArtifact是源阶段从指定S3位置拉取文件后,打包生成的流水线内部流转制品,它识别文件的规则是制品压缩包内部的相对路径 - 你填到部署配置里的完整S3对象URL,是带域名、鉴权参数的公网访问地址,对于CodePipeline来说这串长文本就是一个要检索的文件名,它会在制品包里找名称完全等于这串长字符串的文件,自然找不到就触发报错。
正确配置流程
- 先完成源阶段的基础校验:确认你作为代码源的S3桶已经开启版本控制,这是CodePipeline能正常拉取源制品的强制前置要求,未开启版本控制的桶无法作为CodePipeline的S3源使用。
- 提取正确的文件路径:直接把你在源阶段绑定的S3对象的桶内key值拿出来当制品路径——比如你源阶段选的S3对象key是
release/v2.0/app.zip,那对应的制品路径就是release/v2.0/app.zip,不需要拼接桶域名、Region、鉴权参数这些内容。 - 部署阶段配置时,把上面提取的纯key值填到对应需要指定文件的配置项里,不要粘贴完整的S3访问URL。
- 校验技巧:配置完源阶段后,先手动触发一次流水线执行,跑到源阶段完成后,点开执行详情里的SourceArtifact预览界面,直接从制品的文件列表里复制目标文件的路径粘贴到部署配置里,能完全规避路径大小写、层级不匹配的问题。
容易触发同类报错的细节
- S3的对象key是大小写敏感的,填路径时如果和实际制品里的文件名大小写对不上(比如实际是
deploy.sh你填成了Deploy.sh),会触发完全一样的报错。 - 不要把带临时鉴权的S3预签名链接当路径填进去,链接里
?后面的所有查询参数都是鉴权用的,不属于文件路径的一部分。 - 如果源阶段绑定的是S3里的“文件夹”路径,CodePipeline会把文件夹下所有文件保留目录结构打包进Artifact,这时候部署阶段填的路径要对应到文件夹里的具体文件,不能直接填文件夹名称。
内容的提问来源于stack exchange,提问作者Abhishek Hc
相关产品推荐
相关产品推荐

