Archive

Posts Tagged ‘linux’

Συνδέοντας το git με τον apache σε ubuntu server

May 11th, 2010

Καθώς μεγαλώνει η ομάδα του social whale, και ταυτόχρονα οι απαιτήσεις (βλ. διαγωνισμός vodafone), αρχίζει η ανάγκη για version control system. Έτσι αποφασίσαμε να πειραματιστούμε με το git σε έναν Ubuntu server.

Έτσι, ξεκινώντας από το 0 και με σύμμαχο το google, αρχίσαμε τα tests. Όποιο tutorial και να βρίσκαμε δεν είχε ακριβώς αυτό που θέλαμε να πετύχουμε. Πιο συγκεκριμένα θέλαμε, όταν κάνει μια αλλαγή κάποιος developer/designer και την ανεβάζει στο repository, αυτόματα να μπορεί να βλέπει την αλλαγή σε ένα dev url. Η λύση που σκεφτήκαμε ήταν να φτιάξουμε ένα client που έκανε αυτόματα sync από το repository και ταυτόχρονα να είναι το virtual host που βλέπει ο apache. Αυτό το πετύχαμε με ένα hook στο repository, ώστε σε κάθε update που δέχεται να κάνει sync τον client του apache. Ας το δούμε στην πράξη:

1. Εγκατάσταση του git στον server (ip: 192.168.0.2)
user@ubuntu_server: sudo apt-get install git-core

2. Δημιουργία ενός git share repository στον server
user@ubuntu_server: sudo mkdir /myapp.git
user@ubuntu_server: sudo chown user:group /myapp.git
user@ubuntu_server: cd /myapp.git
user@ubuntu_server: git --bare init

3. Δημιουργία ενός κλώνου του repository για την σύνδεση με τον apache
user@ubuntu_server: cd /var/www
user@ubuntu_server: git clone /myapp.git

Σε μερικές εκδόσεις του git (πχ. 1.4, 1.5) δεν επιτρέπει το clone σε empty repository οπότε πρέπει να δημιουργήσουμε ένα empty και απλά να το συνδέσουμε με το master repository.
user@ubuntu_server: cd /var/www
user@ubuntu_server: mkdir myapp
user@ubuntu_server: cd myapp
user@ubuntu_server: git init
user@ubuntu_server: git remote add origin /myapp.git
user@ubuntu_server: git config branch.master.remote origin
user@ubuntu_server: git config branch.master.merge refs/heads/master

4. Σύνδεση του VirtualHost με το clone folder στο DocumentRoot
user@ubuntu_server: sudo vi /etc/apache2/site-enabled/myapp
<VirtualHost *:80>
ServerName myapp.com
DocumentRoot /var/www/myapp
</VirtualHost>

user@ubuntu_server: cd /var/www/myapp
user@ubuntu_server: echo 'MyApp (ver 1.00)' > index.html
user@ubuntu_server: git add index.html
user@ubuntu_server: git commit -a -m 'Add index.html'
user@ubuntu_server: git push origin master

Με την git clone φτιάξαμε ένα κλώνο από το myapp git repository, με την git add προσθέσαμε ένα αρχείο, με την git commit στείλαμε την αλλαγή στο τοπικό μας repository (κάθε clone έχει και δικό του repository), και τέλος με την git push στείλαμε την αλλαγή και στο κεντρικό μας repository. Τώρα αν ανοίξουμε ένα browser και δώσουμε το url του VirtualHost θα πρέπει να εμφανιστεί το “MyApp (ver 1.00)”.

5. Στείνουμε σε ένα ubuntu desktop client το git και κατεβάζουμε (clone) το repository από τον server (desktop ip:192.168.0.3)
user@ubuntu_desktop: sudo apt-get install git-core
user@ubuntu_desktop: git clone ssh://user@192.168.0.2/myapp.git

Ετσι δημιουργήθηκε ένα folder myapp που μέσα έχει την index.html

6. Αλλάζουμε την index.html και την ανεβάζουμε στο repository στο server
user@ubuntu_desktop: echo 'MyApp (ver 2.00)' > index.html
user@ubuntu_desktop: git commit -a -m 'Modify index.html'
user@ubuntu_desktop: git push

Τώρα αν κάνουμε refresh τον browser, θα διαπιστώσουμε ότι δεν άλλαξε τίποτα. Καλά δεν θα ήταν να μας έδειχνε αυτόματα την διορθωμένη index.html; Για να γίνει αυτό θα πρέπει να πάμε πάλι πίσω στον server και συγκεκριμένα στο clone repository που βλέπει ο apache και να δώσουμε:
user@ubuntu_server: git pull

Τώρα στο refresh θα δούμε το αλλαγμένο ver την σελίδα μας.

7. Δημιουργία script για αυτόματο sync του apache από το κεντρικό repository
To git έχει hook scripts που εκτελούνται μετά η πριν από συγκεκριμένες διαδικασίες. Αυτό που θέλουμε εδώ είναι κάνουμε hook το after post.

user@ubuntu_server: cd /myapp.git/hooks
user@ubuntu_server: vi post-update
#!/bin/sh
cd /var/www/myapp
env -i git pull

user@ubuntu_server: chmod +x post-update

Τώρα πάμε πίσω στον client να το δοκιμάσουμε, επαναλαμβάνουμε το βήμα 6 απλά αντί για ver 2.0 βάζουμε 3.0. Στο refresh, η σελίδα μας έχει αλλάξει, χωρίς να δώσουμε git pull στον server, αυτό γίνεται αυτόματα με το hook.

8. Δημιουργία script για αυτόματο push με από κάθε commit
Δεν μας έφτασε αυτό, θέλαμε να αποφύγουμε και το git push στους clients γιατί επειδή είναι με ssh και μας ζητάει password συνέχεια, και όταν υπάρχουν συνεχόμενες αλλαγές (πχ σε ένα css element) είναι πολύ χρονοβόρα διαδικασία. Σκεφτήκαμε ότι θα μπορούσαμε να βάλουμε ένα hook όπου μετά από ένα commit να γίνεται αυτόματα το push. Όλα ωραία στην θεωρία άλλα όταν πας στην πράξη αρχίζουν τα προβλήματα. Το πρόβλημα είναι κάπως πρέπει να δωσεις το password. Η λύση εδώ είναι το expect command line script.

user@ubuntu_desktop: sudo apt-get install expect
user@ubuntu_desktop: cd .git/hooks
user@ubuntu_desktop: vi post-commit
#!/usr/bin/expect
spawn git push
expect "password:"
send "mypass\r"
interact

Δεν πρέπει να ξεχνάμε ότι πριν από ένα commit, push θα πρέπει να έχει προηγηθεί ένα pull.

9. Τελευταίo test
user@ubuntu_desktop: cd ../..
user@ubuntu_desktop: echo 'MyApp (ver 4.00)' > index.html
user@ubuntu_desktop: git commit -a -m 'Modify index.html'

Τώρα αν κάνουμε refresh τον browser, βλέπουμε το ver 4.00, και το έχουμε πετύχει με μόνο μια εντολή την commit.

Νομίζω ότι ένα τέτοιο σενάριο είναι πολύ καλό για δημιουργία projects με πολλούς developers/designers και μάλιστα χωρίς να είναι στον ίδιο χώρο αν ανοίξουμε το http και το ssh στον server.

server , , , ,