为Jenkins管道中的特定步骤创建临时目录

jpy*_*ams 9 jenkins jenkins-pipeline

是否有一个Jenkins管道步骤将在目录中创建并运行一系列步骤?

我知道dir该步骤在特定目录中运行块中的步骤:

// not in /tmp/jobDir
dir ('/tmp/jobDir') {
    // these steps get run in /tmp/jobDir
}
// once again not in /tmp/jobDir
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果在Pipeline或插件中有一个步骤让我运行此代码块,但是/tmp/jobDir在块的开头创建,并在块结束时删除.

就像是:

// /tmp/jobDir does not exist
dir ('/tmp/jobDir') {
    // /tmp/jobDir now exists
    // these steps get run in /tmp/jobDir
}
// /tmp/jobDir has been removed
Run Code Online (Sandbox Code Playgroud)

这样的步骤或插件是否存在?

sch*_*rer 8

到目前为止我最喜欢的解决方案:

withTempDir {
 // Do something in the dir,e.g. print the path
 echo pwd()
}

void withTempDir(Closure body) {
  // dir( pwd(tmp: true) ) { // Error: process apparently never started i
  dir( "${System.currentTimeMillis()}" ) {
    try {
      body()
    } finally {
      deleteDir()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*zek 7

不完全是。有deleteDir步骤,它会删除当前目录,因此您可以执行以下操作:

dir('/tmp/jobDir') {
    // your steps here
    deleteDir()
}
Run Code Online (Sandbox Code Playgroud)

如果经常出现这种情况,您也可以自己创建函数:

def tempDir(path, closure) {
    dir(path) {
        closure()
        deleteDir()
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

tempDir('/tmp/jobDir') {
    // your steps here
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果只想删除目录(如果它是新创建的),则可以使用fileExists:

def tempDir(path, closure) {
    def dirExisted = fileExists(path)
    dir(path) {
        closure()
        if(!dirExisted) {
            deleteDir()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不能说当我看到这个页面时我的脸有多么难受 https://newbedev.com/create-a-temporary-directory-for-specific-steps-in-jenkins-pipeline 有些人没有羞耻感。 (3认同)
  • 值得一提的是,还有一个 `pwd(tmp:true)` 调用可以生成一个唯一的临时目录。因此,为了避免临时目录在同一节点上发生冲突,您可以这样做: `dir(pwd(tmp:true)) { /* ... things ... */; 删除目录(); }`。 (2认同)

Pet*_*ahn 7

创建一个临时路径然后通过 dir 子句使用它怎么样?这似乎对我有用。

dir (pwd(tmp: true)) {...}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否会创建临时目录或使用工作区的唯一临时目录。文档说“a” ,但眼见为实。