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

时间:2019-04-11 06:54:04

标签: jenkins groovy jenkins-pipeline

我想在Jenkins作业中创建一个常规功能,该功能可以查看文件夹并删除所有X天之前的文件。

所以我开始在互联网上寻找各种解决方案。

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

def deleteFilesOlderThanDays(int daysBack, String path) {
  def DAY_IN_MILLIS = 24 * 60 * 60 * 1000
  File directory = new File(path)

  if(directory.exists()){
    File[] listFiles = directory.listFiles()

    for(File listFile : listFiles) {
      def days_from_now = ( (System.currentTimeMillis() - listFile.lastModified()) /(DAY_IN_MILLIS))
      if(days_from_now > daysBack) {
        println('------------')
        println('file is older')
        println(listFile)
        }
        else{
          println('------------')
          println('File is not older')
          println(listFile)
        }
      }//End: for(File listFile : listFiles) {
    }//End: if(directory.exists()){
}

(我知道,代码不会删除某些内容。仅出于我的理解)

第二步是将此新创建的函数包含到我的Jenkins groovy文件中。但是从那以后我很绝望。

我有一个问题,如果该文件夹确实存在,那么我从代码开始就不会得到肯定的结果。

该行:

if(directory.exists()){

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

我尝试了多种版本,但没有找到适合我的解决方案。 我还使用了“管道语法”示例[Sample Step fileExists],但对我没有帮助。

我包括了:

import java.io.File

在文件的开头。

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

我用于测试的函数中的代码是:

def deleteFilesOlderThanDays() {

  dir = '.\\ABC'
  echo "1. ----------------------------------------"
  File directory1 = new File('.\\ABC\\')
  exist = directory1.exists()
  echo 'Directory1 name is = '+directory1
  echo 'exist value is = '+exist
  echo "2. ----------------------------------------"
  File directory2 = new File('.\\ABC')
  exist = directory2.exists()
  echo 'Directory2 name is = '+directory2
  echo 'exist value is = '+exist
  echo "3. ----------------------------------------"  
  File directory3 = new File(dir)
  exist = directory3.exists()
  echo 'Directory3 name is = '+directory3
  echo 'exist value is = '+exist
  echo "4. Pipeline Syntax ------------------------"  
  exist = fileExists '.\\ABC'
  echo 'exist value is = '+exist
  echo "5. ----------------------------------------"
  File directory5 = new File(dir)
  echo 'Directory5 name is = '+directory5
  // execute an error
  // exist = fileExists(directory5)
  exist = fileExists "directory5"
  echo 'exist value is = '+exist
  echo "6. ----------------------------------------"
  exist = fileExists(dir)
  echo 'exist value is = '+exist

  File[] listFiles = directory5.listFiles()
  echo 'List file = '+listFiles
}

Jenkins控制台输出中的输出是:(我整理了一下……。)

1. ----------------------------------------
Directory1 name is = .\ABC\
exist value is = false
2. ----------------------------------------
Directory2 name is = .\ABC
exist value is = false
3. ----------------------------------------
Directory3 name is = .\ABC
exist value is = false
4. Pipeline Syntax ------------------------
exist value is = true
5. ----------------------------------------
Directory5 name is = .\ABC
exist value is = false
6. ----------------------------------------
exist value is = true

List file = null

在第4步和第6步中,我只能得到一个真实值。因此,我可以确定该文件夹确实存在。

所以对我来说,该命令似乎是

File directory = new File(dir)

在我的情况下无法正常工作。

我无法创建“ listFile”变量,因为该目录无法正确初始化。

对我来说,也不清楚应该使用哪种命令。常规示例始终使用以下功能:

 .exists()

但是在詹金斯(Jenkins)示例中,我总是找到这样的代码:

  fileExists()

为什么groovy和Jenkins groovy风格之间有些区别?应该是同一块矿石吗?

有人对我有想法吗,或者可以告诉我我做错了什么?

3 个答案:

答案 0 :(得分: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. ----------------------------------------"
  .....

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

fileExists './ABC'

def dir = './ABC'
fileExists dir

应使用/作为路径分隔符,而不是根据下面的文档\enter image description here

答案 1 :(得分:0)

您可能会从类似的问题中得到答案:

java.io.File方法将引用运行Jenkins的主服务器上的文件,而不是从属计算机上当前的工作空间中的文件。

要引用从属计算机上的文件,应使用readFile方法 “

def dir = readFile("${WORKSPACE}/ABC");

Link to original answer

答案 2 :(得分:0)

感谢所有反馈。

好的,对我来说,詹金斯·格罗维(Jenkins Groovy)=格罗维(Groovy)很清楚。 我已经读了很多,如果您在Jenkins Master或Jenkins Slave上执行文件搜索,会有不同的命令。

Youg提出的关于确认后开始的建议对我有帮助。 我在删除文件时遇到了问题,因此最后我使用了原始批处理命令来使函数运行。

finally函数类似于现在:

def deleteFilesOlderThanXDays(daysBack, path) {

  def DAY_IN_MILLIS = 24 * 60 * 60 * 1000

  if(fileExists(path)){
    // change into path
    dir(path) {

      // find all kind of files
    files = findFiles(glob: '*.*')

    for (int i = 0; i < files.length; i++) {

      def days_from_now = ( (System.currentTimeMillis() - files[i].lastModified) /(DAY_IN_MILLIS))

      if(days_from_now > daysBack) {
        echo('file : >>'+files[i].name+'<< is older than '+daysBack+' days')
        bat('del /F /Q "'+files[i].name+'"')
        }
        else{
          echo('file : >>'+files[i].name+'<< is not only than '+daysBack+' days')
        }
      }// End: for (int i = 0; i < files.length; i++) {
    }// End: dir(path) {
  }// End: if(fileExists(path)){
}

感谢您的帮助和最诚挚的问候,

相关问题