【问题标题】:Jenkins pipeline create directoryJenkins 管道创建目录
【发布时间】:2026-01-18 23:40:01
【问题描述】:

我想知道是否有一个函数或管道插件允许在工作区下创建目录而不是使用sh "mkdir directory"

我尝试使用 groovy 指令new File("directory").mkdirs(),但它总是返回异常。

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:脚本不允许使用新的 java.lang.RuntimeException java.lang.String

【问题讨论】:

  • 抛出异常是因为您需要将该脚本/模块显式列入白名单:jenkins.io/doc/book/managing/script-approval
  • 另外,如果在节点上运行,该目录将在主节点上创建。 Groovy CPS 意味着 groovy 代码在 master 上执行并传输到节点。因此,File 可以很好地构建路径,否则会造成危险/误导。

标签: jenkins jenkins-pipeline


【解决方案1】:

您可以做的是使用dir 步骤,如果目录不存在,那么dir 步骤将在您写入文件或类似文件后创建所需的文件夹:

node {
    sh 'ls -l'
    dir ('foo') {
        writeFile file:'dummy', text:''
    }
    sh 'ls -l'
}

sh 步骤只是显示文件夹已创建。缺点是您将在文件夹中有一个虚拟文件(如果您要写入其他文件,则不需要虚拟写入)。如果我运行它,我会得到以下输出:

Started by user jon
[Pipeline] node
Running on master in /var/lib/jenkins/workspace/pl
[Pipeline] {
[Pipeline] sh
[pl] Running shell script
+ ls -l
total 0
[Pipeline] dir
Running in /var/lib/jenkins/workspace/pl/foo
[Pipeline] {
[Pipeline] writeFile
[Pipeline] }
[Pipeline] // dir
[Pipeline] sh
[pl] Running shell script
+ ls -l
total 4
drwxr-xr-x 2 jenkins jenkins 4096 Mar  7 22:06 foo
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

【讨论】:

  • 我不确定 dir 的闭包是否可以是一个空语句,但您不必创建文件 - 我只是报告了当前目录用于记录目的。
  • 做了一些测试,不可以。似乎目录是在您使用需要文件上下文的步骤时创建的,例如sh, writeFile, etc... 所以如果你只使用 echo 和其他非节点需要的步骤,那么目录将不会被创建。
  • 啊,我用sh 'echo $(pwd -P)' 来记录目录的位置:)
  • 另一个陷阱:dir 块内的步骤将在当前目录设置为指定目录的情况下执行。因此,如果必须在当前目录设置为工作区的情况下运行该逻辑,则不能只将逻辑放在块中。
【解决方案2】:

只需使用file operations plugin

fileOperations([folderCreateOperation('directoryname')])

【讨论】:

  • 只是为了创建目录,使用管道的 dir { } 更容易。不过提到这个插件也很有趣,因为它可以在节点上执行许多其他文件操作。