Sylius: Estrategia de Continuous Delivery (Deployer + Git)

¿Qué es el Continuous Delivery? Según Wikipedia es un enfoque de la ingeniería en el que los equipos de desarrollo producen software en ciclos cortos, asegurando que el software puede ser liberado en cualquier momento de forma confiable. Apunta a la construcción, testeo y liberación del software de forma mas rápida y mas frecuente.

En otras palabras, es desarrollar en equipo o en solitario, guardando cambios en algún control de versiones, en este caso Git y hacer deploys desde ramas específicas para los diferentes entornos de desarrollo, por ejemplo Staging y Producción.

Para esta guía utilizaremos un solo entorno de desarrollo, que será producción.

Lo primero, es crear un repositorio en Gihub, Gitlab o en donde les parezca mejor. En mi caso y para este ejercicio utilizaremos Github.

Descargamos e instalamos Sylius en nuestro equipo (local). Por aquí ya tengo un tutorial explicando como hacerlo por si necesitas leerlo, te lo dejo acá. (Instalar Sylius v1.0.x en un entorno local). Ahora entramos al directorio en donde creamos nuestra instancia y ejecutamos:

$ git init
$ git remote add origin git@github.com:USUARIO/repositorio.git
$ git add .
$ git commit -m “Initial Sylius commit”
$ git push -u origin master

Lo que hicimos, es iniciar el repositorio en nuestro local, definir cual será el repositorio en Github, agregar todo lo que contiene el dir, hacer el commit y por último empujar los cambios.

A continuación, entramos a nuestro servidor sea cual sea y crearemos una base de datos, no entraré en detalles, porque hay muchísimos ambientes diferentes y me imagino que ya debes saber como crear bases de datos en tus servidores 🙂

Imaginemos, que quedamos con lo siguientes datos:

  • Nombre: sylius
  • Usuario: sqlmaster
  • Contraseña: 123qwe

Con esta información, editamos la configuración de Sylius. Abrimos el archivo app/config/parameters.yml y editamos, lo importante es dejar nuestros datos de conexión correctos:

parameters:
    database_driver: pdo_mysql
    database_host: 127.0.0.1
    database_port: null
    database_name: sylius
    database_user: sqlmaster
    database_password: 123qwe

Ahora es momento de crear un archivo de parámetros para nuestro dev en app/config/, lo nombraremos:
parameters_dev.yml. En este archivo, dejamos los datos de nuestra base de datos local.

database_name_dev: intranet
database_user_dev: symfony
database_password_dev: 123

Para finalizar esta etapa, editamos app/config/config_dev.yml y agregamos el recurso que creamos en el paso anterior. Además, declaramos los datos de acceso de nuestra base de datos local.

- { resource: config.yml }
- { resource: parameters_dev.yml }
doctrine:
     dbal:
        dbname: "%database_name_dev%"
        user: "%database_user_dev%"
        password: "%database_password_dev%"

Ahora vamos a Deployer. Con esta herramienta, podremos hacer deploys directamente desde cualquier rama de nuestro repositorio a alguno de los ambientes que tengamos, por ejemplo producción, staging, beta etc. Para este ejemplo solo usamos producción, pero después de terminar, será mucho más sencillo que puedan hacerlo exactamente adaptado a sus necesidades.

Se puede instalar deployer de dos formas, una global, que es la que a mi me ha funcionado mejor y una es por proyecto, les dejo las dos opciones.

Globalmente:

$ curl -LO https://deployer.org/deployer.phar
$ mv deployer.phar /usr/local/bin/dep
$ chmod +x /usr/local/bin/dep

Para instalarlo dentro del proyecto:

$ composer require deployer/deployer

Una vez instalado, iniciamos deployer:

$ dep init

Les comparto unas pantallas de lo que yo utilicé (en el primer paso, seleccioné symfony 3):


 

Es turno de editar/crear el archivo ~/.hh/config y meter nuestra configuración de conexión ssh:

Host mihost
Hostname miserver.com
Port 22
User miusuariossh
IdentityFile ~/.ssh/id_rsa

Antes que movamos algo en deploy.php, crearemos un fichero llamado hosts.yml en la raíz del proyecto, esto para tener mas limpio todo y sea mas clara su lectura.

prod:
hostname: miserver.com
user: miusuariossh
port: 22
configFile: /Users/miuser/.ssh/config
identityFile: ~/.ssh/id_rsa
forwardAgent: true
multiplexing: true
stage: prod
roles:
– app
– db
deploy_path: ~/sylius

Esto nos crea un archivo en la raíz del proyecto, llamado deploy.php vamos a editarlo y dejamos algo así (Este ejemplo es el que a mi me ha funcionado, puedes jugar con el fichero y sus configuraciones). He dejado en negritas el archivo hosts.yml que creamos previo,

<?php
namespace Deployer;
require 'recipe/symfony3.php';
// Project name
set('application', 'Sylius');
//HTTP User
set('http_user', 'miusuariossh');

// Project repository
set('repository', 'git@github.com:Zilus/sylius.git');

// [Optional] Allocate tty for git clone. Default value is false.
set('git_tty', true);

// Shared files/dirs between deploys
add('shared_files', []);
add('shared_dirs', []);

// Writable dirs by web server
add('writable_dirs', []);

// Hosts
inventory('hosts.yml');

// Tasks
task('deploy:shared', function() {
$files = get('shared_files');

foreach ($files as $file)
{
upload($file, "{{deploy_path}}/release/".$file);
}
});

task('deploy:npm', function () {
run('cd {{release_path}} && npm install');
run('cd {{release_path}} && gulp');
});

task('deploy:permissions', function () {
run('cd {{release_path}} && chmod 777 -R var/cache/');
run('cd {{release_path}} && chmod 777 var/logs/');
});

task('post_install', [
'deploy:npm',
'deploy:permissions',
])->desc('Post Deploy stuff');

// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');

// Migrate database before symlink new release.

before('deploy:symlink', 'database:migrate');
after('deploy:update_code', 'deploy:shared');
before('cleanup', 'post_install');

¡Todo esta listo! Lo que falta es hacer el deploy, solo que antes de volar, debemos ejecutar primero la tarea de shared, esto para subir el archivo parameters.yml y demás al servidor.

$ dep deploy:shared prod

Ahora si, hagamos un deploy a prod (producción):

$ dep deploy prod
✈︎ Deploying master on myserver.com
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
➤ Executing task deploy:update_code
Connection to myserver.com closed.
✔ Ok
✔ Executing task deploy:clear_paths
✔ Executing task deploy:create_cache_dir
✔ Executing task deploy:shared
✔ Executing task deploy:assets
✔ Executing task deploy:vendors
✔ Executing task deploy:assets:install
✔ Executing task deploy:assetic:dump
✔ Executing task deploy:cache:clear
✔ Executing task deploy:cache:warmup
✔ Executing task deploy:writable
✔ Executing task database:migrate
✔ Executing task deploy:symlink
✔ Executing task deploy:unlock
✔ Executing task cleanup
Successfully deployed!

Solución de problemas.
Les comparto un par de problemas que tuve y como los solucioné. Es probable que a ustedes no les pase de la misma forma:

Si le da un error de allow_url_open, lo que toca hacer, es editar el php.ini en nuestro servidor y dejarlo activado:

allow_url_fopen = 1

Al hacer el deploy da error: stdin: is not a tty la solución es, entrar por ssh, y editar el .bashrc:

if [ $(expr index “$-” i) -eq 0 ]; then
return
fi

Suscribete ahora

Suscríbete y recibe información valiosa sobre UI, UX, CX y otras soluciones informáticas