Terraform在Azure DevOps运行时archive_file报目录缺失错误
故障原因
archive_file 数据源的source_dir相对路径解析基准是执行terraform命令时的当前工作目录,而非.tf配置文件自身的存放目录。
本地VS Code环境运行正常,是因为你执行Terraform命令时的工作目录刚好和配置文件所在目录匹配,../BlobToBlobTransferPackage能正确寻址到上级目录的目标文件夹;迁移到Azure DevOps后,Pipeline执行Terraform命令的默认工作目录和本地不一致,原相对路径指向了不存在的位置,触发目录找不到的报错。
修复方案
优先选第一种,一劳永逸解决跨环境路径问题:
- 使用Terraform内置的
path.module常量拼接路径,这是官方推荐的跨环境兼容写法,路径解析完全不依赖执行命令时的工作目录。修改后的archive_file配置如下:
data "archive_file" "file_function_app" { type = "zip" source_dir = "${path.module}/../BlobToBlobTransferPackage" output_path = "${path.module}/blobtoblobtransfer-app.zip" }
path.module会固定返回当前配置文件所在的绝对路径,无论在哪个目录触发Terraform命令,都能正确定位到目标文件夹。
如果不想修改Terraform配置,可以调整Pipeline配置:
- 在Azure DevOps的Terraform任务中,显式将工作目录(Working Directory)设置为你本地运行Terraform时对应的配置文件所在目录,保证Pipeline执行命令时的目录上下文和本地完全一致。禁止将工作目录设为仓库根目录,否则原配置中的
../会向上遍历到仓库目录之外,必然找不到目标文件夹。
快速排查方法
- 本地切换到仓库根目录执行
terraform plan,如果本地也复现目录不存在的报错,即可100%确认是工作目录差异导致的路径解析问题。 - 在Azure DevOps Pipeline执行Terraform步骤前,新增一个命令行步骤执行
ls -R(Linux代理)或dir /s(Windows代理),打印运行环境的完整目录结构,确认BlobToBlobTransferPackage文件夹的实际存放位置,同时排除代码检出阶段漏拉目标目录的问题。
内容的提问来源于stack exchange,提问作者Uzair Mehmood
相关产品推荐
相关产品推荐

