Jenkins groovy 文件中的 File.exists() 不起作用

Vie*_*wer 5 groovy jenkins jenkins-pipeline

我想在 Jenkins 作业中创建一个常规函数,该函数可以查看文件夹并删除所有早于 X 天的文件。

\n

所以我开始在互联网上查找并找到了不同类型的解决方案。

\n

首先,我.groovy在本地 PC 上使用 Visual Studio Code 创建一个文件以了解其工作原理。这就是为什么我的代码看起来与互联网上的代码不相似的原因,因为我更改了它以便我了解代码是如何工作的。

\n
def deleteFilesOlderThanDays(int daysBack, String path) {\n  def DAY_IN_MILLIS = 24 * 60 * 60 * 1000\n  File directory = new File(path)\n\n  if(directory.exists()){\n    File[] listFiles = directory.listFiles()\n    \n    for(File listFile : listFiles) {\n      def days_from_now = ( (System.currentTimeMillis() - listFile.lastModified()) /(DAY_IN_MILLIS))\n      if(days_from_now > daysBack) {\n        println('------------')\n        println('file is older')\n        println(listFile)\n        }\n        else{\n          println('------------')\n          println('File is not older')\n          println(listFile)\n        }\n      }//End: for(File listFile : listFiles) {\n    }//End: if(directory.exists()){\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(我知道,代码不会删除任何东西。这只是为了我的理解)

\n

第二步是将这个新创建的函数包含到我的 Jenkins Groovy 文件中。但从那时起我就绝望了。

\n

我的问题是,如果文件夹确实存在,我一开始就不会从代码中得到积极的结果。

\n

该行:

\n
if(directory.exists()){\n
Run Code Online (Sandbox Code Playgroud)\n

给我带来了很多问题,但我不清楚为什么。

\n

我已经尝试了很多种版本,但我还没有\xe2\x80\x99t找到适合我的解决方案。\n我还使用了\xe2\x80\x9cPipeline Syntax\xe2\x80\x9d示例[示例步骤文件存在]但它\xe2\x80\x99 对我没有帮助。

\n

我已经包括:

\n
import java.io.File\n
Run Code Online (Sandbox Code Playgroud)\n

在我的文件的开头。

\n

我有一个基本文件,包含在 Jenkins 工作中。该文件包括我的库文件。该库文件之一是file.groovy. 在基本的 Jenkins 文件中,我执行该函数file.deleteFilesOlderThanDays()(为了测试,我不使用任何参数)。

\n

我的测试函数的代码是:

\n
def deleteFilesOlderThanDays() {\n\n  dir = '.\\\\ABC'\n  echo "1. ----------------------------------------"\n  File directory1 = new File('.\\\\ABC\\\\')\n  exist = directory1.exists()\n  echo 'Directory1 name is = '+directory1\n  echo 'exist value is = '+exist\n  echo "2. ----------------------------------------"\n  File directory2 = new File('.\\\\ABC')\n  exist = directory2.exists()\n  echo 'Directory2 name is = '+directory2\n  echo 'exist value is = '+exist\n  echo "3. ----------------------------------------"  \n  File directory3 = new File(dir)\n  exist = directory3.exists()\n  echo 'Directory3 name is = '+directory3\n  echo 'exist value is = '+exist\n  echo "4. Pipeline Syntax ------------------------"  \n  exist = fileExists '.\\\\ABC'\n  echo 'exist value is = '+exist\n  echo "5. ----------------------------------------"\n  File directory5 = new File(dir)\n  echo 'Directory5 name is = '+directory5\n  // execute an error\n  // exist = fileExists(directory5)\n  exist = fileExists "directory5"\n  echo 'exist value is = '+exist\n  echo "6. ----------------------------------------"\n  exist = fileExists(dir)\n  echo 'exist value is = '+exist\n\n  File[] listFiles = directory5.listFiles()\n  echo 'List file = '+listFiles\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Jenkins 控制台输出中的输出是:(我稍微清理了一下\xe2\x80\xa6。)

\n
1. ----------------------------------------\nDirectory1 name is = .\\ABC\\\nexist value is = false\n2. ----------------------------------------\nDirectory2 name is = .\\ABC\nexist value is = false\n3. ----------------------------------------\nDirectory3 name is = .\\ABC\nexist value is = false\n4. Pipeline Syntax ------------------------\nexist value is = true\n5. ----------------------------------------\nDirectory5 name is = .\\ABC\nexist value is = false\n6. ----------------------------------------\nexist value is = true\n\nList file = null\n
Run Code Online (Sandbox Code Playgroud)\n

我只在步骤 4 和 6 中获得真实值。因此我可以确定该文件夹确实存在。

\n

所以对我来说这个命令似乎是:

\n
File directory = new File(dir)\n
Run Code Online (Sandbox Code Playgroud)\n

在我的情况下工作不正确。

\n

我可以\xe2\x80\x99t 创建一个listFile变量,因为该目录无法正确初始化。

\n

对我来说也不清楚我应该使用哪种命令。常规示例始终使用如下函数:

\n
 .exists()\n
Run Code Online (Sandbox Code Playgroud)\n

但在 Jenkins 示例中我总是找到这样的代码:

\n
  fileExists()\n
Run Code Online (Sandbox Code Playgroud)\n

为什么 groovy 和 Jenkins groovy 风格之间存在一些差异?应该是同一种矿石吧?

\n

有谁对我有想法或者可以告诉我我\xe2\x80\x99m 做错了什么?

\n

yon*_*ong 0

您可以添加以下脚本来列出当前工作目录中的文件和文件夹,以便您确认该文件夹ABC是否存在。

确认ABC文件夹存在后,然后深入研究其余代码。

def deleteFilesOlderThanDays() {

  // print current work directory
  pwd

  // if jenkins job run on window machine
  bat 'dir'

  // if jenkins job run on linux machine    
  sh 'ls -l'

  dir = '.\\ABC'
  echo "1. ----------------------------------------"
  .....
Run Code Online (Sandbox Code Playgroud)

对于fileExists使用,我认为正确的方法如下:

fileExists './ABC'

def dir = './ABC'
fileExists dir
Run Code Online (Sandbox Code Playgroud)

应该用作/路径分隔符,而不是\根据下面的文档: 在此输入图像描述