Configuración GIT para deploy

Estos son los pasos que sigo para configurar un GIT en el servidor para utilizarlo como repositorio y de paso poner en producción los cambios que subo la rama raíz del proyecto.
Lo primero es crear el repositorio en el servidor, este debe estar fuera de la carpeta web:

git init --bare repositorio.git

Una vez creado podemos acceder al directorio repositorio.git y comprobar que se ha montado correctamente con el comando:

git status

Después creamos un hook para que cada vez que haya un push sobre el repositorio, compruebe la rama desde la que se ha hecho y si es la rama master haga una copia en el directorio donde este alojada la web:

nano hooks/post-receive

Y en este fichero copiamos el siguiente código:


#!/bin/bash
while read oldrev newrev refname
do
branch=`echo $refname | cut -d/ -f3`
echo "**** push de la rama $branch ****"
if [ "master" == "$branch" ]; then
GIT_WORK_TREE=/RUTA/ABSOLUTA/DE/LA/WEB git checkout -f $branch
fi
done

Por último debemos dar permisos de ejecución al nuevo hook y con esto habremos terminado la configuración del servidor:

chmod +x hooks/post-receive

Ahora toca clonar el repositorio en local para poder trabajar con el. Nos posicionamos en la carpeta donde vayamos a desarrollar el proyecto y ejecutamos:

git clone ssh://USUARIO_SSH@SERVIDOR/RUTA_ABSOLUTA_AL_FICHERO_repositorio.git ./

Nos pedirá la contraseña de nuestro usuario de ssh y listo, ya podemos trabajar normalmente.

Comandos extra que pueden ser útiles:

En el caso de querer copiar en el servidor el contenido de una rama concreta a un directorio podemos ejecutar el comando:

git archive RAMA_A_COPIAR | tar x -C /RUTA_DE_DESTINO

Otro caso habitual es trabajar con ramas de test e integración. Para crear las ramas en remoto podemos ejecutar desde local:

git push --set-upstream origin NOMBRE_RAMA

Configuraciones de Docker que suelo usar

Casi siempre he estado trabajando con VMware pero llevo ya un tiempo usando Docker que resulta bastante más rápido de montar una máquina con las versiones de software que luego tenemos en producción.

Por ahora solo los tengo para PHP y MySQL, pero estoy viendo opciones para ColdFusion y SQL Server, cuando los tenga los publicare junto con estas configuraciones en mi GitHub

Ver mis configuraciones tipo de Docker

Llamadas de ajax en ColdFusion y jQuery

Es un ejemplo muy facilito pero me ha servido sobre todo para crear componentes en cfscript que su día cuando empecé no se podía usar.
Lo primero sería tener un formulario, en este caso uno para logarse en la web.

<table>
    <tr>
        <td>Email</td>
        <td><input name="email" type="text"></td>
    </tr>
    <tr>
        <td>Contraseña</td>
        <td><input name="password" type="input"></td>
    </tr>
    <tr>
        <td colspan="2"><button id="login">Logarse</button></td>
    </tr>
</table>

Y un javascript que controle el envío del formulario:

$( document ).ready(function() {               
    $('#login').click( function(e) {
    $('#resultLogin').text('');
    $.post(
        'ajax/user.cfc', // ruta del componente
        {
            method: 'login', // método al que llamaremos
            email: $('input[name="email"]').val(),
            password: $('input[name="password"]').val()
        }
        , "json")
        .done( function(result) {                           
            // es este caso siempre entrará por aquí cuando sea un acceso valido                            
            $('#resultLogin').text(JSON.stringify(result, undefined, 2));
        })
        .fail( function(xhr, status, error) {
            // si falla alguna de las validaciones o el usuario no es válido se generará un error
            $('#resultLogin').text(error);
        });
    });
});     

Por último el componente, que tendría en este caso todos los métodos que pudieran ser llamados por Ajax sobre el usuario:

component { 
    remote any function login ( required string email, required string password ) returnFormat="JSON" {
        // validación del email
        if(!isValid('email', email)) {
            cfheader(
                statuscode = 403,
                statustext = "Invalid Email"
            );       
            return {};     
        }
        // validación de la contraseña
        if(len(password) eq 0) {
            cfheader(
                statuscode = 403,
                statustext = "Invalid Password"
            );            
            return {};
        }

        userObj = createObject('component', 'cfc.User');
        result = userObj.login(email=email, password=password);
        // el componente devuelve una estructura con status 200 si es un usuario válido
        if(result.status neq 200){
            cfheader(
                statuscode = result.status,
                statustext = "Invalid Email or Password"
            );       
            return {};
        }else{
            structDelete(result, 'status');
            return result;
        }
    }  

    // el resto de metodos...

}