1. Introducción
A continuación se muestra cómo conectar un repositorio git con un alojamiento en Core-Admin, junto con la instalación de un webhook para disparar la descarga de código cuando se necesite empujar una actualización.
El procedimiento se centra en bitbucket.org pero debería ser sencillo generalizarlo a otros proveedores de git.
2. Preparación
-
Generar unas llaves ssh en el servidor (o en el usuario que vaya a generar los pulls). Se recomienda hacerlo a nivel servidor para simplificar:
>> ssh-keygen
…luego obtener la parte pública para enviar al usuario que tiene acceso al bitbucket (siguiente paso):
>> cat ~/.ssh/id_rsa.pub
-
Copiar la llave pública en el panel (Add keys):
- Bitbucket settings -> Account settings -> SSH keys -> Add key
-
Autorizar tráfico de salida para que git pueda conectar por ssh a las siguientes direcciones (revisar documentación por si han cambiado):
104.192.136.0/21
185.166.140.0/22
18.205.93.0/25
18.234.32.128/25
13.52.5.0/25
3. Descargar copia en el alojamiento vacío
-
Descargar copia con lo siguiente (hacer una prueba en home aspl):
>> mkdir -p /var/webs/alojamiento.com/prueba-descarga
>> cd /var/webs/alojamiento.com/prueba-descarga
>> git clone git@bitbucket.org:<repo_owner>/.git -
También se puede acceder con:
-
Si se quiere descargar copia de cierta rama ejecutar:
# listamos las ramas
>> cd git-repo
>> git branch -a# si queremos descargar directamente:
>> git clone --branch git@bitbucket.org:<repo_owner>/.git -
Una vez terminemos, podremos borrar esta prueba de descarga:
>> rm -rf /var/webs/alojamiento.com/prueba-descarga
4. Descargar copia en el alojamiento con ficheros (sobreescribiendo)
-
Para inicializar o descargar primer versión de una rama git en un alojamiento ya con ficheros, sobreescribiendo, ejecutar:
# a: initializamos git en la ruta del alojamiento:
>> cd /var/webs/alojamiento.com/html
>> git init# b: conectamos este git local a un repositorio remoto:
>> git config --global --add safe.directory /var/webs/alojamiento.com/html
>> git remote add origin git@bitbucket.org:<repo_owner>/.git# c: si sale el siguiente error es que no se ha ejecutado el -add safe.directory con la ruta correcta:
fatal: detected dubious ownership in repository at ‘/var/webs/alojamiento.com/html’
To add an exception for this directory, call:git config --global --add safe.directory /var/webs/alojamiento.com/html
# d.: nos bajamos el contenido del repositorio
>> git pull# e: …al terminar nos dirá las ramas disponibles y seleccinamos para que aplique la que nos interese:
>> git checkout -f# f: al terminar, reajustamos permisos:
>> chown -R alojamientocom:alojamientocomgroup /var/webs/alojamiento.com/html/
5. Para descargar el repositorio ya instalado
-
Una vez tenemos el repositorio descargado y conectado con un git remoto, se puede ejecutar lo siguiente para descargar:
# a: entramos en la ruta del git
>> cd /var/webs/alojamiento.com/html/# b: descargamos con:
>> git pull --ff-only# c: ajustamos permisos:
>> chown -R alojamientocom:alojamientocomgroup /var/webs/alojamiento.com/html/
6. Preparando el webhook para llamarlo y que actualice el repositorio con lo último
-
Para que a posterior nos funcione la prueba desde el navegador, nos conectamos con el usuario de la web:
>> su - usuarioweb -s /bin/bash
# a: Una vez hecho esto, vamos a la ruta /var/webs/web/html y ejecutamos:
>> git pull# b. Nos saldrá un mensaje sobre la autenticación de las llaves y le diremos que si:
>>The authenticity of host ‘xxx.org (X.X.X.X)’ can’t be established.
ECDSA key fingerprint is SHA256:FC73VB6C4OQLSCrjEayhMp9UMxS97caD/Yyi2bhW/J0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added ‘xxx.org,X.X.X.X’ (ECDSA) to the list of known hosts.
Ya está actualizado. -
Dentro del alojamiento crear un fichero con nombre aleatorio tal que: /var/webs/alojamiento.com/html/web-hook-git-CADENA-ALEATORIA.php con el siguiente contenido:
<?php echo ("Downloading latest into [" . getcwd () . "]...<br>"); $output_file = ".git-web-hook-update-" . time(); echo ("1. Branch selected: <br>"); system ("LANG=C git branch -a > $output_file 2>&1"); echo (str_replace ("\n", "<br>", file_get_contents ($output_file))); unlink ($output_file); echo ("2. Git config: <br>"); system ("LANG=C git remote show origin > $output_file 2>&1"); echo (str_replace ("\n", "<br>", file_get_contents ($output_file))); unlink ($output_file); echo ("3. Fetching...<br>"); system ("LANG=C git fetch > $output_file 2>&1"); echo (str_replace ("\n", "<br>", file_get_contents ($output_file))); unlink ($output_file); echo ("4. Pulling...<br>"); system ("LANG=C git pull --ff-only > $output_file 2>&1"); echo (str_replace ("\n", "<br>", file_get_contents ($output_file))); unlink ($output_file); echo ("Done");
-
Luego preparamos el directorio del usuario asociado a la web para que tenga las llaves ssh del servidor (ignorar este paso si ya está hecho):
# alojamientocom es el nombre del usuario que ejecuta la web
>> mkdir -p /home/alojamientocom/.ssh# copiamos llaves:
>> rsync -avz ~/.ssh/id_rsa* /home/alojamientocom/.ssh/# ajustamos permisos
>> chmod -R go-rwx /home/alojamientocom
>> chown -R alojamientocom:alojamientocomgroup /home/alojamientocom -
Ahora probar si funciona correctamente y sin errores la url:
-
Esta url es el webhook que se puede configurar en bitbucket para que este llame cada vez que haya una actualización en la rama configurada
7. Resolución de errores conocidos
-
Error: untracked working files:
-
Si aparece el siguiente error al llamar al webhook:
>> LANG=c git pull --ff-only
Updating 6c84195e…e4f6fa23
error: The following untracked working tree files would be overwritten by merge: -
Entonces editar el webhook y añadir lo siguiente antes del pull para descartar los cambios en conflicto que puedan haber:
echo ("4. Resetting untracked files...<br>"); system ("LANG=C git reset --hard pre > $output_file 2>&1"); echo (str_replace ("\n", "<br>", file_get_contents ($output_file))); unlink ($output_file);
-
NOTA IMPORTANTE: esto no se añade por defecto ya que hace que se descarten los cambios locales y puede ser un problema en algunos casos.
Si tiene dudas, cuente con nosotros para ver qué se puede hacer (si resuelven ellos el conflicto o quieren que el webhook borre los ficheros).
-