Jenkins流水线执行Shell脚本遇Permission Denied问题求助
排查思路与解决方案
核心问题分析
报错//: Permission denied说明Shell尝试执行**根目录(//等价于/)**作为命令,而目录无法被执行,因此触发权限拒绝。结合你的执行日志和脚本内容,重点排查以下方向:
具体排查步骤
1. 检查脚本的实际完整内容
你提供的脚本代码可能遗漏了隐藏行或特殊字符,比如不小心插入了单独的//行(非注释)。在流水线的sh步骤中添加cat -A命令,查看脚本的完整内容(包括隐藏字符):
cat -A scripts/test-report.sh
cat -A会显示所有不可见字符(如Windows换行符^M),如果发现单独的//行,直接删除即可。
2. 修复BAZEL_OPTS的传递与使用
你在流水线中定义了BAZEL_OPTS,但脚本里的bazel build命令并未使用该变量,导致CI配置未生效。同时,确认BAZEL_OPTS的赋值是否正确:
- 在流水线中添加
echo $BAZEL_OPTS,验证变量值是否为--config=ci --config=remote_cache_ci - 修改脚本中的
bazel build命令,加入BAZEL_OPTS:bazel build $BAZEL_OPTS $target
3. 验证脚本的Shebang与容器环境
- 检查容器中是否存在
bash:在流水线中添加which bash,如果返回空,说明容器只有sh,需将脚本的Shebang从#!/bin/bash改为#!/bin/sh - 若脚本是Windows环境编辑的,可能存在CRLF换行符,导致Shell解析错误。使用
dos2unix scripts/test-report.sh转换为LF换行符(或在流水线中添加该命令)
4. 确认Jenkins用户的权限范围
- 查看当前用户信息:
id,确认是否为jenkins用户 - 检查项目根目录权限:
ls -ld /home/jenkins/agent/workspace/team/code-coverage-WIP,确保用户有读写执行权限 - 检查Bazel缓存目录权限:如果使用远程缓存,确认
remote_cache_ci配置的路径(在.bazelrc中)是否允许当前用户访问
快速验证方案
先在流水线中替换为以下最小化测试脚本,定位问题:
sh ''' pwd id cat -A scripts/test-report.sh echo "BAZEL_OPTS: $BAZEL_OPTS" which bash bash scripts/test-report.sh # 直接用bash执行脚本,避免Shebang问题 '''.stripIndent()
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

