¿Existe una forma “correcta” de implementar aplicaciones web?

No hablaré de ninguna verdad universal, pero así es como lo hacemos:

  • GitFlow a través de SourceTree. Cualquier cosa fusionada con la rama de desarrollo desencadena un enlace web en Bitbucket que realiza una llamada a un script de implementación en nuestro servidor de desarrollo. Se lleva a cabo un montón de autorizaciones y otras cosas para verificar que la llamada se realiza desde Bitbucket y luego desencadena un simple “git pull” en la rama de desarrollo del repositorio principal.
  • Después de verificar que todo está bien con la rama de desarrollo, se realiza una fusión de desarrollo a maestro que activa otro enlace web con las mismas funciones que el paso anterior, pero aquí en nuestros servidores de producción.

Esto funciona bastante bien para decir la verdad. La revisión es muy fácil, tan pronto como se empuja la sucursal, se aplica automáticamente a los servidores de producción, lo que nos permite centrarnos en llevar esa revisión por los desagües a todas las demás sucursales activas.

Tan pronto como las características estén listas para pruebas amplias, las tenemos disponibles de inmediato en nuestro entorno, y no es necesario realizar fusiones amplias de antemano.

Por supuesto, esto supone que está empleando algún control de versión, ya sea Git o Mercurial o lo que sea que haga flotar su barco. En nuestro caso, hemos tenido excelentes experiencias con Git a través de Bitbucket y diría que, en lo que respecta a la GUI para Git, SourceTree es un cliente muy fuerte que me brinda un gran control y una visión general con casi todo lo que podría ser complicado en Git simplificado en conceptos comprensibles y atajos.

También me gustaría promover la forma de trabajar de GitFlow. Entiendo que podría no satisfacer las necesidades de todos, pero en nuestro caso es extremadamente adecuado:

  • Rama maestra: esta es la producción, nada debería fusionarse aquí si no se ha probado rigurosamente.
  • Desarrollar sucursal: este es un terreno común para todos los desarrolladores en un proyecto más o menos. Cada función / revisión presenta una solicitud de extracción que se obtiene cuando el gerente de proyecto ha revisado el código y permanece en desarrollo hasta el próximo lanzamiento programado.
  • Ramas de características: este es el patio de recreo. La comprobación de la rama de desarrollo permite a cualquier desarrollador crear de forma independiente sus características, protegidas de forma segura en su propio entorno. Cuando una característica está lista para fusionarse en el desarrollo, utilizamos solicitudes de extracción y revisión de código.
  • Liberar ramas: aquí es donde los conceptos se vuelven realmente suaves para nosotros. Cuando tenemos suficientes características para hacer un lanzamiento, o el momento es correcto, bifurcamos la rama de desarrollo en un nuevo lanzamiento. Corrección de errores, pruebas, lo que sea. Aquí es donde sudamos nuestro código. Cuando “todo está hecho” fusionamos la rama de lanzamiento en master. Otro número de versión salta a su lugar, y volvemos al desarrollo de características individuales.

Como dije antes, este no es un flujo de trabajo universal, y estoy seguro de que hay muchas razones para que este flujo de trabajo no sea adecuado para entornos específicos, pero creo que es un gran flujo para desarrollar alrededor de un repositorio central.

Hay un buen artículo en profundidad en Atlassian con ilustraciones que explican también otros flujos de trabajo: Gitflow Workflow.


Para responder a su pregunta en breve: no, no creo que haya una forma absolutamente correcta de implementar aplicaciones. La mejor manera es la necesidad que se adapta perfectamente a su flujo de trabajo y que tiene sentido para su entorno. Asumir implementaciones hechas para escalas empresariales no tiene sentido para una pequeña aplicación web, del mismo modo que los enlaces web no tendrían sentido en un sentido de escala de Facebook.

¡Las herramientas adecuadas para el trabajo siempre dependen del trabajo!

Hay muchas herramientas y servicios que estarán encantados de ayudarle. Puedo guiarte por nuestra pila y por qué elegimos las piezas individuales. Para nuestras aplicaciones hay un par de pasos clave que deben suceder.

En primer lugar, tenemos el sistema de control de versiones, para nosotros eso es Git y GitHub porque tienen buenas herramientas de administración y se integran con una gran variedad de herramientas externas. Usamos una versión del flujo de trabajo de gitflow para poder controlar cómo se integran las características, pero con el maestro utilizado para el desarrollo, ya que se necesita un paso adicional para establecer la rama predeterminada, y eso ocasionalmente se perdió y causó problemas importantes.

A continuación está el paso de compilación. Para la mayoría de los sitios, hay algunas cosas que deben ocurrir para preparar el código para el navegador. Eso es a menudo compilar Sass, mecanografiado, imágenes de minificación, etc. Utilizamos Grunt para estas tareas. Cuando tomamos la decisión, era la más estable con la mayor cantidad de complementos. Desde entonces no hemos tenido una razón convincente para cambiar y pagar ese costo.

Luego está el despliegue. Usamos Capistrano para esto. Si bien existe la sobrecarga de Ruby, ya lo estamos usando para Sass y Compass, así como otras herramientas internas, por lo que no es un gran impulso. Al igual que Grunt, lo elegimos principalmente por la estabilidad y la ubicuidad.

Por supuesto, para unir todas estas cosas, necesitábamos una herramienta de integración continua. Elegimos a Jenkins para esto. Como los demás por la ubicuidad y estabilidad. ¿Ves una tendencia?

Para muchas de estas tareas podríamos haber utilizado servicios. Habrían disminuido nuestro tiempo de comercialización, si lo desea, y reducido en cierta medida la carga de nuestro personal. Sin embargo, todavía estábamos aprendiendo cuando se trata de este modo de operación, a pesar de que han pasado casi 3 años desde que comenzamos. Rodar el nuestro nos da la capacidad de extenderlo para satisfacer otras necesidades. Si necesitamos agregar, digamos, métricas de calidad de código, podemos hacerlo sin tener que integrar otro servicio, administrar asientos y usuarios, etc.

Del mismo modo, con una herramienta como Capistrano que utiliza un lenguaje completo de Turing, podemos incorporar lógica arbitraria y extraer de un universo de extensiones de terceros según sea necesario.

Si desea ver lo que tenemos, puede hacerlo en github.com/forumone/web-starter.