Azure DevOps镜像构建中Packer克隆代码仓的路径查询
解决Packer构建AVD镜像时访问代码仓文件的路径问题
你遇到的核心问题是:Packer的provision脚本是在你正在构建的Azure VM实例内执行的,而代码仓是克隆在Azure DevOps代理机上的——这是两台完全独立的机器,所以你在VM里根本访问不到代理机上的$System.DefaultWorkingDirectory路径。
正确的解决步骤
1. 先确认代理机上代码仓的实际位置
在Azure DevOps流水线中,在Packer执行步骤之前,添加一个PowerShell任务,运行以下命令,输出代理机上的文件结构:
Get-ChildItem -Path "$System.DefaultWorkingDirectory" -Recurse | Select-Object FullName
通过这个输出,你可以明确代码仓里的Files文件夹到底在代理机的哪个路径下(比如可能是C:\agent2\_work\1\s\REPO_NAME\Files,或者直接在C:\agent2\_work\1\s\Files,取决于你的流水线checkout配置)。
2. 使用Packer的file provisioner复制文件到构建VM
在你的Packer模板中,添加file类型的provisioner,把代理机上的代码仓文件复制到构建中的VM里。示例配置如下:
provisioner "file" { source = "${var.agent_work_dir}/REPO_NAME/Files" destination = "C:\\Temp\\Files" }
然后在Azure DevOps流水线的Packer任务中,把代理机的工作目录作为变量传入:
- 比如在流水线变量里设置
agent_work_dir为$(System.DefaultWorkingDirectory) - 或者直接在Packer命令中传递:
packer build -var "agent_work_dir=$(System.DefaultWorkingDirectory)" template.pkr.hcl
3. 在后续脚本中使用VM内的路径
当文件复制完成后,你在Packer的PowerShell脚本里就可以用VM本地的路径(比如C:\Temp\Files)来访问这些文件了,比如:
ls C:\Temp\Files
为什么之前的尝试无效
- 你在Packer模板里运行
Get-Location得到的是构建VM的用户目录(C:\Users\packer),这是因为Packer是在这个VM内部执行脚本,和代理机完全无关 - 直接访问
C:\agent2\_work\1\s会报错,因为这个路径只存在于代理机上,构建VM里根本没有这个目录
内容的提问来源于stack exchange,提问作者theillien
相关产品推荐
相关产品推荐

