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