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

why is mkdir trying (and rightfully failing) to create the existing root directories?

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

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

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

正在执行以“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 主机上执行。

即:要与构建代理的文件系统交互,您需要使用提供的步骤,如 dirreadFilewriteFile、...

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

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

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

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

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

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