Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Deployer - despliegue rápido de apps

104 views

Published on

Presentación realizada en el Meetup de PHPVigo sobre el despliegue de aplicaciones usando Deployer

  • Login to see the comments

  • Be the first to like this

Deployer - despliegue rápido de apps

  1. 1. Deployer Despliegue rápido y sencillo de aplicaciones (Web)
  2. 2. Meetups @SergioCarracedoWeb developer at OPSOU Php Developer Drupal enthusiast @SergioCarracedo
  3. 3. ¿Qué entendemos despliegue? Meetups Es la forma en la que llevamos a una o varias máquinas remotas: ● El código y/o sus cambios ● Los archivos de configuraciones ● Los archivos binarios: Imágenes, videos, documentos ● ….. ● Todo lo que necesitamos para hacer funcionar nuestra aplicación
  4. 4. ¿Como podemos hacer el despliegue? Meetups Copiar código (a mano) Subida ● FTP / SFTP / SSH / Rsync ● Modificar los archivos de configuración a mano en el destino ● Borrar a mano caches ● etc… Es muy ineficiente / cansado / aburrido No podemos hacer rollback Necesitamos saber la lista de ficheros cambiados
  5. 5. ¿Como podemos hacer el despliegue? 2 Meetups Control de versiones (GIT / SVN) Ya tenemos nuestro código en git (o deberíamos) git clone -b master Seguimos teniendo que tocar la ficheros de configuración a mano. Es posible hacer rollback pero no es rápido (o tan rápido como puede llegar a ser) Los archivos de usuario (imágenes, videos, etc) no deberían estar en el repo.
  6. 6. ¿Como podemos hacer el despliegue? 3 Meetups Sistema de despliegue Es la “Solución” Podemos hacer rollback “instantáneo” y a distintos puntos, no solo a la última versión Creación automática de archivos de configuración para cada máquina Gestión de archivos / directorios escribibles Gestión de carpetas compartidas Instalación de vendors
  7. 7. Sistemas de despliegue Meetups Existen muchas opciones ● Capistrano http://capistranorb.com/ (Ruby) ● Ansistrano https://github.com/ansistrano (Python) ● Rocketeer http://rocketeer.autopergamene.eu/ (PHP) ● Fabric https://get.fabric.io/ (Python) Deployer http://deployer.org/
  8. 8. Deployer Meetups ● Gestor de despliegues escrito en PHP ● Modular: Permite creación de recetas personalizadas ● Rollback ● Despliegues consistentes en distintos servidores (entornos) Instalación mv deployer.phar /usr/local/bin/dep chmod +x /usr/local/bin/dep o composer require deployer/deployer:^3.2
  9. 9. Estructura de directorios Meetups /your/project/path |--releases | |--20150513120631 | |--... |--shared | |--... |--current -> /your/project/path/releases/20150513120631
  10. 10. Deployer Meetups Creamos un archivo de configuración en la raíz del proyecto con el nombre deploy.php <?php // All Deployer recipes are based on `recipe/common.php`. require 'recipe/common.php'; require './.deployer/myrecipe.php'; task('deploy', ['deploy:prepare', 'deploy:release', 'deploy:update_code', ‘deploy:shared', 'deploy:writable', 'deploy:symlink', 'cleanup' ]); serverList('.deployer/servers.yml'); set(‘keep_releases’, 5); set('repository', 'git@bitbucket.org:sergiocarracedo/phpvigo_deployer.git');
  11. 11. Deployer: Receta 1 Meetups Creamos la receta myrecipe.php <?php set('shared_files', [ '.htaccess', 'settings.inc.php' ]); set('shared_dirs', [ 'user_imgs', 'cache', ]); set('writable_dirs', [ 'user_img', 'cache', ]);
  12. 12. Deployer: Permisos de escritura Meetups Necesitamos añadir al sudoers user_name ALL=(ALL) NOPASSWD: /usr/bin/setfacl ACLs http://rm-rf.es/acl-access-control-list-en-sistemas-de-ficheros-gnulinux/ Nos permite mejor granularidad en los permisos del sistema de archivos Podemos asignar permisos a un usuario concreto incluso aunque no sea el propietario ni esté en el grupo del propietario Si no tenemos ACLs lo podemos hacer a mano (eliminando la tarea deploy:writable)
  13. 13. Deployer: Receta 2 Meetups task('cc:smarty', function () { if (askConfirmation('Are you sure to clear SMARTY cache?')) { run('cd {{deploy_path}}/cache/smarty && rm -f *'); } }); task('cc:static', function () { if (askConfirmation('Are you sure to clear STATIC cache?')) { run('cd {{deploy_path}}/cache/static && rm -f *'); } }); task('cc:all', [ 'cc:smarty', 'cc:static' ]); task('upload_img', function () { if (askConfirmation('Are you sure to upload user imgs?')) { uploadEnv('user_imgs', '{{deploy_path}}/shared/user_imgs'); } });
  14. 14. Deployer: Receta 2 Meetups task('config:generate', function () { if (askConfirmation('Are you sure to generate settings.inc.php?')) { $basepath = dirname(__FILE__); $secrets = env('settings'); //**********************************************// //Load template and replace secrets / values //***********************************************// writeln('settings.php created succesfuly'); $tmpFilename = tempnam( $basepath , 'tmp_settings_' ); file_put_contents($tmpFilename, $settings); uploadEnv($tmpFilename, '{{deploy_path}}/shared/settings.php'); unlink($tmpFilename); } });
  15. 15. Deployer: Server.yml Meetups dev: host: 127.0.0.1:15022 stage: dev forward_agent: true user: deploy password: test2012 deploy_path : /home/deploy/ branch: dev settings: user_img_dir: user_imgs base_path: localhost:9080 tpl_dir: ./assets/t tpl_cache_dir: ./cache/t tpl_compile_dir: ./cache/t_c prod: host: 127.0.0.1:15022 stage: production … …
  16. 16. Deployer: Plantilla settings Meetups <?php $settings = array(); $settings['user_img_dir'] = '{{user_img_dir}}'; $settings['base_path'] = '{{base_path}}'; $settings['tpl_dir'] = '{{tpl_dir}}'; $settings['tpl_cache_dir'] = '{{tpl_cache_dir}}'; $settings['tpl_compile_dir'] = '{{tpl_compile_dir}}';
  17. 17. Demo Time Meetups
  18. 18. Otras funcionalidades Meetups ● Triggers: Podemos definir tareas que se ejecuten antes o después de otra tarea ● Tareas sólo en un entorno: Por ejemplo una tarea que solo se pueda ejecutar en dev ● Agrupación de servidores por Stage lo que permite múltiples despliegues simultáneos ● Ejecución remota: Por ejemplo lanzar composer en remoto
  19. 19. Meetups @SergioCarracedoWeb developer at OPSOU Php Developer Drupal enthusiast @SergioCarracedo echo PHP_EOF; ¿Preguntas?

×