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.
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"
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}<<<"
}
vous pouvez essayer de suivre ce qui utilise pwd () si vous exécutez le script sur maître.
sh "ls -la ${pwd()}"
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);
}
}