En ocasiones los clientes FTP suelen ser lentos conforme nuestras estructuras de archivos se vuelven complejas, por otra parte suele ser algo incomodo para un desarrollador estar saliendoce de entorno de lineas de comandos (CLI) para realza esta tarea.
El siguiente POST describe un mecanismo simple para realizar esta tarea utilizando, Git y una conexión SSH de un servidor 1and1 (hoy ionos).
- Se considerea que el lector cuenta con conocimientos básicos de Git, asi como del manejo del CLI en entornos *nix.
- Tambien que ya se cuenta con algún repositorio que contiene tu aplicación web, en este caso la describo como si estuviera en una carpeta con nombre
app
. - Se cuenta con una cuenta de acceso SSH para el usuario
user_1and1
, en el servidor1and1.server
. - Para referirme al folder en el servidor del htdocs usaré
/full_path/htdocs/
Para crear esto necesitamos realzar un clone local con la opción --bare
, esto sería con la siguiente instrucción:
git clone --bare app app.git
Esto hace un clone del tu repositorio app la opción --bare
crea un directorio simple(bare), esto significa que no contendrá los archivos del repositorio si no solamente los metadatos que Git requiere para trabajar, sí observamos el contenido dee /app.git
esto tendrá una estructura similar:
app.git/
|-- HEAD
|-- config
|-- description
|-- hooks
|-- info
|-- objects
|-- packed-refs
`-- refs
4 directories, 4 files
Para mayor info ver: https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-init.html
Git tiene con un mecanismo de ganchos (hooks), estos son scripts que están enganchados a diversos eventos, de tal forma que son disparados 🔫 cuando dicho evento sucede.
Para ligar un script a un evento de Git basta con crear el archivo con el nombre adecuado en la carpeta de hooks, esta carpeta generalmente ya contiene algunos ejemplos como se muestra a continuación:
app.git/hooks/
|-- applypatch-msg.sample
|-- commit-msg.sample
|-- fsmonitor-watchman.sample
|-- post-update.sample
|-- pre-applypatch.sample
|-- pre-commit.sample
|-- pre-push.sample
|-- pre-rebase.sample
|-- pre-receive.sample
|-- prepare-commit-msg.sample
`-- update.sample
0 directories, 11 files
Vemos que el sistema nos creó 11 ejemplos los cuales si les quitamos el sub-fijo .sample
y los hacemos ejecutable (chmod u+x
) estarán ligados al evento descrito por su nombre.
Lamentablemente en este caso no creó el ejemplo para el evento post-recibir por lo cual lo tenemos que crear manualmente:
touch app.git/hooks/post-receive
Respecto al contenido agregamos el siguiente código el cual está basado del siguiente ejemplo:
#!/bin/bash
WWW="/full_path/htdocs"
TRAGET="${WWW}/web-app"
GIT_DIR="${WWW}/app.git"
BRANCH="master"
while read oldrev newrev ref
do
# Revisa que el $ref sea igual al $BRANCH a observar
if [[ $ref = refs/heads/$BRANCH ]];
then
echo "Referencia recibida $ref: ";
echo "Deployando la rama ${BRANCH} En el servidor."
git --work-tree=$TRAGET --git-dir=$GIT_DIR checkout -f
else
echo "Referencia recibida $ref. No se hizo algo: ";
echo "Solo la rama ${BRANCH} puede deployar el servidor."
fi
done
Como podemos ver el script cuenta con algunas variables p.e. BRANCH
que permite definir el brazo a observar por defecto master
.
Una vez agregado el hook ya tenemos el repositorio listo (app.git
) para subirlo a nuestro servidor:
scp -rp app.git user_1and1@1and1.server:/full_path/htdocs/
Nota: Este proceso puede tardar varios minutos dependiendo del tamaño de tu proyecto.
Lo siguiente que tenemos que hacer será conectarse al servidor mediante SSH para darle los permisos de ejecución (para el usuario) al script del hook post-receive
:
# Ingresamos
ssh user_1and1@1and1.server
# Al conectarnos por defecto nos conecta en nuestra carpeta htdocs
# Damos permisos solo al usuario (`u`) de ejecución (`+x`).
chmod u+x app.git/hooks/post-receive
Los repositorios Git pueden tener uno o varias fuentes remotas, estas son basicamente lugares en donde se enviar el código(push
) y donde se puede obtener(fetch
/pull
).
Si ya tienes el proyecto clonado previamente de algun servidor (p.e. github), lo recomendable seria agregar una nueva fuente remota p.e. 1and1:
git remote add 1and1 \
ssh://user_1and1@1and1.server:/full_path/htdocs/app.git
Puedes clonar el proyecto del servidor, en este caso la fuente remota de origen origin
sera el servidor 1and1:
git clone
ssh://user_1and1@1and1.server:/full_path/htdocs/app.git
Mayor info: https://git-scm.com/book/es/v2/Fundamentos-de-Git-Trabajar-con-Remotos
Para deployar solo es necesario de hacer un push en el remoto 1and1
sobre la rama master
:
git commit -am 'Agregando documentación sobre el deploy de 1and1'
git push -u 1and1 master