Jenkins流水线创建目录。

35

我想知道是否有一种函数或管道插件可以在工作区下创建目录,而不是使用sh“mkdir directory”命令?

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

  

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


1
该异常被抛出是因为您需要显式地将该脚本/模块列入白名单:https://jenkins.io/doc/book/managing/script-approval/ - sg_man
此外,如果在节点上运行,则该目录将在主节点上创建。Groovy CPS 意味着 Groovy 代码在主节点上执行,并被传输到节点上。因此,File 对于构建路径是可以的,但在其他情况下可能会具有危险性或误导性。 - Petra Kahn
3个回答

86

如果目录不存在,您可以使用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的闭包是否可以为空语句,但你不必创建一个文件 - 我只是为了记录目录而报告了当前目录。 - simon.watts
15
进行了一些测试,不能创建目录。似乎只有在使用需要文件上下文的步骤(如sh、writeFile等)时才会创建该目录。因此,如果您只使用echo和其他不需要节点的步骤,则不会创建该目录。 - Jon S
1
啊,我使用 sh 'echo $(pwd -P)' 来记录目录位置 :) - simon.watts
3
另一个需要注意的点是:dir 块内部的步骤将以指定目录为当前目录执行。因此,如果要在工作区设置的当前目录中运行逻辑,则不能仅仅将逻辑放在该块内。 - vadipp

8

只需使用文件操作插件即可。

fileOperations([folderCreateOperation('directoryname')])

仅用于目录创建,使用管道的dir {}更容易。然而提到这个插件也很有趣,因为它可以在节点上执行许多其他文件操作。 - Alexander Samoylov

0
为了避免 @jon-s 的答案中的虚拟文件,可以简单地使用 pwd -P。这也会访问目录并因此隐式创建它。
dir('foo') {
   sh 'pwd -P'
}

注:

  • 看起来需要使用-P。可以假设,否则pwd只是传递环境变量。
  • 有人可能会认为sh 'mkdir -p foo'同样适用(如果完全使用sh)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接