Конвейер со сценариями Jenkins - многократное выполнение с передачей артефактов между этапами

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

Я определил конвейер со сценариями, который выполняет предопределенные задания поэтапно, некоторые из которых выполняются параллельно, как показано ниже:

  • основное задание конвейера расположено в этой структуре: / jenkins / workspace / ‹main_job› эти задания также подготавливают артефакты, и позже я копирую их на разные этапы / задания в том же конвейере с идентификатором сборки выполненная работа.

      node() {
          stage("Creating Build") {
          def stages = [:]
          failFast: true
          stages["Core"] = {
              copyArtifacts(projectName: <job to copy from>, flatten: true, target: '../' + coreBuildJob)
              buildCore = build job: coreBuildJob
              }
          }
          stages["Content"] = {
              copyArtifacts(projectName: <job to copy from>, flatten: true, target: '../' + contentBuildJob)
              buildContent = build job: contentBuildJob
          }
          parallel(stages)
      }
    

Я использую плагин CopyArtifact для копирования созданных артефактов, но оказалось, что:

  1. он копирует файл в основную папку проекта в экземпляре.
  2. из-за разного местоположения рабочего пространства / проекта мне нужно было определить «целевое» местоположение, чтобы правильно скопировать артефакты в требуемое задание, которое я выполняю в сценарии перед выполнением заданий.

например, для coreBuildJob на этапе Core:

`copyArtifacts(projectName: <job to copy from>, flatten: true, target: '../' + <job_for_execution>)`

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

Когда я хочу, чтобы это задание конвейера выполнялось несколько раз с разными параметрами.

Проблема в том, что когда конвейер выполняется во второй раз, а задание, которое выполняется на одном из этапов, выполняется второй раз, оно создает следующий путь на локальном компьютере:

`/jenkins/workspace/test_jobs/<job_for_execution>@2`

Это означает, что то, что у меня есть в моем скрипте, неверно, потому что он копирует файлы в:

`/jenkins/workspace/test_jobs/<job_for_execution>`

он не копирует артефакты в нужное место, и они недоступны из выполненного задания.

Я думал о том, чтобы часть copyArtifacts выполнялась во время команды 'build job' (как вы можете определить в пользовательском интерфейсе Jenkins с передачей BUILD_ID в качестве переменной для копирования подобных артефактов), но я не могу найти никаких подробностей относительно этого, чтобы достичь того же поведения с сценарий.

Как решить эту проблему?


person rivar_    schedule 23.11.2020    source источник


Ответы (1)


Вы можете использовать stash / unstash.

После запуска сборки вы можете спрятать:

stash name:'data', includes: './*'

где данные - это имя (идентификатор) и могут быть каталогом, подкаталогом или отдельным файлом.

Затем на этапах, на которых вы хотите получить результат сборки, используйте unstash:

unstash 'data'

После выполнения unstash файлы также будут в соответствующей папке, и вы сможете выполнить другие шаги.

См. https://www.jenkins.io/doc/pipeline/examples/ для получения дополнительной информации.

person kodark    schedule 23.11.2020
comment
Дело здесь в том, что я должен распаковать артефакты в другой каталог, когда одно и то же задание выполняется несколько раз, оно создает разные папки в рабочей области для параллельных выполнений. Я не могу знать, какая папка будет создана. Итак, опять же, это та же проблема, что и выше, с плагином copyArtifacts. - person rivar_; 25.11.2020
comment
с unstash текущая рабочая область определяется автоматически, вам не нужно указывать каталог. Попробуйте. - person kodark; 25.11.2020