Jenkins流水线执行脚本时找不到服务器上已存在的文件求解
问题重现
执行的Shell命令:
build_date='2022-10-13' ui_tag_value=`cat /data/lib/jenkins/workspace/ui_tag.properties | grep ${build_date}= | cut -d'=' -f2`
错误信息:
cat: can't open '/data/lib/jenkins/workspace/ui_tag.properties': No such file or directory
直接在服务器执行命令正常,但Jenkins流水线执行报错,已尝试修改权限和路径无效。
可行修复方案
确认Jenkins工作目录实际路径
Jenkins的工作空间路径可能因节点配置、代理设置或流水线参数变化。在流水线中先执行pwd和ls -l /data/lib/jenkins/workspace/命令,查看该路径下的实际文件列表,确认ui_tag.properties是否存在于Jenkins运行时的上下文路径中。使用Jenkins内置变量引用工作空间
不要硬编码绝对路径,改用Jenkins提供的WORKSPACE环境变量,它会自动指向当前流水线的工作空间路径。修改命令为:build_date='2022-10-13' ui_tag_value=$(cat "${WORKSPACE}/ui_tag.properties" | grep "${build_date}=" | cut -d'=' -f2)建议用
$()替代反引号,语法更清晰且支持嵌套。检查Jenkins运行用户权限
即使文件存在,Jenkins进程的运行用户(通常是jenkins用户)可能没有该目录的访问权限。执行以下命令确认权限:sudo -u jenkins ls -l /data/lib/jenkins/workspace/ui_tag.properties如果报错,给
jenkins用户添加该目录的读权限:sudo chown -R jenkins:jenkins /data/lib/jenkins/workspace/ sudo chmod -R 755 /data/lib/jenkins/workspace/确认流水线是否使用代理节点
如果流水线配置了远程代理节点,命令会在代理服务器上执行,而非Jenkins主服务器。此时需要确认代理节点上是否存在/data/lib/jenkins/workspace/ui_tag.properties文件,或者将文件同步到代理节点的对应路径。避免工作空间清理导致文件丢失
检查流水线是否启用了Clean before checkout之类的选项,这类操作会清空工作空间,导致文件被删除。可以在流水线的SCM配置中禁用该选项,或者确保ui_tag.properties文件在流水线执行前被正确同步到工作空间。
内容的提问来源于stack exchange,提问作者Harshad Solanki

