web-dev-qa-db-fra.com

Liste des fichiers sur l'espace de travail d'un pipeline Jenkins

J'essaie de répertorier les fichiers dans l'espace de travail d'un pipeline Jenkins, afin de pouvoir les utiliser pour produire des tâches parallèles appropriées.

Bien que je puisse simplement utiliser sh ls > files et lire cela, je veux des objets File que je peux filtrer davantage avec une logique plus complexe. En fait, Files.listFiles(FileFilter) serait idéal.

Cependant, je ne peux pas du tout avoir la liste des fichiers. Tout d'abord, j'ai dû recourir à des méthodes étranges pour trouver simplement le répertoire de travail actuel de la construction:

sh 'pwd > workspace'
workspace = readFile('workspace').trim()

J'appelle maintenant ceci pour récupérer la liste des fichiers:

@NonCPS
def getFiles(String baseDir) {
    Arrays.asList(new File(baseDir).listFiles())
}

Et obtenez un NPE sur asList, ce qui signifie, par ma lecture du javadoc, que new File(baseDir) n'existe pas (ou n'est pas un répertoire).

Je baleise @NonCPS car il est nécessaire pour les fermetures groovy sur Pipeline, que je préférerais vraiment utiliser par rapport à la syntaxe Java <1.8.

11
Daniel C. Sobral

Pour pwd, vous pouvez utiliser pwd step.

Pour la liste des fichiers du répertoire principal de l’espace de travail, vous pouvez utiliser findFiles :

files = findFiles(glob: '*.*')
16
Krzysztof Krasoń

Voici un exemple de recherche de fichiers json dans mon projet pour traitement.

sh "ls *.json > listJsonFiles"
def files = readFile( "listJsonFiles" ).split( "\\r?\\n" );
sh "rm -f listJsonFiles"
  • Utilisez ls pour trouver les fichiers et les écrire dans un autre fichier temporaire
  • Lire le fichier temporaire et diviser sur de nouvelles lignes pour donner un tableau
  • Supprimer le fichier temporaire
5
vanappears

Une solution qui fonctionne dans tous les cas sans utiliser la fonction JENKINS

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

vous pouvez essayer de suivre ce qui utilise pwd () si vous exécutez le script sur maître.

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

Cela a fonctionné pour moi !! 

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