2011-03-25 7 views
7

En mi servidor, tengo dos usuarios, www-data (que es utilizado por nginx) y git. El usuario git posee un repositorio que contiene el código de mi sitio web, y el usuario www-data posee un clon de ese repositorio (que sirve como webroot para nginx). Quiero configurar un flujo de trabajo tal que presionar al repositorio git haga que el repositorio www-data se actualice, actualizando así mi sitio web.Flujo de trabajo de implementación de sitio web basado en Git

¿Cuál es la forma correcta de configurar los enganches para estos repositorios (que también toma en cuenta los privilegios y permisos de estos dos usuarios)?

+0

¿Es realmente una buena idea que todos los contenidos públicos sean propiedad de la cuenta de usuario que ejecuta el servidor? Si se explota el servidor o su código, el exploit podría modificar los datos persistentes, en lugar de solo tener acceso a garabatear en las conexiones de su base de datos ... – sarnold

+0

Entonces debería hacer que el contenido público sea propiedad de 'git' y hacerlo legible por todos ? Eso también simplificaría los problemas de permisos en esta pregunta ... – Chetan

+0

_Si_ está satisfecho con esto como una solución, entonces sí, le ahorraría la molestia de encontrar una nueva forma de enviar desde 'git' a' www-data 'repos. :) ¿Prefiere tener dos repositorios git en el servidor? Otra opción es establecer que la propiedad del grupo de los archivos sea uno de los grupos del servidor y permitir el acceso de lectura a través de privilegios de grupo. – sarnold

Respuesta

5

Retire el depósito de propiedad de www-data y siga la solución en este webpage para la creación de un gancho posterior a recibir en el repositorio de propiedad de git.

2

Terminé haciendo el contenido público propiedad del usuario git, y legible por todos. Entonces, hice lo siguiente para configurar los ganchos:

Suponiendo que el repositorio se llama mysite:

  1. crear un árbol de trabajo independiente que actuará como Webroot (como el usuario git)

    mkdir /var/www/mysite 
    cd /path/to/repository/mysite.git 
    git config core.worktree /var/www/mysite 
    git config core.bare false 
    git config receive.denycurrentbranch ignore 
    
  2. Añadir un post-recepción gancho que se actualizará el sitio web y establecer los permisos correctos para que

    touch hooks/post-receive 
    chmod +x hooks/post-receive 
    vim hooks/post-receive 
    

    El script de post-recepción:

    #!/bin/sh 
    git checkout -f 
    chmod -R o+rX /var/www/mysite 
    

Referencia:
http://www.deanoj.co.uk/programming/git/using-git-and-a-post-receive-hook-script-for-auto-deployment/


Actualización: Aquí es un better solution.

Nota: Las versiones anteriores de este COMO dependían de la configuración del GIT variables de configuración core.worktree al directorio de destino, core.bare a falso, y receive.denycurrentbranch de ignorar. Pero estos cambios no son necesarios si usa GIT_WORK_TREE (que no funcionó cuando escribí el howto por primera vez), y el repositorio remoto puede permanecer al descubierto.

+0

Ack ¿por qué la gente sigue encontrando todas estas soluciones desagradables sobre las que la gente bloguea en lugar de las adecuadas? – Arrowmaster

+1

@Arrowmaster: Gracias, más simple es siempre mejor. – Chetan

Cuestiones relacionadas