Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins 为什么mkdir试图(并且理所当然地失败)创建现有的根目录?_Jenkins_Jenkins Pipeline_Jenkins Groovy - Fatal编程技术网

Jenkins 为什么mkdir试图(并且理所当然地失败)创建现有的根目录?

Jenkins 为什么mkdir试图(并且理所当然地失败)创建现有的根目录?,jenkins,jenkins-pipeline,jenkins-groovy,Jenkins,Jenkins Pipeline,Jenkins Groovy,我的jenkins管道脚本中有一个步骤,应该创建一个目录。相关部分如下所示: 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

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

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()是因为它也无法创建目录

有人能告诉我我做错了什么吗? 谢谢

当我在jenkins节点上手动执行该命令时,它会按预期工作

mkdir -v -p /home/jenkins/hello/newfolder
mkdir: cannot create directory ‘/home/jenkins’: Permission denied
执行以“jenkins”用户身份登录的命令

我不认为它试图创建根文件夹,我认为它只是说它无权在根文件夹中创建任何内容。理想情况下,jenkins用户应该有权访问其根文件夹/home/jenkins,这里的权限似乎不正确

做了一个快速测试,在jenkins根目录下创建了一个文件夹,并以不同的用户身份登录,我得到了如下错误。jenkins根文件夹已经存在,并且它被拒绝按照预期在该文件夹中创建任何内容

mkdir -v -p /home/jenkins/hello/newfolder
mkdir: cannot create directory ‘/home/jenkins’: Permission denied
以jenkins用户身份登录并运行命令

mkdir -v -p /home/jenkins/hello/newfolder
mkdir: created directory ‘/home/jenkins/hello’
mkdir: created directory ‘/home/jenkins/hello/newfolder’

管道groovy脚本将始终在Jenkins主机上执行

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

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

如果您使用的是
String.execute()
方法,它将在Jenkins主机上创建一个进程

作业不应与文件系统交互,也不应在主机上创建进程,因为这可能会使整个系统不稳定


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

第一个答案是正确的-您需要使用Joerg指定的方法,因为它们处理构建工作区中的文件


此外,如果您使用shell脚本或批处理脚本,这总是与工作区相关的,并且比编码您自己的流程执行更轻松、更安全。

请验证此路径中内容的权限和所有者:/home/。。。。。。使用
ls-la
命令?这正是问题所在。