Skip to content

Instantly share code, notes, and snippets.

@fitorec
Created October 31, 2018 00:39
Show Gist options
  • Select an option

  • Save fitorec/b100aebff4df20890a53dc4e971a91c0 to your computer and use it in GitHub Desktop.

Select an option

Save fitorec/b100aebff4df20890a53dc4e971a91c0 to your computer and use it in GitHub Desktop.
Haciendo un deploy en servidor 1and1

馃憣 Haciendo un deploy en servidor 1and1

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).

Consideraciones:

  1. Se considerea que el lector cuenta con conocimientos b谩sicos de Git, asi como del manejo del CLI en entornos *nix.
  2. 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.
  3. Se cuenta con una cuenta de acceso SSH para el usuario user_1and1, en el servidor 1and1.server.
  4. Para referirme al folder en el servidor del htdocs usar茅 /full_path/htdocs/

Creando la carpeta del repositorio remoto

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

馃敆 Creando el gancho al recibir cambios.

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.

猬嗭笍 Subiendo el repositorio en el servidor:

Una vez agregado el hook ya tenemos el repositorio listo (app.git) para subirlo a nuestro servidor:

scp -rp app.git [email protected]:/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 [email protected]
# 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

馃敆 Vincular el repositorio con el servidor remoto de 1and1.

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).

Forma 1 (Agregando nuevo remoto):

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://[email protected]:/full_path/htdocs/app.git

Forma 2 (clonando el proyecto):

Puedes clonar el proyecto del servidor, en este caso la fuente remota de origen origin sera el servidor 1and1:

git clone 
ssh://[email protected]:/full_path/htdocs/app.git

Mayor info: https://git-scm.com/book/es/v2/Fundamentos-de-Git-Trabajar-con-Remotos

鈽戯笍 Deployando mis cambios en el Servidor:

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
#!/bin/bash
WWW="/path/home/user/1and1/htdocs"
TRAGET="${WWW}/e-scolar"
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment