jenkins - 为什么 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() 的原因是因为它也默默地无法创建目录。
有人可以告诉我我在这里做错了什么吗?谢谢
解决方案
管道 groovy 脚本将始终在 Jenkins 主服务器上执行。
也就是说:要与构建代理的文件系统进行交互,您需要使用提供的步骤,如dir
, readFile
, writeFile
, ...
要在该构建代理上执行某些操作,您必须使用bat
或sh
步骤,具体取决于它正在运行的操作系统。
如果您使用该String.execute()
方法,它将在 Jenkins 主服务器上创建一个进程。
作业不应与文件系统交互或在 master 上创建进程,因为它可能使整个系统不稳定。
为确保这一点,您应该始终尝试使用沙箱,因为它不允许这样的事情。
推荐阅读
- python-3.x - 处理 ensure_future 及其缺失的任务
- python - 分配给超出范围的变量列表索引时?
- html - Bootstrap 4,固定右列重叠固定侧边栏重叠主体
- azure-service-fabric - Service Fabric 可靠集合 - 是否以确定的顺序为 CreateEnumerableAsync 应用密钥筛选器?
- r - `download.file()` 在使用 `lapply` 或 `map` 时给出警告信息并且不下载
- bash - 在单个 if 语句中检查多个文件是否为空
- java - 如何使用 Springfox 从 Swagger 文档中隐藏端点
- javascript - 只有显示名称时,如何检索频道的用户名?
- bash - 使用 bash 将一个文件中的行剪切为另一个文件中明确规定的长度
- excel - 循环并查找 2 个文本字符串然后在 EXCEL 工作表中求和偏移值的宏