Azure DevOps中S3Download任务因ENOENT失败,已正确队列下载项
问题描述
已在Azure DevOps的服务连接中配置AWS服务连接,用于拉取iOS构建所需图片资源。凭证正常,任务能正确列出S3存储桶及其子文件夹中的文件,但在构建代理上保存文件时出错。
管道中S3Download任务配置
- task: S3Download@1 inputs: awsCredientials: 'AWSCREDS' regionName: 'us-somewhere-1' bucketName: 'bucketname' globExpressions: 'NameOfFolderToSearchOnS3/**' targetFolder: '$(Build.ArtifactStagingDirectory)'
任务错误日志
... 112 Queueing download NameOfFolderToSearchOnS3/Splash Screens/ios/iphone-portrait-ios-8,8@retina.png 113 Queueing download NameOfFolderToSearchOnS3/Splash Screens/ios/iphone-portrait-ios-5,6@2x.png ##[error]Error: ENOENT: no such file or directory, open '/Users/runner/work/1/a/NameOfFolderToSearchOnS3/ Finishing: S3Download
疑问:是否需要在下载前手动创建文件夹及子文件夹?该下载任务是否支持自动创建目录结构?已尝试修改目标文件夹、提前创建NameOfFolderToSearchOnS3文件夹,但嵌套子文件夹处仍报错。
解决方案
- 检查并调整
S3Download@1的**flattenFolders参数**:默认该参数为false,会保留S3上的完整目录结构。如果路径包含空格、逗号等特殊字符,可能导致任务无法自动创建嵌套目录。可以尝试添加flattenFolders: true,将所有文件直接下载到目标根目录,验证是否能正常完成下载:- task: S3Download@1 inputs: awsCredientials: 'AWSCREDS' regionName: 'us-somewhere-1' bucketName: 'bucketname' globExpressions: 'NameOfFolderToSearchOnS3/**' targetFolder: '$(Build.ArtifactStagingDirectory)' flattenFolders: true - 手动递归创建完整嵌套目录:仅创建上层文件夹不足以解决问题,需要提前生成所有嵌套子目录。在S3Download任务前添加Bash任务,执行递归创建命令:
若需要更通用的处理(比如目录结构不确定),可以用AWS CLI先列出S3上的目录,再批量创建:mkdir -p "$(Build.ArtifactStagingDirectory)/NameOfFolderToSearchOnS3/Splash Screens/ios"aws s3 ls s3://bucketname/NameOfFolderToSearchOnS3/ --recursive | grep -v "\.png$" | awk '{print $4}' | xargs -I {} mkdir -p "$(Build.ArtifactStagingDirectory)/{}" - 替换路径中的特殊字符:如果文件名/路径里的逗号、空格是问题根源,可以在下载后重命名文件,或者在S3存储端调整路径命名(若业务允许)。
- 改用AWS CLI直接下载:如果官方S3Download任务存在兼容性问题,直接使用AWS CLI命令下载,该命令会自动创建所需目录结构,稳定性更高:
aws s3 cp s3://bucketname/NameOfFolderToSearchOnS3/ "$(Build.ArtifactStagingDirectory)/NameOfFolderToSearchOnS3/" --recursive
内容的提问来源于stack exchange,提问作者Ed Verity
相关产品推荐
相关产品推荐

