Jenkins运行.sh脚本执行gcloud报command not found错误
问题现象
Mac本地环境执行.sh脚本内的gcloud命令可正常运行,同一份脚本放到Jenkins任务中执行时,直接抛出gcloud: command not found报错。
根因说明
该问题本质是运行环境的PATH变量不一致导致的:
本地打开终端执行命令属于交互登录shell场景,启动时会自动加载~/.zshrc、~/.bash_profile、/etc/paths等配置文件,gcloud安装时写入的路径配置会被自动加载到PATH中,因此可以直接调用。
而Jenkins执行任务时默认使用非交互非登录shell,不会主动加载用户级的shell配置文件,PATH变量中没有包含gcloud可执行文件的所在目录,自然无法识别命令。
排查步骤
- 在Jenkins任务的执行脚本最前端加入
echo $PATH,和本地终端执行同命令的输出做对比,确认是否缺失gcloud相关路径 - 本地终端执行
which gcloud,拿到gcloud可执行文件的绝对路径,确认该路径是否存在于Jenkins任务输出的PATH列表中 - 分别在本地终端、Jenkins脚本中执行
whoami,确认两边的运行用户是否一致,排查是否存在gcloud安装在某用户私有目录下、Jenkins运行用户无访问权限的情况
解决方法
按稳定性从高到低排序:
- 直接使用gcloud绝对路径调用
把本地which gcloud返回的绝对路径(例如/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud)替换脚本中所有gcloud命令的前缀,比如原命令gcloud compute instances list改为/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud compute instances list,完全绕开PATH查找逻辑,不受环境变量变动影响,是最稳妥的方案。 - 脚本内主动加载gcloud环境配置
在.sh脚本的开头先执行gcloud自带的初始化脚本,再调用后续gcloud命令,示例:# zsh环境用这两行,路径替换为本地实际的google-cloud-sdk安装路径 source /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc source /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc # bash环境替换为path.bash.inc即可 - Jenkins任务内追加PATH配置
在Jenkins任务的shell执行步骤最前端,把gcloud的bin目录追加到PATH变量中,示例:# 替换为本地实际的gcloud bin目录路径 export PATH="/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin:$PATH" - 调整Jenkins启动加载逻辑
修改Jenkins的启动配置,让服务启动时加载对应用户的shell环境变量,该方案需要修改服务配置,后续迁移、升级环境时容易复现问题,不推荐使用。
内容的提问来源于stack exchange,提问作者Scozirge2
相关产品推荐
相关产品推荐

