Jenkins流水线任务为何在临时文件夹中执行命令?
问题解答
1. 为什么Jenkins会在临时文件夹执行命令?
Jenkins的sh步骤会把你编写的命令生成临时脚本文件,放在workspace@tmp/durable-xxx这类临时目录中执行,这是它的持久化任务机制:
- 避免Jenkins服务重启、Agent节点断开时,任务执行进度丢失
- 方便记录脚本执行状态,支持断点续跑
- 隔离不同步骤的执行环境,防止脚本间的文件干扰
2. 为什么终端能运行emulator,Jenkins里却找不到?
终端和Jenkins的运行环境变量存在差异:
- 你在终端打开的shell(比如zsh/bash)会加载用户目录下的
.zshrc/.bash_profile等配置文件,这些文件里包含了Android SDK的路径配置,因此能找到emulator命令 - Jenkins作为后台服务运行时,默认使用系统级shell,不会加载你的用户级环境变量,导致
emulator所在路径不在Jenkins的PATH中,自然找不到命令
解决方法
方法一:直接使用emulator的绝对路径执行
先在终端执行which emulator,得到命令的绝对路径(例如/Users/你的用户名/Library/Android/sdk/emulator/emulator),然后在Jenkins脚本中替换为绝对路径:
pipeline { agent any stages { stage('Build') { steps { sh('/Users/你的用户名/Library/Android/sdk/emulator/emulator -list-avds') } } } }
方法二:在流水线内手动设置PATH环境变量
把emulator所在目录添加到Jenkins的PATH中:
pipeline { agent any environment { PATH = "/Users/你的用户名/Library/Android/sdk/emulator:$PATH" } stages { stage('Build') { steps { sh('emulator -list-avds') } } } }
方法三:配置Jenkins全局环境变量
进入Jenkins管理后台 → 系统管理 → 系统配置,找到「全局属性」,勾选「环境变量」,添加一条键为PATH,值为原有PATH内容:/Users/你的用户名/Library/Android/sdk/emulator(注意保留原有PATH,避免影响其他命令)。配置后所有流水线任务都会生效。
内容的提问来源于stack exchange,提问作者silly_goose
相关产品推荐
相关产品推荐

