Список файлов в рабочей области на трубопроводе Дженкинс

Я пытаюсь перечислить файлы в рабочей области в Jenkins Pipeline, так что я могу использовать их для создания соответствующих параллельных задач.

Пока я мог просто использовать sh ls > files и читать это, мне нужны объекты File, которые я могу фильтровать дальше с более сложной логикой. Фактически, Files.listFiles(FileFilter) было бы идеальным.

Однако я не могу получить список файлов вообще. Во-первых, мне пришлось прибегнуть к некоторым странным вещам, чтобы просто узнать текущий каталог работы для сборки:

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

Теперь я вызываю это, чтобы получить список файлов:

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

И получить NPE на asList, что означает, что, прочитав javadoc, что new File(baseDir) не существует (или не является каталогом).

Я отмечаю его @NonCPS, потому что он необходим для закрытия groovy на конвейере, который я бы предпочел использовать над полным синтаксисом java < 1.8.

Ответ 1

Для pwd вы можете использовать pwd.

Что касается списка файлов в основном каталоге рабочей области, вы можете использовать findFiles:

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

Ответ 2

Вот пример того, как я нахожу json файлы в моем проекте для обработки.

sh "ls *.json > listJsonFiles"
def files = readFile( "listJsonFiles" ).split( "\\r?\\n" );
sh "rm -f listJsonFiles"
  • Используйте ls для поиска файлов и записи их в другой временный файл
  • Прочитайте временный файл и разделите его на новые строки, чтобы получить массив
  • Удалить временный файл

Ответ 3

Решение, которое работает во всех случаях без использования функции 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}<<<"     
}

Ответ 4

вы можете попробовать, используя команду pwd(), если вы используете script для мастера.

 sh "ls -la ${pwd()}"

Ответ 5

Это сработало для меня!!

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);
    }
}

Ответ 6

Это самое простое и несложное решение, которое сработало для меня.

def fileList = "ls /path/to/dir".execute()
def files= []
fileList .text.eachLine {files.add(it)}
return files

Ответ 7

Изучали ли вы все свои файловые логические операции как оболочку script, а затем запускали оболочку script с sh './runScript.sh'?

Сценарии оболочки очень эффективны для манипуляций с файлами. script также может быть распределен для каждого подчиненного устройства для распараллеливания.