Desplegar múltiples aplicaciones en un solo tree con Capistrano y Git

Estoy tratando de implementar un website PHP usando Capistrano. El website está compuesto por 4 componentes (código frontend y 3 web services), cada uno almacenado en su propio repository git. Quiero implementar los 4 componentes en una sola estructura de tree (ver a continuación), de modo que cambiar entre las versiones de sitios web sería tan simple como mover el enlace "actual".

Veo que, de forma pnetworkingeterminada, una implementación de Capistrano está diseñada para implementar un único repository. Si lo entiendo correctamente, incluso usar algo como Caphub no me ayudará, ya que los 4 componentes se implementarían en 4 treees diferentes, haciendo que la reversión a un punto específico en el time sea un process engorroso.

¿Hay alguna forma de get la configuration a continuación usando Capistrano? ¿Cuál es la mejor práctica para esta situación?

root/ | current/ | releases/ | | <timestamp/> | | | frontend/ | | | webservice-1/ | | | webservice-2/ | | | webservice-3/ | | <timestamp/> | | | frontend/ | | | webservice-1/ | | | webservice-2/ | | | webservice-3/ | shanetworking/ 

Actualizar:

Herir usando una solución de submodules como se sugiere en la respuesta aceptada. Creé un repository de sitios web con los 4 submodules y un repository de implementación de sitios web donde guardo los files de implementación de Capistrano. Escribí un simple script de shell para ahorrarme la molestia de actualizar los submodules en cada implementación (¡un process bastante engorroso!). Para implementar, ejecuto el script (fuente a continuación) y luego ejecuto "cap deploy".

 #!/bin/sh git clone gitserver:path_to_git_repositories/website.git cloned cd cloned git submodule init git submodule update git submodule foreach git pull origin master # updating all modules to the current code in the master branch git submodule foreach git add . git commit -a -m "Updating submodules" git push origin master cd .. rm -rf cloned 

Tuve un problema muy similar cuando estaba implementando una aplicación de Rails y un service web. Decidí usar submodules de git, y debería resolver todos tus problemas.

Solo necesita crear un repository git principal que agregue frontend y todos los web services como submodules. Luego, en capistrano, solo apunta a este repository principal y establece git_enable_submodules en 1.

A continuación, puede desarrollar los 4 componentes por separado y cuando desee implementar solo actualice los submodules para corregir los puntos y confirmar el repository principal. Este enfoque debería proporcionar exactamente este layout de directory tal como lo presentó y debería facilitar la reversión.

Me encontré con el mismo problema al tratar de realizar un deployment atómico de una aplicación web que consiste en 3 repositorys Git separados usando Capistrano v3.6 .

Usé el enfoque de Submodules como lo mencionó, pero de una manera más automatizada y para v3 (viendo la date de la publicación, podría ser v2).

Pasos

  1. Tenga 1 repo para la configuration de Cap y otro 1 para agrupar los repos principales de proyectos como submodules.
    set :repository, 'submodules-repo-url'
  2. Reemplace la estrategia de Git de Cap para admitir submodules (compatible con v2, eliminado en v3).
    Encuentra el guión aquí .
    set :git_strategy, SubmoduleStrategy
    La estrategia anterior se ocupa de actualizar los submodules, por lo que es como un simple repo de Git.
    Busca los submodules como carpetas separadas en la versión actual, al igual que en el esquema.
  3. cap deploy y disfrutar.

Escribí una publicación de blog sobre ella, más información se puede encontrar aquí .