Как получить несколько подкаталогов как один артефакт с помощью GoCD?

Я использую GoCD для создания проекта с большим количеством модулей и смоделировал его как конвейер с двумя этапами (этап 1 — сборка кода, этап 2 — запуск тестов). Структура каталогов после успешного этапа сборки выглядит примерно так:

myproject/
|-- myproject-module1
|   |-- build              <-- created by stage 1, required by stage 2
|   `-- src
|-- myproject-module2
|   |-- build              <-- created by stage 1, required by stage 2
|   `-- src
|-- myproject-module3
|   |-- build              <-- created by stage 1, required by stage 2
|   `-- src
`-- ... many more modules ...

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

К сожалению, я пока не нашел способа добиться этого. Кажется, что GoCD создает отдельный ZIP-файл для всех папок *\build, и во время выборки файл *.zip не может быть найден (я предполагаю, что он действительно ищет файл с таким точным именем, а не использует подстановочные знаки). Конечно, я мог бы жестко закодировать все имена модулей и извлекать myproject-module[1:n] по отдельности, но именно этого я и хочу избежать.

Есть ли у кого-нибудь совет о том, как этого можно достичь?

В этом обсуждении от 2014 г. утверждается, что подстановочные знаки не могут использоваться для извлечения артефактов. Неужели до сих пор так?!


person dokaspar    schedule 19.06.2017    source источник


Ответы (2)


Я не знаю, возможно ли это сделать с помощью встроенных функций GoCD, но это определенно должно быть возможно с помощью REST API.

Зная имя текущего пайплайна, можно получить все доступные его этапы и рассчитать предыдущий. Далее, используя возможность загрузить каталог артефакта в виде zip-архива, вы может получить то, что вы хотите. Таким образом, вы можете добавить это как скрипт для второго этапа, который получит заархивированный артефакт, после чего вы сможете продолжить тестирование.

Для этого я могу порекомендовать свою реализацию API GoCD — yagocd. Эта библиотека Python позволит вам естественным образом программировать вышеупомянутую логику. Некоторые советы:

  • вы можете получить текущее имя конвейера из GO_PIPELINE_NAME (есть много переменные среды к вашим услугам)
  • чтобы найти конвейер по имени, вы можете использовать PipelineManager: go.pipelines.get($GO_PIPELINE_NAME, $GO_PIPELINE_COUNTER)
  • имея экземпляр конвейера, вы можете перебирать этапы по pipeline_instance.stages объекту
  • имея этап, вы можете получить его работу и скачать каталог по некоторому пути, используя метод go.artifacts.directory_wait

Если у вас возникнут вопросы по реализации, я могу попытаться вам помочь.

person grundic    schedule 20.06.2017

Вы можете выбирать артефакты по подстановочным знакам, вам просто нужно указать артефакту место назначения (атрибут dest в конфигурации XML). Вы можете делать это несколько раз внутри одного и того же задания, просто каждый раз используйте разные dest:

<artifact src="myproject/myproject-module1/build/*" dest="module1/" />
<artifact src="myproject/myproject-module2/build/*" dest="module2/" />
<artifact src="myproject/myproject-module3/build/*" dest="module3/" />

Затем соответствующие теги <fetchartifact ...> должны использовать srcdir="module1" и т. д.

person moritz    schedule 28.11.2017