Azure DevOps部署作业中项目文件缺失问题排查
问题原因与解决方案
这个问题的核心在于Azure DevOps中普通Job和Deployment Job的默认行为差异:
为什么会出现这个情况?
- 你Build阶段用的是普通
job,这类作业默认会自动执行仓库代码的checkout操作,所以能看到仓库里的所有文件。 - 而Deploy阶段用的是
deployment类型的作业,Azure DevOps设计这类作业的初衷是部署已构建完成的产物,而非直接处理源码,所以默认不会自动拉取仓库代码——哪怕你让它依赖Build阶段,也不会自动继承Build阶段的工作目录内容。这就是为什么单独运行Deploy阶段时,工作目录也是空的。
两种解决思路,按需选择:
1. 直接让Deploy阶段拉取仓库源码
如果你的Deploy步骤确实需要用到仓库里的原始文件,只需在Deploy阶段的steps开头添加显式的checkout步骤即可:
strategy: runOnce: deploy: steps: - checkout: self # 新增这一行,拉取当前仓库代码 - task: Bash@3 inputs: targetType: 'inline' script: | pwd ls -la
2. 通过工件传递Build产物(更推荐的部署方式)
如果Deploy阶段需要的是Build阶段生成的产物(比如镜像构建脚本、编译后的文件等),更规范的做法是在Build阶段把产物发布为工件,然后在Deploy阶段下载使用:
第一步:在Build阶段添加发布工件的步骤
- stage: Build displayName: Build stage jobs: - job: Build displayName: Build pool: vmImage: $(vmImageName) steps: - task: Bash@3 inputs: targetType: 'inline' script: | pwd ls -la # 新增:发布构建产物为工件 - publish: $(System.DefaultWorkingDirectory) # 这里替换成你的实际产物目录 artifact: build-outputs
第二步:在Deploy阶段添加下载工件的步骤
strategy: runOnce: deploy: steps: # 新增:下载Build阶段发布的工件 - download: current artifact: build-outputs - task: Bash@3 inputs: targetType: 'inline' script: | # 工件会被下载到 $(Pipeline.Workspace)/build-outputs 目录 ls -la $(Pipeline.Workspace)/build-outputs
这样做的好处是避免重复拉取源码,同时更符合CI/CD的职责分离原则——Build负责构建产物,Deploy负责部署产物。
内容的提问来源于stack exchange,提问作者ejlouw
相关产品推荐
相关产品推荐

