首页 > 解决方案 > 为什么 mkdir 尝试(并且理所当然地失败)创建现有的根目录?

问题描述

我的 jenkins-pipeline 脚本中有一个步骤应该创建一个目录。相关部分如下所示:

steps.println 'target file path: ' + folder.toString()
    steps.println 'who am i?: ' + "whoami".execute().text

    def sout = new StringBuilder()
    def serr = new StringBuilder()
    def cmd = ('mkdir -v -p ' + folder.toString())
    steps.println 'cmd = ' + cmd
    def proc = cmd.execute()
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(1000)

    if (proc.exitValue() == 0){
        steps.println 'Success: ' + sout
    }
    else {
        steps.println 'ERROR: ' + serr
        throw new Exception('Could not create directory "' + folder.toString() +'"')
    }

但是,当代码执行时,我得到以下输出:

Destination Path = 
/home/jenkins/jenkins_slave/workspace/atlassianPublishTest_master-6R2ESEJZC6HJUUVOOHAQIN7KEMQAPLOBYDS3KQUR5VE6R5RBIUXA/files/docs/Storfirst Release Notes.pdf
[Pipeline] echo
target file name: Storfirst Release Notes.pdf
[Pipeline] echo
target file path: 
/home/jenkins/jenkins_slave/workspace/atlassianPublishTest_master-6R2ESEJZC6HJUUVOOHAQIN7KEMQAPLOBYDS3KQUR5VE6R5RBIUXA/files/docs
[Pipeline] echo
who am i?: jenkins

[Pipeline] echo
cmd = mkdir -v -p 
/home/jenkins/jenkins_slave/workspace/atlassianPublishTest_master-6R2ESEJZC6HJUUVOOHAQIN7KEMQAPLOBYDS3KQUR5VE6R5RBIUXA/files/docs
[Pipeline] echo
ERROR: mkdir: cannot create directory ‘/home/jenkins’: Permission denied

我已经验证所有文件夹的权限都是正确的(home 归 root 所有,其余归 jenkins 所有,并且对除全局写入之外的所有内容都具有权限)。只有底部的两个文件夹不存在,其余的存在并且得到了适当的许可。

当我在 jenkins 节点上手动执行命令时,它按预期工作,但正如您所见,即使它作为文件夹的所有者运行,它看起来也正在尝试创建根文件夹(/home/ jenkins),它显然没有创建权限。

值得注意的是我使用 mkdir 命令而不是 groovy 的 File.mkdirs() 的原因是因为它也默默地无法创建目录。

有人可以告诉我我在这里做错了什么吗?谢谢

标签: jenkinsjenkins-pipelinejenkins-groovy

解决方案


管道 groovy 脚本将始终在 Jenkins 主服务器上执行。

也就是说:要与构建代理的文件系统进行交互,您需要使用提供的步骤,如dir, readFile, writeFile, ...

要在该构建代理上执行某些操作,您必须使用batsh步骤,具体取决于它正在运行的操作系统。

如果您使用该String.execute()方法,它将在 Jenkins 主服务器上创建一个进程。

作业不应与文件系统交互或在 master 上创建进程,因为它可能使整个系统不稳定。

为确保这一点,您应该始终尝试使用沙箱,因为它不允许这样的事情。


推荐阅读