Terraform archive_file本地正常,GitLab CI/CD报错:文件不存在
问题解决:GitLab CI/CD中Terraform archive_file找不到output目录
问题原因
本地运行Terraform时,工作目录有足够权限且环境会自动处理目录创建,但GitLab CI的runner执行环境是全新无状态的,不会自动创建不存在的父目录,导致archive_file无法生成ZIP文件到指定路径。
解决方案
方案1:在CI脚本中提前创建目录(推荐)
修改.gitlab-ci.yml,在Terraform执行步骤前添加目录创建命令,确保目标路径存在:
terraform-deploy: stage: deploy script: - mkdir -p ./output # -p参数确保递归创建所有不存在的父目录 - terraform init - terraform apply -auto-approve
方案2:在Terraform配置中内置目录创建逻辑
如果希望通过Terraform自身处理目录创建,可以添加null_resource配合local-exec provisioner,并设置依赖关系:
resource "null_resource" "create_output_dir" { provisioner "local-exec" { command = "mkdir -p ./output" } # 确保每次执行都触发目录创建 triggers = { always_run = timestamp() } } data "archive_file" "source" { type = "zip" source_dir = "./src" output_path = "./output/function.zip" # 依赖目录创建完成后再生成归档文件 depends_on = [null_resource.create_output_dir] }
关键说明
mkdir -p是核心参数,它能避免因路径层级缺失导致的报错,即使output的上级目录不存在也能递归创建。- GitLab CI的runner环境每次都是全新初始化的,所有临时文件和目录在流水线结束后会被清理,因此每次执行都需要确保目标目录存在。
内容的提问来源于stack exchange,提问作者mrd44
相关产品推荐
相关产品推荐

