2011-03-25 5 views
7

Sul mio server, ho due utenti, www-data (che è utilizzato da nginx) e git. L'utente git possiede un repository che contiene il codice del mio sito Web e l'utente www-data possiede un clone di quel repository (che funge da webroot per nginx). Voglio impostare un flusso di lavoro in modo tale che il push del repository di git causi l'aggiornamento del repository www-data, aggiornando in tal modo il mio sito web.Flusso di lavoro di distribuzione del sito Web basato su Git

Qual è il modo corretto di impostare gli hook per questi repository (che prende in considerazione anche i privilegi e le autorizzazioni di questi due utenti)?

+0

È davvero una buona idea avere tutto il contenuto pubblico di proprietà dell'account utente che esegue il server? Se il server o il tuo codice sono sfruttati, l'exploit potrebbe modificare i dati persistenti, piuttosto che avere accesso a scarabocchi sulle connessioni del database ... – sarnold

+0

Quindi dovrei rendere il contenuto pubblico di proprietà di 'git' e renderlo leggibile da tutti ? Ciò semplificherebbe anche i problemi di autorizzazione in questa domanda ... – Chetan

+0

_Se_ sei contento di come soluzione, allora sì, ti risparmierebbe il fastidio di trovare un nuovo modo di passare da 'git' a' www-data 'repos. :) Preferisci avere due repository git sul server? Un'altra opzione è quella di impostare la proprietà di gruppo dei file come uno dei gruppi del server e consentire l'accesso in lettura tramite i privilegi di gruppo. – sarnold

risposta

5

Rimuovere repository proprietà www-data e seguire la soluzione su questo webpage per impostare un gancio post-ricevere nell'archivio di proprietà di git.

2

Ho finito per rendere il contenuto pubblico di proprietà dell'utente git e leggibile da tutti. Poi, ho fatto quanto segue per impostare i ganci:

Assumendo il repository è chiamato mysite:

  1. Creare un albero di lavoro indipendente che fungerà da webroot (come l'utente 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. Aggiungere un post-ricezione gancio che aggiornerà il sito e impostare autorizzazioni corrette per esso

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

    Lo script di post-ricezione:

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

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


Aggiornamento: Ecco un better solution.

Nota: le versioni precedenti di questo howto dipendevano sull'impostazione del git variabili di configurazione core.worktree nella directory di destinazione, core.bare false, e receive.denycurrentbranch da ignorare. Ma queste modifiche non sono necessarie se si utilizza GIT_WORK_TREE (che non ha funzionato quando ho scritto per la prima volta l'howto) e il repository remoto può rimanere nuda.

+0

Perché le persone continuano a trovare tutte queste brutte soluzioni su blog di persone invece che su quelle appropriate. – Arrowmaster

+1

@Arrowmaster: Grazie, più semplice è sempre meglio. – Chetan