Мы начали с одного разработчика и одного репозитория SVN, содержащего весь наш код:
^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1
(в то время это было большое улучшение). После того, как у этого появился шанс немного подрасти, у нас начались проблемы с циклическими зависимостями, медленными тестовыми наборами и общими трудностями при повторном использовании кода (поскольку, например, набор функций website1 попал в общий модуль-a).
Желая модулировать кодовую базу и ожидая, что мы вскоре перейдем к git (и прочитав где-то, что git не любит svn mega-repos), мы перешли к гораздо более детальной структуре:
^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)
Это было концептуально здорово. Более модульный код, намного более быстрые тестовые наборы, более легкое документирование и т. Д. Мы открыли некоторые из наших более общих компонентов и сделали все модули готовыми к установке (используя их pip install -e .
для установки в development
virtualenv).
Мы создали ^/srv/trunk
репозиторий, содержащий структуру папок среды выполнения, т.е. ^/srv/trunk/lib
для модулей, /srv/trunk/src
для остатков ^/foo/trunk
, ^/srv/trunk/www
для веб-сайтов и т. д.
И наконец (взяв идею из перформанса, с которым я работал очень давно [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ), мы создали «vcs- «Получить текстовый файл», в котором перечислены все соответствующие репозитории и где их следует извлечь в среду разработки, и соответствующую команду для этого. Например, строка vcs-fetc:
svn srv/lib/module-a ^/module-a/trunk
вызовет либо (первый раз)
cd /srv/lib && svn co ^/module-a/trunk module-a
или (потом)
cd /srv/lib/module-a && svn up
и аналогично для репозиториев github (как наших собственных, так и измененных / неизмененных пакетов поставщиков).
Мы использовали тот же процесс vcs-fetch для создания производственной среды, но мы быстро обнаруживаем, что у нас нет способа узнать, какая версия использовалась в prod после выполнения vcs-fetch.
С мега-репо мы могли просто записать номер ревизии, прежде чем обновлять prod из транка, и вернуться назад было просто svn -r nnn up .
. С кодом как в SVN, так и в Git (и один модуль в HG) - и ~ 120 репозиториев, не очевидно, как это сделать ..
Сегодня я читаю http://12factor.net/ , и первый фактор - это «Одна кодовая база», поэтому мне также интересно, ухожу ли я с правильного пути?
У меня была одна идея - создать сценарий развертывания, который бы создавал pip-устанавливаемые колеса «развертывания» и «связывал» их вместе в requirements.txt
файл. Развертывание будет включать создание нового virtualenv, установку pip-файла require.txt со списком колес развертывания и переключение активного virtualenv. Возврат к предыдущему будет просто включать переключение virtualenv обратно (но если мы не хотим вечно хранить virtualenvs, это не позволит нам вернуться к любому моменту времени - в моем опыте, который никогда не был необходим).
В этот момент мне интересно, иду ли я в неправильном направлении, или я просто недостаточно далеко зашел по правильному пути? (все, что я читаю, говорит о «вашем приложении», и я не знаю, как это приводит к запуску 14 сайтов с одной и той же кодовой базой ...)