Может ли Дженкинс собрать только один пакет Python в монорепозитории с несколькими пакетами?

Предположим, есть монорепозиторий с несколькими независимо собираемыми пакетами Python в разных каталогах, что-то вроде формата, показанного ниже, где foo и bar можно собирать независимо.

Теперь предположим, что кто-то отправляет код в репозиторий git, где он размещен, и версии кода находятся только в пакете bar. Если Jenkins примет решение, есть ли у Jenkins какой-либо способ определить, какой пакет был изменен, и собрать и развернуть только измененный пакет, например bar?

Или, наоборот, это просто стандартная практика, когда Jenkins перестраивает/повторно развертывает все пакеты в монорепозитории, независимо от того, какие изменения были внесены?

root/
 └ src/
    ├ foo/
    │  ├ requirements.txt
    │  ├ setup.py
    │  └ foo/
    │     ├ __init__.py
    │     ├ module1.py
    │     ├ ...
    │     └ moduleN.py
    .
    .
    .
    └ bar/
       ├ requirements.txt
       ├ setup.py
       └ bar/
          ├ __init__.py
          ├ module1.py
          ├ ...
          └ moduleN.py

person Tom    schedule 17.11.2018    source источник


Ответы (2)


Я также искал это. Я нашел запись в блоге Pinterest, где они используют Pants:

https://medium.com/@Pinterest_Engineering/building-a-python-monorepo-for-fast-reliable-development-be763781f67

В одной части они говорят:

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

Это выглядит хорошо для меня, хотя Pants не работает в Windows.

person Daí    schedule 07.01.2019

Я тоже искал ответ на это. Ручное задание с параметром, указывающим, какой пакет изменился, — это один из способов, но это не очень хорошо.

Другой вариант — попытаться определить, что изменилось, что мне тоже не нравится, но я нашел репозиторий git, в котором есть скрипт, который делает это https://github.com/slimm609/monorepo-gitwatcher

Я надеюсь, что есть лучшее решение, я нашел блог на Shazam (https://blog.shazam.com/python-microlibs-5be9461ad979) говорят об этом, и похоже, что они решили свою проблему. Я прокомментировал, чтобы попытаться получить некоторые разъяснения по этой части.

Я не в восторге ни от одного из этих решений, но на данный момент я не могу придумать или найти что-то лучшее!

Редактировать: в ответе Хорхе на статью Shazam упоминается, что они решают эту проблему, помечая репозиторий определенным именем, и это указывает Дженкинсу, какой из пакетов нужно встроить в монорепозиторий. Это не полностью автоматизировано, но я полагаю, это зависит от того, сколько времени вы готовы потратить на это и как часто это происходит!

person Jaz    schedule 27.11.2018