我想在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风格之间有些区别?应该是同一块矿石吗?
有人对我有想法吗,或者可以告诉我我做错了什么?
答案 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
答案 1 :(得分:0)
您可能会从类似的问题中得到答案:
”
java.io.File
方法将引用运行Jenkins的主服务器上的文件,而不是从属计算机上当前的工作空间中的文件。
要引用从属计算机上的文件,应使用readFile方法 “
def dir = readFile("${WORKSPACE}/ABC");
答案 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)){
}
感谢您的帮助和最诚挚的问候,