为什么mkdir尝试(并且理应失败)创建现有的根目录?

时间:2018-10-12 16:53:02

标签: jenkins jenkins-pipeline jenkins-groovy

我在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()的原因是因为它也默默地无法创建目录。

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

3 个答案:

答案 0 :(得分:1)

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

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

要在该构建代理上执行某些操作,您必须根据其所运行的操作系统使用batsh步骤。

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

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

为确保这一点,您应始终尝试使用沙盒,因为它不允许此类事情。

答案 1 :(得分:0)

当我手动在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’

答案 2 :(得分:0)

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

此外,如果您使用的Shell或批处理脚本始终与工作空间相关,并且比编写自己的流程执行更麻烦,更安全。