Azure Pipeline无法执行仓库deploy.sh脚本的路径问题解决
问题根因
两个异常现象本质是独立问题叠加导致:
- CMD任务假绿:Windows CMD本身不会把「找不到目标文件」判定为执行错误,命令执行完默认返回0退出码,流水线只要拿到0退出码就会标记成功,和脚本有没有真的跑起来没有关系。
- Bash任务报路径错:Bash解释器找不到目标脚本时会直接返回非0退出码,流水线直接标记失败,这反而是正常的错误提示,不是Bash任务本身有问题。
- 核心路径问题:Azure Pipeline所有任务的默认执行基准目录是内置变量
$(System.DefaultWorkingDirectory),也就是流水线拉取仓库代码后的根目录,写的相对路径没对齐这个基准、漏了代码拉取步骤、路径分隔符写错,都会导致找不到文件。
修正配置步骤
- 先补全代码拉取步骤
流水线第一步必须先拉取仓库代码,不然代理机器上根本不会存在deploy.sh文件:
这步执行完,Azure仓库里的所有文件都会同步到代理的steps: - checkout: self$(System.DefaultWorkingDirectory)目录下:如果deploy.sh直接放在仓库根目录,全路径就是$(System.DefaultWorkingDirectory)/deploy.sh;如果放在仓库的scripts/deploy这类子文件夹里,补上对应子目录路径即可。 - 弃用CMD任务跑shell脚本
CMD是Windows原生命令行,本身不具备解析shell脚本的能力,就算路径写对了也会报脚本格式错误,shell脚本必须用对应解释器执行,不要用Windows命令行强行跑,直接用官方Bash任务执行.sh脚本即可。 - 正确配置Bash任务
推荐用内置变量拼路径,不要写硬编码的本地绝对路径,配置参考:
如果不确定脚本实际所在目录,可以在执行脚本前加排查步骤,把代理上的目录结构全打印出来对照找路径:# Linux代理必加,Windows代理可跳过:给脚本加可执行权限 - task: Bash@3 inputs: targetType: 'inline' script: 'chmod +x $(System.DefaultWorkingDirectory)/deploy.sh' displayName: '给脚本添加可执行权限' # 执行部署脚本 - task: Bash@3 inputs: filePath: '$(System.DefaultWorkingDirectory)/deploy.sh' # 替换为仓库里deploy.sh的实际相对路径 workingDirectory: '$(System.DefaultWorkingDirectory)' displayName: '执行deploy.sh部署脚本'- script: | pwd ls -R displayName: '打印目录结构排查路径'
常见踩坑
- 路径分隔符统一用正斜杠
/:不管是Windows还是Linux代理跑Bash任务,正斜杠都能正常识别,不要用Windows的反斜杠\,容易触发字符转义导致路径识别错误。 - 不要随意修改任务的
workingDirectory参数:改了之后相对路径的基准目录就会变化,新手阶段直接固定用$(System.DefaultWorkingDirectory)作为工作目录即可。 - 如果脚本里有相对路径引用其他文件,所有路径都要以
$(System.DefaultWorkingDirectory)为基准编写,不然会出现能找到deploy.sh但脚本内引用的其他文件找不到的问题。 - 不要依赖CMD的默认退出码判断任务成功:如果后续必须用CMD跑任务,要手动加错误判断逻辑,比如文件不存在就主动执行
exit 1返回非0码,避免流水线假绿。
内容的提问来源于stack exchange,提问作者SmartestVEGA
相关产品推荐
相关产品推荐

