Jenkins Groovy Pipeline поиск и сравнение

Мне нужно решение для следующего: найдите переменную значения BRANCHVERSION в ver_list, сравните их и используйте соответствующий.

BRANCHVERSION имеет такой формат "6.200.01"

​ver_list выглядит так

[Pipeline] echo
[6.000.02, 6.000.10, 6.000.12, 6.000.15, 6.000.20, 6.000.25, 6.000.30, 6.100.00, 6.100.01, 6.100.10, 6.100.20, 6.100.25, 6.100.30, 6.200.00, 6.300.00]

если BRANCHVERSION не равно ни одному из значений в ver_list, то​ нужно подобрать следующее ближайшее значение из списка, упорядоченного по убыванию (если BRANCHVERSION = 6.200.01, то нужно подобрать 6.200.00) если BRANCHVERSION равно любому значения в ver_list, то это значение подбирается.

Мой конвейер описан ниже:

if (ENVIRONMENT == "") {
   error("You should choose at least one environment")
}
node {   
   deleteDir()
    checkout([$class: 'SubversionSCM', locations: [[credentialsId: 'XXXXXXX',local: './env_prop_files', remote:'http://FQDN/repos/src/cm/env_prop_files']]])
    checkout([$class: 'SubversionSCM', locations: [[credentialsId: 'XXXXXXX',local: './SoapUITestSuites', remote:'http://FQDN/repos/src/tools/SoapUI/branches/']]])
    def  FILES_LIST = sh (script: "ls   './SoapUITestSuites'", returnStdout:true).trim()
    def GS_LIST = sh (script: "ls 'path_to_file'", returnStdout: true).trim()
echo "GS_Version : ${GS_LIST}"
echo "FILES_LIST : ${FILES_LIST}"
//PARSING TestSuite Version
   def ver_list = []
     for(String ele : FILES_LIST.split("\\r?\\n")){ 
     ver = ele.split("_")
     println ">>>${ver[1]}<<<"     
     ver_list.add(ver[1])
}
println(ver_list)
def VERSION = ver_list
//PARSING GS Version
   def gs_list = []
    for(String elegs : GS_LIST.split("\\r?\\n")){ 
    println ">>>${elegs}<<<"     
    gs_list.add(elegs)
}  
println(gs_list) 
properties = readProperties file:"./env_prop_files/${ENVIRONMENT}.properties"
BRANCHVERSION = properties.SVN_LOCATION_VERSION
}

ВЫВОД

No changes for http://FQDN/repos/src/tools/SoapUI/branches since the previous 
build
[Pipeline] sh
[ClientRunSoapUITest] Running shell script
+ ls ./SoapUITestSuites
[Pipeline] sh
[ClientRunSoapUITest] Running shell script
+ ls /pkg/flexprod/oracle/flexprodfiles/archive/goldstand
[Pipeline] echo
GS_Version : 5.900.00
6.000.00
6.000.01
6.000.02
6.000.20
6.000.30
6.100.00
6.100.01
6.200.00
[Pipeline] echo
FILES_LIST : rel_6.000.02
rel_6.000.10
rel_6.000.12
rel_6.000.15
rel_6.000.20
rel_6.000.25
rel_6.000.30
rel_6.100.00
rel_6.100.01
rel_6.100.10
rel_6.100.20
rel_6.100.25
rel_6.100.30
rel_6.200.00
rel_6.200.01
rel_6.300.00
[Pipeline] echo
>>>6.000.02<<<
[Pipeline] echo
>>>6.000.10<<<
[Pipeline] echo
>>>6.000.12<<<
[Pipeline] echo
>>>6.000.15<<<
[Pipeline] echo
>>>6.000.20<<<
[Pipeline] echo
>>>6.000.25<<<
[Pipeline] echo
>>>6.000.30<<<
[Pipeline] echo
>>>6.100.00<<<
[Pipeline] echo
>>>6.100.01<<<
[Pipeline] echo
>>>6.100.10<<<
[Pipeline] echo
>>>6.100.20<<<
[Pipeline] echo
>>>6.100.25<<<
[Pipeline] echo
>>>6.100.30<<<
[Pipeline] echo
>>>6.200.00<<<
[Pipeline] echo
>>>6.200.01<<<
[Pipeline] echo
>>>6.300.00<<<
[Pipeline] echo
[6.000.02, 6.000.10, 6.000.12, 6.000.15, 6.000.20, 6.000.25, 6.000.30, 6.100.00, 6.100.01, 6.100.10, 6.100.20, 6.100.25, 6.100.30, 6.200.00, 6.200.01, 6.300.00]
[Pipeline] echo
>>>5.900.00<<<
[Pipeline] echo
>>>6.000.00<<<
[Pipeline] echo
>>>6.000.01<<<
[Pipeline] echo
>>>6.000.02<<<
[Pipeline] echo
>>>6.000.20<<<
[Pipeline] echo
>>>6.000.30<<<
[Pipeline] echo
>>>6.100.00<<<
[Pipeline] echo
>>>6.100.01<<<
[Pipeline] echo
>>>6.200.00<<<
[Pipeline] echo
[5.900.00, 6.000.00, 6.000.01, 6.000.02, 6.000.20, 6.000.30, 6.100.00, 6.100.01, 6.200.00]
[Pipeline] readProperties
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
"6.200.01"
[Pipeline] lock

person ArteZ    schedule 25.06.2018    source источник


Ответы (1)


Во-первых, это строки, поэтому вы должны cизменить их на двойные. Сравнивать их гораздо проще: 6.200.21 становится 6200,21 (или 6200.21 в зависимости от вашей локализации).

Держите их в списке, с ними намного проще работать. Остальное — простые операции со списком Groovy.

BRANCH_VERSION = ver_list.contains(BRANCH_VERSION) ? BRANCH_VERSION : ver_list.max()

Конечно, если вам это нужно как строку, преобразуйте ее обратно с помощью объекта DecimalFormat и замените запятые точками.

person Bela Tamas Jozsa    schedule 25.06.2018
comment
OP хотел получить следующее ближайшее число к указанному, поэтому вам нужно будет добавить функцию для получения следующего ближайшего значения, подобного этой логике stackoverflow.com/questions/13318733/ - person rohit thomas; 26.06.2018
comment
Верно. Мне интересно, есть ли более удобный способ с лямбда-функциями и т. Д., Например, создание дельта-списка: def deltas = ver_list.collect { (it - BRANCH_VERSION ).abs()}. После этого вы можете получить следующий близкий элемент с def closest_release = ver_list.filter { (it - BRANCH_VERSION).abs() == deltas.min()}.last(), он же последний (По убыванию) элемент, имеющий наименьшее расстояние до BRANCH_VERSION. ... В конце выражение упрощается до: BRANCH_VERSION = ver_list.contains(BRANCH_VERSION) ? BRANCH_VERSION : closest_release - person Bela Tamas Jozsa; 26.06.2018
comment
Да, это возможно... Groovy использует замыкания, очень похожие на Lamda of Java. - person rohit thomas; 26.06.2018
comment
как я решил эту проблему: def versiongs = sh (script: ls '/pkg/flexprod/oracle/flexprodfiles/archive/goldstand' | LC_ALL=C awk '\$0 ‹= ${BRANCHVERSION}' | xargs -n1 | sort - n | tail -1 , returnStdout: true).trim() echo versiongs : ${versiongs} def versionts = sh (сценарий: ls './SoapUITestSuites/branches' | awk -F_ '{print \$2}' | LC_ALL= C awk '\$0 ‹= ${BRANCHVERSION}' | xargs -n1 | sort -n | tail -1 , returnStdout: true).trim() echo версии: ${versionts} - person ArteZ; 09.07.2018