Jenkins设置目录777权限后复制构件仍报AccessDeniedException错误
问题根因
给/home/ubuntu/training-configuration目录递归设置777权限依然报错的核心原因是:Linux系统对路径的访问权限是逐层校验的。
从任务日志Running as SYSTEM可以确认,Jenkins任务默认使用jenkins系统用户执行。而Ubuntu系统中/home/ubuntu作为用户家目录,默认权限为rwxr-x---(数值权限750),仅目录属主ubuntu、属组ubuntu的成员有进入目录的权限,jenkins用户不在授权范围内,根本无法穿透上层目录访问到下层的training-configuration,因此触发AccessDeniedException。
可落地解决方案
任选以下一种方案操作即可,优先选第一种,符合最小权限原则:
- 方案1(推荐):给jenkins用户授予上层目录的访问权限
执行以下命令将jenkins用户加入ubuntu用户组,给/home/ubuntu目录开放组级执行权限,重启Jenkins生效:sudo usermod -aG ubuntu jenkins sudo chmod g+x /home/ubuntu sudo systemctl restart jenkins - 方案2:临时快速修复
直接给/home/ubuntu目录开放其他用户的执行权限,允许所有系统用户进入该目录:sudo chmod o+x /home/ubuntu - 方案3(生产环境推荐):更换构件存储路径
不要将Jenkins构建产物存放在普通用户家目录下,单独创建专属的构件存储目录,授权给jenkins用户:
之后修改Jenkins自由风格任务中的目标路径为上面新建的目录即可。sudo mkdir -p /opt/jenkins-artifacts sudo chown -R jenkins:jenkins /opt/jenkins-artifacts
注意:随意给目录设置777权限会带来任意用户读写篡改文件的安全风险,生产环境禁止使用这种权限配置。
报错参考

Started by user Training Running as SYSTEM Building in workspace /var/lib/jenkins/workspace/save-artifact FATAL: /home/ubuntu/training-configuration java.nio.file.AccessDeniedException: /home/ubuntu/training-configuration at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:389) at java.base/java.nio.file.Files.createDirectory(Files.java:690) at java.base/java.nio.file.Files.createAndCheckIsDirectory(Files.java:797) at java.base/java.nio.file.Files.createDirectories(Files.java:783) at hudson.FilePath.mkdirs(FilePath.java:3609) at hudson.FilePath.access$1100(FilePath.java:212) at hudson.FilePath$Mkdirs.invoke(FilePath.java:1384) at hudson.FilePath$Mkdirs.invoke(FilePath.java:1379) at hudson.FilePath.act(FilePath.java:1200) at hudson.FilePath.act(FilePath.java:1183) at hudson.FilePath.mkdirs(FilePath.java:1374) at hudson.plugins.copyartifact.CopyArtifact.copy(CopyArtifact.java:670) at hudson.plugins.copyartifact.CopyArtifact.perform(CopyArtifact.java:634) at hudson.plugins.copyartifact.CopyArtifact.perform(CopyArtifact.java:518) at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123) at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:79) at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:814) at hudson.model.Build$BuildExecution.build(Build.java:199) at hudson.model.Build$BuildExecution.doRun(Build.java:164) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:522) at hudson.model.Run.execute(Run.java:1896) at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:44) at hudson.model.ResourceController.execute(ResourceController.java:101) at hudson.model.Executor.run(Executor.java:442) Finished: FAILURE
内容的提问来源于stack exchange,提问作者battoyyeb
相关产品推荐
相关产品推荐

