MAGALLANES deployment tool Mayo 2014 ¿Quién soy? • PHP Developer ‣ • Fulltime Nerd ‣ • en @AciliaInternet a la Dungeons & Dragons Dog owner andresmontanez.com ¿Qué es Magallanes? • Una Herramienta • 100% PHP • Para estandarizar deployments • No se apega a ningún framework • Ayudas para cualquier framework • PSR-0, PSR-1, PSR-2 (php-fig.org) Lo dice GitHub ¿Cómo surge? • Forma ordenada de publicar la aplicación • Sólo con shell script no alcanza • Usar lo que ya conocemos y tenemos • Configuración persistente • Capistrano es muy complicado y requiere ruby Instalando • Composer • "andres-montanez/magallanes": "1.0.*" User space Descargando el código de magephp.com • bin/mage install --installDir=~/magallanes System Wide bin/mage install --systemWide --installDir=/opt/magallanes ¿Cómo funciona? • Configuración local y persistente • Stages • Pre Deployment • Deployment • • Release • Post Release Post Deployment • Estrategias de Deployment • Releases • Tasks Iniciando un Proyecto mage init --name=“My app" —-email=“notify@my.app” ‣ .mage ‣ config ‣ ‣ tasks ‣ logs general.yml Creando un Entorno mage add environment --name=“production" —-enableReleases ‣ .mage ‣ config ‣ environments ‣ production.yml Ejemplo de Entorno El primer Deployment mage deploy to:production • Configuración de production.yml • Se copia el código a cada Host • Se ejecutan las Tasks en orden Ejemplo de Ejecución Stage: Pre-Deployment • Es lo primero en ejecutarse • Es opcional • Casos de uso • Actualizar código • Instalar vendors • Pre-procesos • Assets • Assetics • Compilación • etc Stage: Deployment • Se ejecuta por cada Host definido • No necesita tener Tasks definidas • Casos de uso • Deployment de código • Crear enlaces simbólicos • Realizar WarmUps de cachés Estrategias de Deployment • Rsync • • TarGz • • Es la estrategia usada cuando hay releases Disabled • • Es la estrategia usada cuando no hay releases No copia ningún archivo Git Rebase (experimental) • No se copia código, se hace rebase en el destino Ejemplo de Estrategia Stage: Post-Deployment • Se ejecuta al final del deployment • El opcional • Casos de uso • Limpiar Cachés • Habilitar alertas • Lanzar notificaciones Stage: Releases • Si están habilitados los releases… • Release • • Se realiza el cambio de symlink Post Release • Se pueden ejecutar Tasks • Caso de Uso • Purgar APC • Purgar Cachés Persistenes • WarmUp de Cachés especiales Usando Releases Pros • Mantener histórico de los deployments • Poder volver a una versión anterior de forma fácil y rápida Contras • Ocupa más espacio en el servidor • No siempre el rollback es automático • Cambios en Base de Datos • Migraciones Oops… Rollback! mage releases rollback --release=-1 to:production • Configuración de production.yml • Se cambia el symlink en cada Host • Se ejecutan las Tasks RollbackAware Tareas Incluidas • SCM (solo git) • • • Update (scm/update) Symfony 2 • Assetics Dump (symfony2/assetics-dump) • Assets Install (symfony2/assetics-dump) • Cache Clear (symfony2/cache-clear) • Cache Warmup (symfony2/cache-warmup) Magento • Clear Cache (magento/clear-cache) • Clear Full Page Cache (magento/clear-full-page-cache) Tareas Propias • Son clases PHP comunes y corrientes • Extienden de Mage\Task\AbstractTask • Deben pertenecer al namespace Task • Obliga a implementar getName() y run() • Se almacenan en el directorio .mage/tasks • Casos de uso • Operaciones de File System • Ejecución de comandos propios • Interacción con otros sistemas Ejemplo de Custom Task Resultados del Task • Retorna true • • Retorna false • • La tarea se ha ejecutado con error Lanza Mage\Task\ErrorWithMessageException • • La tarea se ha ejecutado correctamente La tarea se ha ejecutado con error y hay mensaje Lanza Mage\Task\SkipException • La tarea se ha omitido Tasks y Releases • Mage\Task\Releases\IsReleaseAware • • Mage\Task\Releases\RollbackAware • • El task sabe que está siendo ejecutado en un entorno con releases y obtiene acceso desde la raíz El task sabe que está siendo ejecutado en un rollback. Si no lo implementa se omite. Mage\Task\Releases\SkipOnOverride • El task se omite en un --releaseOverride Comandos • init, install, upgrade y add • list environments • lock to:production y unlock to:production • deploy to:production —branch=“dev1” • deploy to:production --overrideRelease • releases rollback --release=-1 to:production • releases list to:production • compile • version Mage Tips • • • • • APC • Borrar cache con cURL • Reiniciar php-fpm o Apache Shared Folder • Directorio externo a los releases • Se engancha con enlaces simbólicos Ramas • “Arrastrar” la configuración entre ramas • Asegurarse de hacer track de la rama ¿Cuando no usar Releases? • Cuando no importa tener un histórico • O no se tiene necesidad de hacer rollback Impacto del releaseOverride • Puede que en algunas aplicaciones no se reflejen cambios • No es la solución para todo Roadmap • Más Tasks • Composer • File System • Parallel Deployment • Optimizar estrategias de Deployment • Más opciones de Configuración • Tests ¡Gracias! ¿Preguntas? Más Info • Código: github.com/andres-montanez/Magallanes • Documentación: magephp.com • API: api.magephp.com/1.0 • Packagist: más de 2100 instalaciones • Social: @MagePHP • Contacto: andresmontanez.com