You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:32:58