Friday, June 5, 2009

Git on FreeBSD - Repository για τον Chania-LUG

Κάποια μέλη του Συλλόγου ζήτησαν να βάλουμε git στο server του Chania-LUG. Έχουμε ήδη εγκατεστημένο mercurial αλλά προφανώς ένα ακόμα repository δεν βλάπτει. Ξεκίνησα λοιπόν να διαβάζω το documentation, τόσο τα αρχεία READΜΕ και INSTALL που εγκαθίστανται με το git, όσο και τις online πηγές. Οι πιο βοηθητικές για μένα ήταν:

Όπως είναι λογικό, λίγο αργότερα είχα μπερδευτεί. Τι θέλω τελικά; Ενα repository που να μπορεί να γίνεται clone μέσω git protocol, να γίνεται push/pull μέσω ssh (για ελάχιστους χρήστες, γιατί ssh πρόσβαση στο server είναι πολύ περιορισμένη) και http pull/push για όλους τους υπόλοιπους. Με βάση τα παραπάνω πρέπει:

  • Να εκτελείται ο git daemon με κάποιες ρυθμίσεις (εύκολο) για git clone / pull

  • Να χρησιμοποιηθεί http ή https authentication

  • Να χρησιμοποιηθεί WebDAV για την αποστολή / λήψη δεδομένων μέσω http (σύμφωνα πάντα με τις πληροφορίες που βρήκα)


Μεταξύ http και https προτίμησα το απλό http γιατί 1)στο https το certificate θα ήταν self signed και θα γεμίζαμε χαζά warnings 2)το κενό ασφαλείας είναι πολύ μικρό, καθώς ακόμα και αν κάποιος έπαιρνε τον κωδικό με man-in-the-middle attack, το πολύ να έμπαινε σε ένα git repo. Αφήνουμε βέβαια πάντα ανοικτό το ενδεχόμενο να αλλάξουμε γνώμη στο μέλλον.

Ας δούμε λοιπόν πως γίνεται η εγκατάσταση git σε FreeBSD!


Εγκατάσταση του Port


Αυτό είναι το εύκολο κομμάτι:

# cd /usr/ports/devel/git
# make install clean


Και εδώ είναι οι δύο επιλογές που χρησιμοποιήθηκαν:

[X] GUI       Enable building of GUI tools
[X] GITWEB Install gitweb


Προφανώς δεν με ενδιαφέρουν οι επιλογές που αναφέρονται σε CVS και Perforce. Μετά από λίγη ώρα building, η βασική εγκατάσταση είναι έτοιμη. Αρχίζει το διάβασμα των αρχείων README / INSTALL από το /usr/local/share/examples/git/gitweb καθώς και των οδηγών που ανέφερα παραπάνω.

HTTP Configuration


Μετά από διάφορες δοκιμές αλλαγές και πειραματισμούς, κατέληξα στην παρακάτω VirtualHosts καταχώριση για τον apache που χρησιμοποιούμε:

<virtualhost>
ServerName git.chania-lug.gr
DocumentRoot "/usr/local/www/gitweb"
DAVLockDB "/some/place/locks/DAV.lock"
DirectoryIndex gitweb.cgi
CustomLog /some/place/logs/git.chania-lug.gr/access_log.txt combined env=!dontlog
ErrorLog /some/place/logs/git.chania-lug.gr/error_log.txt
<directory>
Options FollowSymlinks ExecCGI
AllowOverride None
Order allow,deny
Allow from all
<files>
SetHandler cgi-script
<files>
</directory>

<location /repos/test.git>
DAV on
Options +Indexes
AuthUserFile /some/other/place/htpasswd
AuthGroupFile /dev/null
AuthName "git"
AuthType Basic
Require valid-user
</location>

<location /repos/live-helper.git>
DAV on
Options +Indexes
AuthUserFile /some/other/place/htpasswd
AuthGroupFile /dev/null
AuthName "git"
AuthType Basic
Require valid-user
</location>
<virtualhost>


Με αυτό τον τρόπο το web interface εμφανίζεται στη διεύθυνση http://git.chania-lug.gr
Ναι, αλλά αυτό δεν είναι αρκετό.

Πρέπει να δημιουργηθούν τα repositories. Εδώ δείχνω τη δημιουργία του test.git. Η ίδια διαδικασία χρησιμοποιείται για καθένα:
# cd /usr/local/www/gitweb/repos
# mkdir test.git
# cd test.git
# git init --bare


H επιλογή bare ορίζει ότι δεν θα δημιουργηθεί work area για το repository.

# touch git-daemon-export-ok


Με το παραπάνω θα επιτρέπεται στον git daemon να δίνει αυτό το repository.

# git --bare update-server-info
# mv hooks/post-update.sample hooks/post-update


Επειδή θα γίνεται http push/pull, το repo θα ανήκει στο χρήστη www. Το www group θα έχει επίσης write access ώστε όσοι χρήστες χρησιμοποιούν ssh (και ανηκουν στο www group) θα μπορούν επίσης να κάνουν push.

# cd ..
# chown -R www:www test.git
# chmod -R g+w test.git


Καλά όλα αυτά, αλλά ακόμα δεν είμαστε έτοιμοι. Πρέπει να επεξεργαστούμε το αρχείο /usr/local/www/gitweb/gitweb.cgi (ή να φτιάξουμε άλλο δικό μας αρχείο ρυθμίσεων). Προτιμάμε την πρώτη λύση, μια και οι αλλαγές είναι λίγες. Ο κατάλογος των repositories (repos) βρίσκεται άλλωστε ήδη μέσα στο DocumentRoot του site. Οι αλλαγές που κάνουμε στο gitweb.cgi είναι:

our $projectroot = "/usr/local/www/gitweb/repos";
our $projects_list = "/usr/local/www/gitweb/projects.list";


Ακόμα δεν έχουμε projects.list και χρειαζόμαστε ένα όπως φαίνεται παραπάνω, με το περιεχόμενο:

test.git Manolis+Kiagias


Τέλος ξεχάσαμε να βάλουμε description στο repository. Αλλάζουμε το περιεχόμενο του αρχείου:

/usr/local/www/gitweb/repos/test.git/.git/description


με το επιθυμητό.
Πρέπει ακόμα να φτιάξουμε το αρχείο κωδικών με την httpasswd καθώς και να επιβεβαιώσουμε ότι το WebDAV και το davfs είναι ενεργοποιημένα στα modules του apache. Νομίζω θα το καταφέρετε. Εδώ κάπου τελειώνει (νομίζω) το web configuration.

Ρύθμιση του git_daemon


Σε σχέση με τα προηγούμενα, αυτό είναι παιχνιδάκι. Υπάρχει αντίστοιχο /usr/local/etc/rc.d script, και κάποιες μεταβλητές για το /etc/rc.conf που φαίνονται παρακάτω:

git_daemon_enable="YES"
git_daemon_flags="--base-path=/usr/local/www/gitweb/repos /usr/local/www/gitweb/repos"


Εξαιτίας του base-path μπορεί κάποιος να κάνει:

git clone git://git.chania-lug.gr/test.git

αντί για:
git clone git://git.chania-lug.gr/repos/test.git


To δεύτερο πάντως χρειάζεται όταν γίνεται git http-push (pull).
Μην ξεχάσετε να ανοίξετε την πόρτα 9418 TCP στο firewall (και να κάνετε προώθηση από το router σας).

Ρύθμιση του Client


Έχοντας κάνει όλα τα παραπάνω, μπορούμε να κάνουμε μερικές απλές ρυθμίσεις στο client μηχάνημα μας:

Δημιουργούμε το αρχείο ~/.netrc με τα παρακάτω περιεχόμενα:

machine git.chania-lug.gr
login yourusername
password yourpassword


και διορθώνουμε στα γρήγορα τα permissions:
chmod 600 ~/.netrc


Προαιρετικά, μπορούμε να γράψουμε και:

git-config remote.upload.url \
http://yourusername@git.chania-lug.gr/test.git/


ώστε να μη χρειάζεται συνέχεια να δίνουμε το url του server.

Μπορούμε τώρα να κάνουμε clone, μέσω πρωτοκόλλου git:

git clone git://git.chania-lug.gr/test.git test.git


και push μέσω http:

git http-push http://git.chania-lug.gr/repos/test.git master


Τι είναι αυτός ο θόρυβος; Α ναι, ο δίσκος γυρίζει σαν τρελός. Είναι πάλι τρεις το πρωί, και μου κάνει παρέα ο cron...

2 comments:

Giorgos Keramidas said...

Τι είναι αυτός ο θόρυβος; Α ναι, ο δίσκος γυρίζει σαν τρελός. Είναι πάλι τρεις το πρωί, και μου κάνει παρέα ο cron...

Χαχαχα! Όλα τα λεφτά είναι το τέλος.

Την έχεις καταβρεί με τον cron έτσι; Θα αρχίσω να σε παίρνω τηλέφωνο στις 03:01 ή να σου στέλνω sms του στυλ "periodic daily: hg-pull-repos.sh failed"

Μανώλης Κιαγιάς said...

Χεχε, ναι έχουν βγει διάφορα ανέκδοτα με τον cron.
Παράδειγμα: Στη Λάρισα που δεν είχαμε Internet λέγαμε ότι θα μας έρχονται κανονικά γράμματα στις τρεις το πρωί (με την κουκουβάγια, όπως στο Harry Potter)...