#jenkins #artifactory #jfrog
#дженкинс #артефактор #jfrog
Вопрос:
Итак, я загружаю несколько артефактов с помощью JFrog
rtDownload (
serverId: 'Artifactory-1',
spec: '''{
"files": [
{
"pattern": "bazinga-repo/froggy-files/",
"target": "bazinga/"
}
]
}''',
// Optional - Associate the downloaded files with the following custom build name and build number,
// as build dependencies.
// If not set, the files will be associated with the default build name and build number (i.e the
// the Jenkins job name and number).
buildName: 'holyFrog',
buildNumber: '42'
)
Который работает, но работает асинхронно, и я должен использовать результаты, как только он завершится. Как мне ожидать каждой rtDownload в синтаксисе конвейера?
Комментарии:
1. Я не уверен, как это можно сделать в декларативном синтаксисе, но вы можете использовать синтаксис скриптового конвейера , который является синхронным.
Ответ №1:
Ниже для меня работает загрузка 2 артефактов :
def target = params.BuildInfo.trim()
def downloadSpec = """{
"files": [{
"pattern": "${artifactory}.zip",
"target": "./${target}.zip"
}]
}"""
def buildInfo = server.download spec: downloadSpec
def files = findFiles(glob: "**/${target}.zip") // Define `files` here
if (files) { // And verify `it` here, so it'll wait
...
}
Комментарии:
1. В итоге я использовал нечто подобное, и я знаю, что это сработало, поскольку синтаксис конвейера синхронный. Думаю, я могу принять это, даже если я не могу это проверить.
Ответ №2:
Лично я в конечном итоге реализовал идею Хоа таким образом
try {
// attempt to retreive the results from artifactory
rtDownload (
serverId: 'my_arti_server',
spec: """{
"files": [
{
"pattern": "somepath/run_*.zip",
"target": "run/"
}
]
}""",
failNoOp: false, // no failure if no file was found
)
// rtDownload is async, we have to wait for dl completion
def count = 5
while(count > 0) {
sh script:"""#!/bin/bash e
chmod 777 run/run_*.zip
"""
def files = findFiles glob: "run/run_*.zip"
if (files.length > 0 ){
break
}
sleep(5)
count--
}
} catch (Exception e) {
echo 'Exception occurred: ' e.toString()
}
def files = findFiles glob: "run/run_*.zip"
if (files.length == 0 ){
error("files couldn't be found")
}
Это не идеально, но оно ожидает присутствия некоторых файлов. Если у вас есть только один файл, он должен работать, но если у вас несколько файлов, это может продолжаться, как только будет загружен один файл. Я не проверял, но с этим я предполагаю, что:
- файл можно найти после завершения загрузки (размер файла не меняется регулярно)
- все файлы загружаются «одновременно»