Después de 2 años en mi actual empresa, la cual ha pasado de ser una startup con 40 empleados cuando entré a facturar cerca de 20 millones de euros anuales y una plantilla de mas de 200 personas, hemos decidido empezar a tomarnos las cosas más en serio en el departamento de IT.
Nuestro trabajo se basa en crear las herramientas web necesarias para que nuestros empleados puedan realizar mejor su trabajo y se mejoren todos los procesos internos de la empresa.
Para ello tenemos un servidor donde tenemos alojada nuestra principal herramienta pero el cual no mantenemos ni del cual tenemos control excepto acceso mediante FTP para subir nuestros cambios a la herramienta y PhpMyAdmin (lo gestiona el equipo de IT internacional de nuestra empresa).
Ahora que las cosas ya no tienen el ritmo que tenían hace 2 años nos planteamos las cosas más despacio y podemos pararnos a pensar como hacer las cosas mejor.
Actualmente toda la herramienta está desarrollada con Codeigniter y Bootstrap y de momento no tenemos la intención de cambiar de framework puesto que la curva de aprendizaje de este framework es muy suave y nos está sirviendo para hacer todo lo que hasta el día de hoy hemos necesitado.
Lo primero que queremos hacer es empezar a trabajar con Git Flow. Para ello hemos seguido el modelo de Vincent Driessen (http://nvie.com/posts/a-successful-git-branching-model/) pero nos surge la primera duda:
Nosotros tenemos nuestro repositorio remoto en bitbucket pero a la hora de hacer un nuevo deploy de nuestra herramienta la única manera que tenemos de hacerlo es mediante FTP, actualizando los ficheros que se cambian o se crean.
Lo que hemos conseguido es tener acceso desde nuestro IDE (PhpStorm) directamente al FTP y esto nos facilita un poco el trabajo, pero lo que nos planteamos es ¿hay alguna manera de hacer este deploy de manera automática cuando se hace un push sobre la rama master remota? ¿Y lo mismo sobre la rama develop para hacer los test antes?
¿Es necesario tener git instalado en el servidor (cosa que tendríamos que pedir a quien mantiene este servidor) o se puede conectar desde Bitbucket? He leído que con herramientas como Deploybot se puede conseguir pero no se si funcionaría con este servidor.
¿Es ésta la mejor manera de hacer deploys o utilizáis otro tipo de técnicas para hacerlo como por ejemplo Magallanes?
Yo te recomiendo una herramienta de CI (integración continua) cómo jenkins, por ejemplo, y para hacer deploy el magallanes está bien, pero creo que es más consejable otro que es muy parecido pero que usa el estándar ansible y se llama ansistrano (El nombre viene de capistrano herramienta de deploy de la que coge las ideas que está hecha en rubi).
Con el jenkins tendrás en un servidor centralizado los deploys y mantendrás un histórico de estos. Puedes actualizar el proyecto (git pull) y desplegarlo (ansistrano). Realmente lo podrías hacer todo con jenkins pero creo que es mejor usar una herramienta cómo ansistrano para deploy.
Ansistrano te ofrecerá, cómo magallanes una serie de herramientas muy útiles a la hora de hacer el despliegue. Mantener releases por lo que si hay algún problema podrás hacer rollback, definir tareas antes y después de cada evento de deploy, cómo cambiar permisos, instalar los paquetes de composer, limpiar caches... https://github.com/ansistrano
Respecto a Codeigniter, yo lo he utilizado mucho y es verdad que tiene una curva de aprendizaje muy suave, pero para proyectos nuevos te recomiendo que uses otros frameworks más actuales porque el codeigniter se ha quedado un poco anticuado y no usa estándares que ya tiene PHP muy útiles.
Si quieres usar uno que es muy sencillo y con la filosofía codeigniter pero actual. Simple MVC Framework. http://simplemvcframework.com/php-framework Si quieres otro más completo ya Symfony o Laravel.
He estado mirando un poco sobre ansistrano y es muy interesante pero la idea que tenía en la cabeza no es exactamente esa, me explico:
Partiendo de que ninguno de nuestro equipo ha echo algo parecido antes y es ahora cuando estamos intentado mejorar los procesos, nos vemos en la situación de que para actualizar nuestra herramienta hacemos un push a bitbucket y posteriormente copiamos manualmente los ficheros que creamos/modificamos a nuestro servidor mediante ftp. Esto no nos parece muy profesional e incluso se nos puede olvidar subir algún fichero.
Entonces lo que queremos saber es como se hace en otras empresas, quiero decir, si hay alguna manera de que lo que hay en la rama principal sea exactamente lo mismo que en producción sin posibles errores y si hay alguna manera de automatizarlo. Lo mismo para la rama develop en el servidor de pruebas(en realidad es el mismo).
Yo creo que básicamente lo que nos hace falta es entender como se suelen hacer estas cosas en otras empresas.
Igual lo he explicado muy en general y no me he ceñido a lo que queríais hacer, pero con estas herramientas puedes hacerlo.
Una manera de hacerlo seria la siguiente, puedes definir un hook en bitbucket para que cuando hagas push a la rama master haga el deploy a tu server.
Por lo que leo parece que el tema de crear ramas sobre la rama develop para features y bugs lo tienes claro.
Supongo que usaréis bitbucket por algo en especial, porque otro tema es que podríais tener el repositorio central en un servidor vuestro y usar una herramienta de integración continua cómo jenkins que te da una interfaz muy sencilla para hacer deploy (también automáticos), ver el histórico de estos... En este server podríais hacer tambien que el jenkins, para hacer la parte del deploy, use una herramienta cómo ansistrano.
Además una vez puestos a hacer las cosas un poco mejor, en la herramienta de integración continua podríais ejecutar los test unitarios para comprobar el resultado antes de hacer el deploy. Añadir comprobación de coding standards cuando los programadores hagan commit o push o el evento que más comodo os sea...
Ahora que habéis bajado el ritmo y tenéis tiempo para replantearos la estrategia, os recomiendo que "dockericeis" vuestra aplicación, a parte de los beneficios evidentes de portabilidad, inmutabilidad y ligereza que proporciona encapsular y repartir cualquier tipo de app en contenedores se le están dando otros usos tanto o más interesantes, como por ejemplo integración y entrega continua de versiones, lo cual permite acelerar de forma considerable el proceso de desarrollo, pruebas y paso a producción y además de forma controlada, fiable y segura.
Supongo que es cuestión de que lo plantees a los diferentes estamentos de tu organización y lo investiguéis, supone un esfuerzo extra puntual pero que a la larga vais a agradecer, depende en parte del numero de personas que intervengan en todo el proceso de desarrollo.
Admite integración con todo tipo de herramientas de CI como Jenkins, Tutum, ...
Hay infinidad de documentación en la red sobre el aprovechamiento de docker para CI y CD, como por ejemplo:
https://sreeninet.wordpress.com/2016/01/23/ci-cd-with-docker-jenkins-and-tutum/
Puedes utilizar alguna herramienta de deploy como Mage http://magephp.com, Rocketeer http://rocketeer.autopergamene.eu/ o deployer http://deployer.org para automatizar todo el despliegue en producción con tan sólo un comando.
You can use Envoyer to deploy your CodeIgniter app. Since CI is a PHP framework, it can be done through Envoyer. Here is an example: https://www.cloudways.com/blog/php-laravel-envoyer-deployment/ The process is quite simple and quick.
Después de 2 años en mi actual empresa, la cual ha pasado de ser una startup con 40 empleados cuando entré a facturar cerca de 20 millones de euros anuales y una plantilla de mas de 200 personas, hemos decidido empezar a tomarnos las cosas más en serio en el departamento de IT.
Nuestro trabajo se basa en crear las herramientas web necesarias para que nuestros empleados puedan realizar mejor su trabajo y se mejoren todos los procesos internos de la empresa.
Para ello tenemos un servidor donde tenemos alojada nuestra principal herramienta pero el cual no mantenemos ni del cual tenemos control excepto acceso mediante FTP para subir nuestros cambios a la herramienta y PhpMyAdmin (lo gestiona el equipo de IT internacional de nuestra empresa).
Ahora que las cosas ya no tienen el ritmo que tenían hace 2 años nos planteamos las cosas más despacio y podemos pararnos a pensar como hacer las cosas mejor.
Actualmente toda la herramienta está desarrollada con Codeigniter y Bootstrap y de momento no tenemos la intención de cambiar de framework puesto que la curva de aprendizaje de este framework es muy suave y nos está sirviendo para hacer todo lo que hasta el día de hoy hemos necesitado.
Lo primero que queremos hacer es empezar a trabajar con Git Flow. Para ello hemos seguido el modelo de Vincent Driessen (http://nvie.com/posts/a-successful-git-branching-model/) pero nos surge la primera duda:
Nosotros tenemos nuestro repositorio remoto en bitbucket pero a la hora de hacer un nuevo deploy de nuestra herramienta la única manera que tenemos de hacerlo es mediante FTP, actualizando los ficheros que se cambian o se crean.
Lo que hemos conseguido es tener acceso desde nuestro IDE (PhpStorm) directamente al FTP y esto nos facilita un poco el trabajo, pero lo que nos planteamos es ¿hay alguna manera de hacer este deploy de manera automática cuando se hace un push sobre la rama master remota? ¿Y lo mismo sobre la rama develop para hacer los test antes?
¿Es necesario tener git instalado en el servidor (cosa que tendríamos que pedir a quien mantiene este servidor) o se puede conectar desde Bitbucket? He leído que con herramientas como Deploybot se puede conseguir pero no se si funcionaría con este servidor.
¿Es ésta la mejor manera de hacer deploys o utilizáis otro tipo de técnicas para hacerlo como por ejemplo Magallanes?
Muchas gracias por adelantado.
20/02/2016 03:14
Yo te recomiendo una herramienta de CI (integración continua) cómo jenkins, por ejemplo, y para hacer deploy el magallanes está bien, pero creo que es más consejable otro que es muy parecido pero que usa el estándar ansible y se llama ansistrano (El nombre viene de capistrano herramienta de deploy de la que coge las ideas que está hecha en rubi).
Con el jenkins tendrás en un servidor centralizado los deploys y mantendrás un histórico de estos. Puedes actualizar el proyecto (git pull) y desplegarlo (ansistrano). Realmente lo podrías hacer todo con jenkins pero creo que es mejor usar una herramienta cómo ansistrano para deploy.
Ansistrano te ofrecerá, cómo magallanes una serie de herramientas muy útiles a la hora de hacer el despliegue. Mantener releases por lo que si hay algún problema podrás hacer rollback, definir tareas antes y después de cada evento de deploy, cómo cambiar permisos, instalar los paquetes de composer, limpiar caches... https://github.com/ansistrano
Respecto a Codeigniter, yo lo he utilizado mucho y es verdad que tiene una curva de aprendizaje muy suave, pero para proyectos nuevos te recomiendo que uses otros frameworks más actuales porque el codeigniter se ha quedado un poco anticuado y no usa estándares que ya tiene PHP muy útiles.
Si quieres usar uno que es muy sencillo y con la filosofía codeigniter pero actual. Simple MVC Framework. http://simplemvcframework.com/php-framework Si quieres otro más completo ya Symfony o Laravel.
25/02/2016 15:29
Gracias por tu comentario.
He estado mirando un poco sobre ansistrano y es muy interesante pero la idea que tenía en la cabeza no es exactamente esa, me explico:
Partiendo de que ninguno de nuestro equipo ha echo algo parecido antes y es ahora cuando estamos intentado mejorar los procesos, nos vemos en la situación de que para actualizar nuestra herramienta hacemos un push a bitbucket y posteriormente copiamos manualmente los ficheros que creamos/modificamos a nuestro servidor mediante ftp. Esto no nos parece muy profesional e incluso se nos puede olvidar subir algún fichero.
Entonces lo que queremos saber es como se hace en otras empresas, quiero decir, si hay alguna manera de que lo que hay en la rama principal sea exactamente lo mismo que en producción sin posibles errores y si hay alguna manera de automatizarlo. Lo mismo para la rama develop en el servidor de pruebas(en realidad es el mismo).
Yo creo que básicamente lo que nos hace falta es entender como se suelen hacer estas cosas en otras empresas.
Un saludo y muchas gracias.
26/02/2016 01:15
Igual lo he explicado muy en general y no me he ceñido a lo que queríais hacer, pero con estas herramientas puedes hacerlo.
Una manera de hacerlo seria la siguiente, puedes definir un hook en bitbucket para que cuando hagas push a la rama master haga el deploy a tu server.
Por lo que leo parece que el tema de crear ramas sobre la rama develop para features y bugs lo tienes claro.
Supongo que usaréis bitbucket por algo en especial, porque otro tema es que podríais tener el repositorio central en un servidor vuestro y usar una herramienta de integración continua cómo jenkins que te da una interfaz muy sencilla para hacer deploy (también automáticos), ver el histórico de estos... En este server podríais hacer tambien que el jenkins, para hacer la parte del deploy, use una herramienta cómo ansistrano.
Además una vez puestos a hacer las cosas un poco mejor, en la herramienta de integración continua podríais ejecutar los test unitarios para comprobar el resultado antes de hacer el deploy. Añadir comprobación de coding standards cuando los programadores hagan commit o push o el evento que más comodo os sea...
Un saludo.
22/02/2016 17:48
Supongo que es cuestión de que lo plantees a los diferentes estamentos de tu organización y lo investiguéis, supone un esfuerzo extra puntual pero que a la larga vais a agradecer, depende en parte del numero de personas que intervengan en todo el proceso de desarrollo.
Admite integración con todo tipo de herramientas de CI como Jenkins, Tutum, ...
Hay infinidad de documentación en la red sobre el aprovechamiento de docker para CI y CD, como por ejemplo:
https://sreeninet.wordpress.com/2016/01/23/ci-cd-with-docker-jenkins-and-tutum/
19/02/2016 22:22
27/12/2017 11:36