Deployment med Git och Drupal

16
feb 2010

Git är ett av de mest populära systemen för versionshantering i Drupals community. Kollegorna använder Git för all kollaborativ utveckling och för att dela med oss av vår kod, samt som ett verktyg för enkel deployment till olika miljöer, så som utvecklings- och produktionsservrar. Just deployment är ett vanligt förekommande huvudbry för många Drupalutvecklare och därför vill vi gärna dela med oss av vår erfarenhet på området!

Kollegorna använder verktyget Unfuddle för projekthantering och bas i vår utvecklingsprocess. Tack vare den nära integrationen av kod, aktiviteter och milstolpar blir det lättare att föra projektem framåt. Det relevanta för det här blogginlägget är att Unfuddle har stöd för repositories med Git. Det är väldigt enkelt att starta ett nytt repo, antingen samtidigt som man skapar ett projekt eller i ett redan befintligt projekt. Oavsett vad du själv använder för projekthanteringssystem utgår vi från att du har ett externt, nyskapat repo att arbeta med.

Då kör vi!

För att komma igång behöver du först klona repositoryt, så att du får ett lokalt, eget repo.

$ git clone git@unfuddle.com:mittprojekt.git

Nu kan du börja jobba med koden precis som vanligt. Hur det går till är utanför ramarna för den här bloggposten, så vi går vidare. Nästa steg är att förbereda den server som vi vill deploya till.

Vi SSH:ar in och skapar de kataloger och databaser som vi behöver, precis som vanligt. Sedan installerar vi programvaran Gitosis. Det finns många bra guider på ämnet men om du kör Ubuntu är det inte svårare än att använda aptitude.

# aptitude install gitosis -y

Med Gitosis installerat behöver vi initiera det. SCP:a din publika nyckel till servern och använd den sedan för att göra Gitosis redo att användas.

# sudo -H -u git gitosis-init < id_dsa.pub

Nu kan vi börja administrera Gitosis externt. Det märks hur mycket skaparna av Gitosis gillar Git - hela administrationen görs med versionshantering! Du börjar med att klona repot gitosis-admin, från din lokala maskin.

$ git clone gitosis@example.com:gitosis-admin.git

Om allt gick som det skulle ska du nu ha en katalog vid namn 'gitosis-admin'. I den katalogen finns en fil, 'gitosis.conf' och en subkatalog, 'keydir'. Lägg till grupper och skrivbara repon i gitosis.conf, samt användare med tillhörande publika nycklar i keydir.

[gitosis]
 
[group kollegorna]
writable = gitosis-admin mittprojekt
members = tobias@laptop viktor@laptop
 
[group external]
writable = mittprojekt
members = steve@ipad

Därefter committar du och pushar upp till repot på servern. Med hjälp av Git-hookar på servern ser Gitosis till att skapa repon och användare enligt gitosis.conf. Nu har alltså vårt 'mittprojekt'-repo skapats och det är fritt fram att pusha in rad efter rad av vacker kod!

Alla repon som skapas i Gitosis är dock, av förståeliga skäl, s.k. bare repositories. Det betyder att de inte har några filer ute i klartext och det är synnerligen värdelöst för en webbplats. Vi måste alltså checka ut våra filer på servern.

Det finns två problem vi måste lösa först. Det ena är att vi som standard inte kan pusha in i ett repository som har utcheckade filer och det andra är att vi inte vill drifta vår webbplats från /srv/gitosis/repositories/mittproject.git. Vi löser detta genom att konfigurera repot. SSH:a till servern och gå till katalogen /srv/gitosis/repositories/mittprojekt.git. Därefter kör du följande:

# git config core.worktree /var/www/mittprojekt
# git config core.bare false
# git config receive.denycurrentbranch ignore
# git checkout

Nu ligger filerna på rätt plats och vi kan pusha in i vårt repository. Det enda som återstår av konfigurationen är nu att automatisera utcheckningen. Det gör vi i en post-receive-hook. Från /srv/gitosis/repositories/mittprojekt.git kör du följande kommandon.

# cp -a hooks/post-receive.sample hooks/post-receive
# echo -e '#!/bin/sh\ngit checkout -f'

Glöm inte att rätt användare måste äga rätt filer.

# chown -R gitosis:gitosis /var/www/mittprojekt
# chown -R www-data:www-data /var/www/mittprojekt/sites/default/files

Och slutligen lägger du till servern som en remote och pushar sedan äntligen in dina commits.

$ git remote add dev gitosis@example.com:mittprojekt.git
$ git push dev master

Svårare än så är det inte! ;)

Avslutning

Fördelarna med den här metoden är dels säkerheten i att du kan hålla tillgången till din server väldigt begränsad, samt att det samtidigt blir otroligt enkelt att arbeta med en utvecklingsmiljö. Du kan också säkert komma på många användbara script att lägga i post-receive-hooken.

Ett exempel som Kollegorna experimenterar med är staging-miljöer där en databasdump från produktionsservern läses in och drush sedan används för att köra alla uppdaterings-hookar, när man pushar in förändringar. På så sätt kan man enkelt simulera produktionssättning av nya funktioner.

Hör gärna av er med era egna erfarenheter kring Git och deployment i Drupal!

Kommentarer

Skriv ny kommentar

Innehållet i detta fält är privat och kommer inte att visas publikt.