Дженкинс ждет завершения загрузки артефакта

#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")
  }
  

Это не идеально, но оно ожидает присутствия некоторых файлов. Если у вас есть только один файл, он должен работать, но если у вас несколько файлов, это может продолжаться, как только будет загружен один файл. Я не проверял, но с этим я предполагаю, что:

  • файл можно найти после завершения загрузки (размер файла не меняется регулярно)
  • все файлы загружаются «одновременно»