Começamos com um desenvolvedor e um repositório svn contendo todo o nosso código:
^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1
(na época, isso foi uma grande melhoria). Depois disso, tivemos a chance de crescer um pouco e começamos a ter problemas com dependências circulares, testes lentos e dificuldades gerais em reutilizar o código (uma vez que, por exemplo, o conjunto de recursos do website1 havia entrado no módulo-a genérico).
Querendo modularizar a base de código e esperando que passemos para o git em breve (e depois de ler em algum lugar que o git não gosta de mega-repos svn), passamos a uma estrutura muito mais granular:
^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)
Isso foi conceitualmente ótimo. Código mais modular, suítes de teste muito mais rápidas, mais fáceis de documentar, etc. Fornecemos código-fonte para alguns de nossos componentes mais genéricos e tornamos todos os módulos instaláveis (usando pip install -e .
para instalá-los no development
virtualenv).
Criamos um ^/srv/trunk
repositório contendo a estrutura de pastas do ambiente de tempo de execução, ou seja. ^/srv/trunk/lib
para os módulos, /srv/trunk/src
para os restos de ^/foo/trunk
, ^/srv/trunk/www
para sites etc.
E finalmente (usando uma ideia do forforce, com a qual trabalhei há muito tempo [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ), criamos um "vcs- buscar "arquivo de texto que listou todos os repositórios relevantes e onde eles devem ser verificados no ambiente dev, e um comando correspondente para fazer isso. Por exemplo, uma linha vcs-fetc:
svn srv/lib/module-a ^/module-a/trunk
causaria (primeira vez)
cd /srv/lib && svn co ^/module-a/trunk module-a
ou (depois)
cd /srv/lib/module-a && svn up
e da mesma forma para repositórios do github (pacotes de fornecedores próprios e alterados / inalterados).
Usamos o mesmo processo vcs-fetch para criar o ambiente de produção, mas estamos descobrindo rapidamente que não temos como saber qual versão costumava ser executada no prod depois de fazer uma busca vcs.
Com o mega-repo, podíamos apenas anotar o número da revisão antes de atualizar o prod do trunk, e voltar era simples svn -r nnn up .
. Com o código no svn e no git (e um módulo em hg) - e ~ 120 repositórios, não é óbvio como fazer isso.
Eu li http://12factor.net/ hoje, e o primeiro fator é "Uma base de código", então também estou me perguntando se estou fora do caminho certo aqui.
Uma idéia que tive foi criar um script de implantação que criaria "deploy" instalável em pip-wheel e os agruparia em um requirements.txt
arquivo. Uma implantação envolveria a criação de um novo virtualenv, a instalação pelo pip do arquivo requirements.txt, listando as rodas de implantação e a troca do virtualenv ativo. A reversão para o anterior envolveria apenas a troca do virtualenv de volta (mas, a menos que desejássemos manter os virtualenvs por toda a eternidade, não nos permitiríamos voltar a nenhum ponto no tempo - na minha experiência, que nunca foi necessária).
Neste ponto, estou me perguntando se estou caminhando na direção errada ou se simplesmente não andei o suficiente no caminho certo ..? (tudo o que estou lendo continua falando sobre "seu aplicativo", e não sei como isso se traduz na execução de 14 sites da mesma base de código ...)