You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Groovy Pipeline调用dir()方法时出现/srv/www/staging@tmp目录AccessDeniedException异常求助

解决Jenkins Groovy流水线dir()方法的AccessDeniedException问题

我之前碰到过几乎一模一样的权限问题,折腾了好一阵子才找到根源,结合你的情况,大概率是这几个点出了问题:

1. Jenkins dir()方法的临时目录权限陷阱

Jenkins在使用dir()代码块时,会自动在目标目录下创建一个@tmp子目录,用来存放流水线的临时文件和执行上下文。虽然你已经把jenkins用户加入apache组,且/srv/www/staging的权限是0773,但Jenkins创建这个@tmp目录时,可能没有继承父目录的组权限(比如Jenkins进程的umask设置导致新建目录的组没有写权限),从而触发权限拒绝。

解决办法:
在调用dir()之前,手动创建并配置好这个临时目录的权限:

sh "mkdir -p /srv/www/staging@tmp && chown apache:apache /srv/www/staging@tmp && chmod 0773 /srv/www/staging@tmp"

2. Jenkins进程的umask与环境变量差异

你手动su -s /bin/bash jenkins时的环境,和Jenkins服务进程运行的环境可能不一样——尤其是umask设置。比如手动登录时umask是0002(保证新建文件/目录的组有读写权限),但Jenkins进程的umask可能是默认的0022,导致新建的@tmp目录组权限被限制为只读,从而无法写入。

解决办法:

  • 在流水线的sh步骤里显式设置umask:
    sh "umask 0002"
    
  • 或者修改Jenkins的启动脚本(比如/etc/sysconfig/jenkins),添加UMASK=0002,然后重启Jenkins服务让设置生效。

3. SELinux的隐形限制

CentOS 7默认开启SELinux,即使文件系统权限完全没问题,SELinux也可能阻止Jenkins进程在/srv/www这类web目录下创建文件。手动su时的SELinux上下文和Jenkins进程的上下文不同,所以你手动操作没问题,但流水线执行就被拦截了。

解决办法:

  1. 先临时关闭SELinux测试是否是这个问题:
    setenforce 0
    
    如果问题消失,就说明是SELinux的限制。
  2. 永久解决的话,给目标目录设置正确的SELinux上下文:
    chcon -R -t httpd_sys_content_rw_t /srv/www/staging
    
    这个上下文允许web相关进程(包括Jenkins,只要权限配置正确)读写该目录。

修改后的流水线示例

pipeline {
    agent any
    stages {
        stage('Git Pull') {
            steps {
                sh "whoami && id && groups" // 确认用户身份和组信息
                sh "umask 0002"
                sh "mkdir -p /srv/www/staging@tmp && chown apache:apache /srv/www/staging@tmp && chmod 0773 /srv/www/staging@tmp"
                dir('/srv/www/staging') {
                    sh "pwd && ls -ld @tmp" // 查看临时目录的权限
                    // 这里写你的Git拉取逻辑
                }
            }
        }
    }
}

额外排查建议

  • 检查Jenkins进程的组信息:执行ps aux | grep jenkins,看看输出里的组ID是否包含apache的GID,如果不包含,重启Jenkins服务让组变更生效(因为用户加入组后,已运行的进程不会自动获取新组权限)。
  • 查看SELinux审计日志:tail -f /var/log/audit/audit.log | grep denied,如果有Jenkins相关的deny记录,就可以确认是SELinux的问题。

内容的提问来源于stack exchange,提问作者Reem Kay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 23:52:50