Ich versuche, Dateien im Arbeitsbereich in einer Jenkins-Pipeline aufzulisten, damit ich entsprechende parallele Aufgaben erstellen kann.
Während ich einfach sh ls > files
verwenden und lesen konnte, möchte ich File
-Objekte, die ich mit komplexerer Logik weiter filtern kann. Tatsächlich wäre Files.listFiles(FileFilter)
ideal.
Ich kann die Liste der Dateien jedoch nicht abrufen. Zuerst musste ich auf ein paar seltsame Dinge zurückgreifen, um einfach das aktuelle Arbeitsverzeichnis für den Build herauszufinden:
sh 'pwd > workspace'
workspace = readFile('workspace').trim()
Jetzt rufe ich das an, um die Liste der Dateien abzurufen:
@NonCPS
def getFiles(String baseDir) {
Arrays.asList(new File(baseDir).listFiles())
}
Und erhalten Sie eine NPE für asList
, was nach meinem Lesen des Javadoc bedeutet, dass new File(baseDir)
nicht existiert (oder kein Verzeichnis ist).
Ich markiere es @NonCPS
, weil es für groovige Schließungen in Pipeline erforderlich ist, die ich wirklich vorzuziehen möchte, wenn Sie die vollständige Java-Syntax <1.8 verwenden.
Hier ist ein Beispiel, wie ich Json-Dateien in meinem Projekt zur Verarbeitung finde.
sh "ls *.json > listJsonFiles"
def files = readFile( "listJsonFiles" ).split( "\\r?\\n" );
sh "rm -f listJsonFiles"
Eine Lösung, die in allen Fällen ohne JENKINS-Funktion funktioniert
def FILES_LIST = sh (script: "ls '${workers_dir}'", returnStdout: true).trim()
//DEBUG
echo "FILES_LIST : ${FILES_LIST}"
//PARSING
for(String ele : FILES_LIST.split("\\r?\\n")){
println ">>>${ele}<<<"
}
sie können versuchen zu folgen, welche pwd () verwendet, wenn Sie das Skript auf Master ausführen.
sh "ls -la ${pwd()}"
Dies ist die einfachste und unkomplizierteste Lösung, die für mich funktioniert hat.
def fileList = "ls /path/to/dir".execute()
def files= []
fileList .text.eachLine {files.add(it)}
return files
Das hat für mich funktioniert !!
node("aSlave") {
def files = getAllFiles(createFilePath("${workspace}/path_to_directory_in_workspace"))
}
@NonCPS
def getAllFiles(rootPath) {
def list = []
for (subPath in rootPath.list()) {
list << subPath.getName()
// in case you don't want extension
// list << FilenameUtils.removeExtension(subPath.getName())
}
return list
}
// Helps if slave servers are in picture
def createFilePath(def path) {
if (env['NODE_NAME'].equals("master")) {
File localPath = new File(path)
return new hudson.FilePath(localPath);
} else {
return new hudson.FilePath(Jenkins.getInstance().getComputer(env['NODE_NAME']).getChannel(), path);
}
}