Push to deploy med Git – den enkla vägen

Om man använder Git för versionhantering – via exempelvis Github eller Bitbucket – och sedan vill ha upp koden snabbt och enkelt på ens server för att servas till besökarna, hur gör man då?

Det finns så klart en rad olika tjänster som hjälper en att sätta upp "continuous integration" och andra automatiska flöden. Men säg att du bara driftar en enkel sajt, och vill ha möjligheten att kunna pusha upp kod när det passar dig direkt till servern? Det kikar vi närmare på här.

Jag förutsätter här att du redan har en server uppsatt med Git installerat, samt att man har SSH-åtkomst.

Börja med att installera ett Git-repositorium på en lämplig plats på servern. Jag brukar köra på en "syskonmapp" – om jag servar webbplatsen från t.ex. /var/www/mysite.com så placerar jag helt enkelt repositoriet i /var/repo/mysite.git.

cd /var
mkdir repo && cd repo
mkdir mysite.git && cd mysite.git
git init --bare

Nu finns ett Git-repo installerat på /var/repo/mysite.git, man kan redan nu lägga till repot som en remote och börja pusha kod. Men vad är det roliga med det? Just nu händer det inte så mycket.

Här kommer det fina med "Git hooks" in i bilden. Med dessa hooks kan du styra vad som sker när man interagerar med ett Git-repo. I det här fallet så använder vi post-recieve-hooken. Om filen inte återfinns under /var/repo/mysite.git/hooks/, skapa den då med cat > post-receive och fyll den med något liknande detta:

#!/bin/sh
git --work-tree=/var/www/mysite.com --git-dir=/var/repo/mysite.git checkout -f

Här talar vi helt enkelt om att när en push sker till repot, så ska den nya koden checkas ut, och uppdatera innehållet i ens "working tree", alltså /var/www/mysite.com – där webbplatsen servas ifrån.

Innan du börjar pusha kod, se till att du har korrekt rättigheter på repot, så slipper du huvudbry senare. T.ex: chmod +x -R /var/repo/mysite.git.

Din server är nu redo att publicera din kod när du pushar kod till den; enklast är att att använda t.ex. SourceTree och lägga din server som en remote (t.ex. git remote add live ssh://repouser@192.168.1.1/var/repo/mysite.git).

Lite mer avancerat, exempel med Laravel

Beroende på typ av webbplats, och eventuellt vilket ramverk man använder så brukar det finnas 2-3 olika jobb man gör varje gång man publicerar ny kod. Detta kan t.ex. vara rensa cache, uppdatera composer eller kanske köra vissa migreringar.

Alla dessa typer av jobb kan man också köra via ens post-receive-fil. I fallet med Laravel så vill vi köra composer install, php artisan migrate och även rensa cache:n.

#!/bin/sh
git --work-tree=/var/www/mysite.com --git-dir=/var/repo/mysite.git checkout -f

cd /var/www/mysite.com

echo "Processing composer"
composer install

echo "Running migrations"
php artisan migrate --force

echo "Clearing cache"
php artisan cache:clear

Varje gång du nu pushar kod till servern så kommer alla dessa jobb att köras automatiskt (skärmdump från SourceTree).

Push to deploy i SourceTree

Några frågor eller kommentarer? @olssonm är jag på Twitter