Depois de um mês longo e difícil, tentando coisas diferentes e sendo mordido toda vez que percebi,
só porque o Heroku usa um repositório git como um mecanismo de implantação, você não deve tratá-lo como um repositório git
poderia ter sido rsync também, eles foram para o git, não se distraiam por causa disso
se você faz isso, você se abre para todo tipo de mágoa. Todas as soluções mencionadas falham miseravelmente em algum lugar:
- requer que algo seja feito toda vez, ou periodicamente, ou coisas inesperadas acontecem (empurrando submódulos, sincronizando subárvores, ...)
- se você usar um mecanismo, por exemplo, para modularizar seu código, o Bundler o comerá vivo, é impossível descrever a quantidade de frustração que tive com esse projeto durante a busca para encontrar uma boa solução para isso.
- você tenta adicionar o mecanismo como git repo link +
bundle deploy
- falhar, é necessário empacotar atualizações sempre
- você tenta adicionar o mecanismo como uma falha
:path
+ bundle deploy
-, a equipe de desenvolvimento considera a :path
opção como "você não está usando o Bundler com esta opção de gema" para que ele não seja agregado para produção
- Além disso, toda atualização do mecanismo deseja atualizar sua pilha de trilhos -_-
- A única solução que encontrei é usar o mecanismo como um
/vendor
link simbólico no desenvolvimento e copiar os arquivos para produção
A solução
O aplicativo em questão possui 4 projetos no git root:
- api - dependendo do perfil será executado em 2 hosts heroku diferentes - upload e api
- web - o site
- web-old - o site antigo, ainda em migração
- comum - os componentes comuns extraídos em um mecanismo
Todos os projetos têm um vendor/common
link simbólico para a raiz do common
mecanismo. Ao compilar o código-fonte para implantação no heroku, precisamos remover o link simbólico e o rsync para que ele esteja fisicamente na pasta do fornecedor de cada host separado.
- aceita uma lista de nomes de host como argumentos
- executa um push git no seu repositório de desenvolvimento e, em seguida, executa um pull limpo do git em uma pasta separada, garantindo que nenhuma alteração suja (não confirmada) seja enviada automaticamente aos hosts
- implanta os hosts em paralelo - todos os repositórios heroku git são extraídos, novo código é sincronizado nos lugares certos, confirmado com informações básicas de push no comentário git commit,
- no final, enviamos um ping com ondulação para dizer aos anfitriões do hobby que acordem e seguimos os logs para ver se tudo deu certo
- também funciona bem com jenkins: D (envio automático de código para testar servidores após testes bem-sucedidos)
Funciona muito bem na natureza com problemas mínimos (não?) Há 6 meses
Aqui está o script https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Atualização 1
@AdamBuczynski, nunca é tão direto.
Em primeiro lugar, você sempre terá pelo menos um ambiente de produção e teste - e um monte de clusters específicos de funções, na pior das hipóteses - de repente 1 pasta precisa mapear para n projetos heroku como um requisito bastante básico e tudo precisa ser organizado de alguma forma para que o script "sabe" qual fonte você deseja implantar onde,
Segundo, você desejará compartilhar código entre projetos - agora vem a sync_common
parte, os shennanigans com links simbólicos no desenvolvimento sendo substituídos pelo código rsynced real no Heroku porque o Heroku requer uma certa estrutura de pastas e bundler e rubygems realmente tornam as coisas muito feias muito mal se você deseja extrair os threads comuns em uma gema
Terceiro, você desejará conectar o CI e isso mudará um pouco a forma como as subpastas e o repositório Git precisam ser organizados; no final, no caso de uso mais simples possível, você acaba com a essência mencionada acima.
Em outros projetos, eu preciso conectar as compilações Java; ao vender software para vários clientes, você precisará filtrar os módulos que serão instalados, dependendo dos requisitos de instalação e outros enfeites,
Eu realmente deveria considerar explorar coisas em um Rakefile ou algo assim e fazer tudo dessa maneira ...