Deployer PHP. Presentación para #PHPSevilla

Preview:

Citation preview

Despliegue de aplicaciones Symfony

con DeployerPHP

Patrocinadores

SOY ÁLEX MARTÍNHago deploys y otras #mandangas todos los días en @innnPuedes contactar conmigo en @alexdw

¿QUÉ ES UN DEPLOY?

Software deployment is all of the activities that make a software system available for use.

https://en.wikipedia.org/wiki/Software_deployment

DEPLOY === COÑAZO

Es una tarea repetitiva… y aburrida

➔ Subir ficheros

➔ Setear configuración

➔ Bajar dependencias

➔ Realizar migraciones de datos

➔ Construir assets

➔ Limpiar caché

➔ Reiniciar servidores

➔ ...

Traducido a Symfony…

➔ git pull

➔ upload parameters.yml

➔ composer install

➔ doctrine:migrations

➔ assets:install && assetic:dump

➔ cache:clear

➔ apache2 reload // nginx reload

➔ ...

¿CÓMO PODEMOS AUTOMATIZARLO?

HERRAMIENTAS

Capistrano Magallanes

DeployerPHP

HERRAMIENTAS

Capistrano Magallanes

DeployerPHP

DeployerPHP

Principales características

Rápido Modular Rollbacks Atómico

Principales características

Instalación global

wget http://deployer.org/deployer.phar

mv deployer.phar /usr/local/bin/dep

chmod +x /usr/local/bin/dep

Instalación en vendors

php composer.phar require deployer/deployer:~3.0

Configuración básica

// deploy.php

<?php

require 'recipe/symfony.php';

server('prod', 'host', 22)

->user('name')

->forwardAgent()

->stage('production')

->env('deploy_path', '/your/project/path');

set('repository', 'git@github.com:org/app.git');

dep deploy prod

|-- current → /home/www/releases/20140812131123

|-- releases

| `-- 20140812131123

| `-- 20140809150234

| `-- 20140801145678

`-- shared

Resultado

dep rollback prod

¿Algún error?

ENTREMOS EN DETALLE …

Configuraciónservidoresserver('prod_1', 'domain.com')

->user('user')

->password('pass')

->env('deploy_path', '/home/www')

->stage('production');

server('prod_2', 'domain.com')

->user('user')

->password('pass')

->env('deploy_path', '/home/www')

->stage('production');

Configuraciónservidores (tipos de conexión)

➔ Usuario y contraseña

server(...)

->user('user')

->password('pass')

Configuraciónservidores (tipos de conexión)

➔ Usuario y contraseña

server(...)

->user('user')

->password('pass')

➔ Usuario y solicitud de contraseña

server(...)

->user('user')

->password(null)

Configuraciónservidores (tipos de conexión)

➔ Usuario y contraseña

server(...)

->user('user')

->password('pass')

➔ Usuario y solicitud de contraseña

server(...)

->user('user')

->password(null)

➔ Con clave privada

server(...)

->user('name')

->identityFile();

Configuraciónservidores (tipos de conexión)

➔ Con PEM file

server('ec2', 'host.aws.amazon.com')

->user('ec2-user')

->pemFile('~/.ssh/keys.pem');

Configuraciónservidores (tipos de conexión)

➔ Con PEM file

server('ec2', 'host.aws.amazon.com')

->user('ec2-user')

->pemFile('~/.ssh/keys.pem');

➔ Con SSH config file

server(...)

->user('name')

->configFile('/path/to/file');

Configuraciónservidores (con YAML)

➔ serverList('servers.yml');

Configuraciónservidores (con YAML)

➔ serverList('servers.yml');

➔ prod:

host: domain.com

user: www

identity_file: ~

stage: production

deploy_path: /home/www/

beta:

host: beta.domain.com

user: www

password: pass

stage: beta

deploy_path: /home/www/

TareasDeployerPHP

➔ Sistema basado en tareas

TareasDeployerPHP

➔ Sistema basado en tareas

➔ Estas tareas pueden anidarse

TareasDeployerPHP

➔ Sistema basado en tareas

➔ Estas tareas pueden anidarse:

task('deploy', [

'deploy:prepare',

'deploy:update_code',

'deploy:vendors',

'deploy:symlink',

'cleanup'

]);

Creación de tareas

➔ task('my_test_task', function () {

//

})->desc('Doing my stuff')->onlyOn('test');

Creación de tareas

➔ task('my_test_task', function () {

//

})->desc('Doing my stuff')->onlyOn('test');

➔ dep my_test_task

Creación de tareas

➔ task('my_test_task', function () {

//

})->desc('Doing my stuff')->onlyOn('test');

➔ dep my_test_task

➔ dep list

Creación de Tareas (variables)

➔ Variables entorno

task('my_test_task', function () {

env('key');

env('key', 'value');

env('array.key');

});

Creación de Tareas (variables)

➔ Variables entorno

task('my_test_task', function () {

env('key');

env('key', 'value');

env('array.key');

});

➔ Variables globales

set('key', 'value');

get('key');

has('key');

Creación de Tareas (variables predefinidas)

➔ Definir repositorio

set('repository', 'git@github.com:user/project.git');

Creación de Tareas (variables predefinidas)

➔ Definir repositorio

set('repository', 'git@github.com:user/project.git');

➔ Rama repositorio

set('branch','master');

Creación de Tareas (variables predefinidas)

➔ Definir repositorio

set('repository', 'git@github.com:user/project.git');

➔ Rama repositorio

set('branch','master');

➔ Definir compartidos

set('shared_dirs', ['app/logs']);

set('shared_files', ['app/config/parameters.yml']);

Creación de Tareas (variables predefinidas)

➔ Definir repositorio

set('repository', 'git@github.com:user/project.git');

➔ Rama repositorio

set('branch','master');

➔ Definir compartidos

set('shared_dirs', ['app/logs']);

set('shared_files', ['app/config/parameters.yml']);

➔ Permisos de escritura

set('writable_dirs', ['app/cache', 'app/logs']);

set('http_user', 'user');

Creación de Tareas (variables predefinidas)

➔ Copiar directorios

set('copy_dirs', ['vendor']);

before('deploy:vendors', 'deploy:copy_dirs');

Creación de Tareas (variables predefinidas)

➔ Copiar directorios

set('copy_dirs', ['vendor']);

before('deploy:vendors', 'deploy:copy_dirs');

➔ Versiones a mantener

set('keep_releases', 5);

Creación de Tareas (variables predefinidas)

➔ Copiar directorios

set('copy_dirs', ['vendor']);

before('deploy:vendors', 'deploy:copy_dirs');

➔ Versiones a mantener

set('keep_releases', 5);

➔ Definir ruta composer

set('composer_command', '/bin/composer.phar');

Creación de Tareas (funciones)

➔ Ejecutar en servidor

run(string $command)

Creación de Tareas (funciones)

➔ Ejecutar en servidor

run(string $command)

➔ Ejecutar en local

runLocally(string $command, int $timeout = 60)

Creación de Tareas (funciones)

➔ Ejecutar en servidor

run(string $command)

➔ Ejecutar en local

runLocally(string $command, int $timeout = 60)

➔ Navegar en servidor

cd(string $path)

Creación de Tareas (funciones)

➔ Ejecutar en servidor

run(string $command)

➔ Ejecutar en local

runLocally(string $command, int $timeout = 60)

➔ Navegar en servidor

cd(string $path)

➔ Subir al servidor

upload($file, $uploadFile)

Creación de Tareas (funciones)

➔ Ejecutar en servidor

run(string $command)

➔ Ejecutar en local

runLocally(string $command, int $timeout = 60)

➔ Navegar en servidor

cd(string $path)

➔ Subir al servidor

upload($file, $uploadFile)

➔ Descargar del servidor

download($localFile, $deploymentFile);

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

<info>...</info>

<comment></comment>

<error></error>

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

<info>...</info>

<comment></comment>

<error></error>

➔ Escribir en una nueva línea

writeln($message)

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

<info>...</info>

<comment></comment>

<error></error>

➔ Escribir en una nueva línea

writeln($message)

➔ Interacción con usuarioask($message, $default)

askConfirmation($message[,$default = false])

askHiddenResponse(string $message)

Creación de Tareas (funciones)

➔ Escribir en consola

write($message)

<info>...</info>

<comment></comment>

<error></error>

➔ Escribir en una nueva línea

writeln($message)

➔ Interacción con usuarioask($message, $default)

askConfirmation($message[,$default = false])

askHiddenResponse(string $message)

set('upload_parameters',

askConfirmation('¿Subir el parameters?'));

Creación de Tareas (hooks)

➔ After

task('deploy:done', function () {

write('Deploy done!');

});

after('deploy', 'deploy:done');

Creación de Tareas (hooks)

➔ After

task('deploy:done', function () {

write('Deploy done!');

});

after('deploy', 'deploy:done');

➔ Before

task('deploy:init, function () {

write('Begin deploy!');

});

before('deploy', 'deploy:done');

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

➔ LocalPermite realizar deploys locales

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

➔ LocalPermite realizar deploys locales

➔ NewrelicNotifica a newrelic de un nuevo deploy

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

➔ LocalPermite realizar deploys locales

➔ NewrelicNotifica a newrelic de un nuevo deploy

➔ RabbitPermite mandar notificación a RabbitMQ

Tareaspredefinidas (Recipes)

➔ CacheToolPermite borrar cache APC / OPCACHE

➔ LocalPermite realizar deploys locales

➔ NewrelicNotifica a newrelic de un nuevo deploy

➔ RabbitPermite mandar notificación a RabbitMQ

➔ RsyncPermite copiar ficheros mediante Rsync

Tareaspredefinidas (Recipes)

➔ SlackPermite mandar notificación a Slack

Tareaspredefinidas (Recipes)

➔ SlackPermite mandar notificación a Slack

➔ ConfigurePermite configurar un vhost

Tareaspredefinidas (Recipes)

➔ SlackPermite mandar notificación a Slack

➔ ConfigurePermite configurar un vhost

➔ HipchatPermite mandar un mensaje a una sala de hipchat

Otrosrecipes

➔ Symfony

➔ Symfony3

➔ Laravel

➔ CakePHP

➔ Codeigniter

➔ Yii

➔ …

RecipesSymfony

➔ Definir assets

set('assets', ['web/css','web/images','web/js']);

RecipesSymfony

➔ Definir assets

set('assets', ['web/css','web/images','web/js']);

➔ Definir carpetas var y bin

set('bin_dir', 'app'); //Symfony2

set('var_dir', 'app'); // Symfony2

set('bin_dir', 'bin'); //Symfony3

set('var_dir', 'var'); // Symfony3

RecipesSymfony

➔ Definir assets

set('assets', ['web/css','web/images','web/js']);

➔ Definir carpetas var y bin

set('bin_dir', 'app'); //Symfony2

set('var_dir', 'app'); // Symfony2

set('bin_dir', 'bin'); //Symfony3

set('var_dir', 'var'); // Symfony3

➔ Compilar assets

set('dump_assets', true); //Symfony2

RecipesSymfony

➔ Variables de entorno

env('env_vars, 'SYMFONY_ENV=prod');

env('env, 'prod');

RecipesSymfony

➔ Variables de entorno

env('env_vars, 'SYMFONY_ENV=prod');

env('env, 'prod');

➔ Tarea principal

task('deploy', [ 'deploy:prepare', 'deploy:release, 'deploy:update_code', 'deploy:create_cache_dir, 'deploy:shared, 'deploy:assets, 'deploy:vendors', 'deploy:assetic:dump, 'deploy:cache:warmup, 'deploy:writable', 'deploy:symlink', 'cleanup']);

¿PREGUNTAS? ¿CERVEZAS?Puedes encontrarme en@alexdwalex@alexdw.com

Recommended