it-swarm.com.de

Listen Sie Dateien im Arbeitsbereich einer Jenkins-Pipeline auf

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.

11

Für pwd können Sie pwd step verwenden.

Als Liste der Dateien im Hauptarbeitsbereich können Sie findFiles verwenden:

files = findFiles(glob: '*.*')
16

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"
  • Verwenden Sie ls, um die Dateien zu suchen und in eine andere temporäre Datei zu schreiben
  • Lesen Sie die temporäre Datei und teilen Sie sie in neue Zeilen auf, um ein Array zu erhalten
  • Löschen Sie die temporäre Datei
5
vanappears

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}<<<"     
}
1

sie können versuchen zu folgen, welche pwd () verwendet, wenn Sie das Skript auf Master ausführen.

 sh "ls -la ${pwd()}"
0
f-society

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
0
Venkat Madhav

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);
    }
}
0
Litty Philip