Azure Pipelines中$(Build.SourcesDirectory)目录为空问题排查
问题根因
你使用的是deployment(部署)类型作业,而非Azure DevOps流水线的常规job类型。部署作业默认不会自动执行代码拉取操作,这就是$(Build.SourcesDirectory)目录为空的核心原因:路径变量本身没有问题,是作业没有主动把仓库代码拉取到该目录下。
此前配置可正常运行,一般是因为之前使用的是普通job,或者当时在部署作业里显式配置了代码拉取步骤,后续调整配置时遗漏了该部分。
修复方案
按需选择以下任意一种方案即可解决问题:
- 方案1:保留现有deployment作业结构,在步骤最开头显式添加代码拉取步骤
在deploy.steps的第一个位置加入checkout: self配置,修改后的步骤片段如下:deploy: steps: - checkout: self # 显式拉取当前关联的代码仓库内容到SourcesDirectory目录 - task: CmdLine@2 displayName: Debug inputs: script: | echo 'Build.SourcesDirectory' echo $(Build.SourcesDirectory) ls -l $(Build.SourcesDirectory) - 方案2:如果不需要用到部署作业专属的环境绑定、部署策略能力,直接将deployment作业替换为普通job类型
普通job默认会自动拉取代码,无需额外配置checkout步骤,修改后的完整流水线配置如下:pool: vmImage: ubuntu-latest stages: - stage: Debug displayName: Debug jobs: - job: Debug # 替换原deployment类型为普通job displayName: Debug steps: - task: CmdLine@2 displayName: Debug inputs: script: | echo 'Build.SourcesDirectory' echo $(Build.SourcesDirectory) ls -l $(Build.SourcesDirectory)
补充说明
- 部署作业的设计定位是面向基础设施、应用发布的部署场景,默认只加载部署环境、部署生命周期相关的能力,不会自动执行代码拉取、构建类的前置操作,所有需要用到源码的场景都必须显式声明checkout步骤。
- 如果流水线需要拉取多个关联仓库的代码,只需在checkout步骤中指定对应仓库名称即可,例如
checkout: my-repo-name。
内容的提问来源于stack exchange,提问作者Lukasz Dynowski
相关产品推荐
相关产品推荐

