GIT-BITBUCKET-CORE-ADMIN-HOSTING-001 -- Procedimiento para conectar una rama de git en bitbucket para que despliegue código en un alojamiento


#1

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

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

  2. Copiar la llave pública en el panel (Add keys):

    • Bitbucket settings -> Account settings -> SSH keys -> Add key
  3. Autorizar tráfico de salida para que git pueda conectar por ssh a las siguientes direcciones (revisar documentación por si han cambiado):

    https://support.atlassian.com/bitbucket-cloud/docs/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall/

    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

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

  2. También se puede acceder con:

    https://<repo_owner>@bitbucket.org//.git

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

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

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

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

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

  2. 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");
    
  3. 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

  4. Ahora probar si funciona correctamente y sin errores la url:

    https://alojamiento.com/web-hook-CADENA-ALEATORIA.php

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

  1. Error: untracked working files:
    1. 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:

    2. 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);
      
    3. 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).