Server Configuration για hg με Apache

Από Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ
Μετάβαση σε: πλοήγηση, αναζήτηση

Το Mercurial, ή για συντομία hg, είναι ένα distributed revision control system. Έχει σαν στόχο την απλότητα στην χρήση αλλά και ταυτόχρονα την αξιοπιστία και την απόδοση. Για να μπορούμε να συνεργαζόμαστε σε ένα project πολλοί προγραμματιστές βασισμένοι στο hg πρέπει να μπορούν να βλέπουν το repository μας και άλλοι. Αυτό το άρθρο είναι ένα HOW-TO για να ρυθμίσουμε τον apache να "μοιράζει" τα repositories του hg.


Γενικά

Έχοντας πρόσβαση στα αρχεία ενός hg repository μπορούμε πολύ απλά να δημιουργήσουμε ένα αντίγραφό του με την εντολή hg clone. Η πρόσβαση μπορεί να είναι είτε μέσω του τοπικού file system είτε μέσω του ssh πρωτοκόλλου σε έναν απομακρυσμένο υπολογιστή που πρέπει να έχουμε account. Ένας άλλος τρόπος είναι μέσω του http και του web interface του hg. Αυτό μπορεί να γίνει εύκολα και γρήγορα με την εντολή hg serve, αλλά αν θέλουμε μια σταθερή λύση είναι προτιμότερο να χρησιμοποιήσουμε το CGI script και έναν web server. Εδώ επικεντρωνόμαστε στο Apache σε περιβάλλον Debian αλλά παρόμοια διαδικασία ισχύει και σε άλλες distro με άλλους servers.

Προαπαιτούμενα

Προαπαιτούμενο είναι η ύπαρξη μιας εγκατάστασης apache2. Στο Debian πρέπει να υπάρχει τουλάχιστον το ομώνυμο πακέτο. Επίσης θα πρέπει και να υπάρχει το mercurial. Πάλι με το ομώνυμο πακέτο, έχουμε τα απαιτούμενα για την σύνδεση με τον http server. Από εδώ και πέρα όλες οι εντολές που αφορούν αρχεία συστήματος θεωρούμε ότι εκτελούνται ως root και δεν ξανα-αναφέρεται.

Δημιουργία repo

Ας υποθέσουμε ότι τα repositories που θέλουμε να κάνουμε expose βρίσκονται στο /var/hg/repos:

hg init /var/hg/repos/repo

Για να έχει πρόσβαση σε αυτά το hg μέσω apache ή/και άλλοι χρήστες θα πρέπει τα permissions να είναι χαλαρά:

chmod -R a+rwX /var/hg/repos/repo

ή (για να τα βλέπει μόνο ο apache) θα πρέπει να ανήκουν στον χρήστη του server:

chown -R www-data:www-data /var/hg/repos/repo

CGI Script

Όλη την δουλειά την κάνει ένα CGI script που στο υπάρχει στο /usr/share/doc/mercurial/examples/hgweb.cgi. Το αντιγράφουμε σε έναν φάκελο που πρέπει να έχει δικαίωμα ο apache να εκτελέσει CGI προγράμματα και φροντίζουμε να έχει τα κατάλληλα δικαιώματα για να εκτελεστεί (755):

mkdir -p /var/hg/cgi-bin
cp /usr/share/doc/mercurial/examples/hgweb.cgi /var/hg/cgi-bin/
chmod 755 /var/hg/cgi-bin/hgweb.cgi

Apache Configuration

Για να προσθέσουμε τον φάκελο /var/hg/cgi-bin στους φακέλους που «σερβίρει» ο apache προσθέτουμε το παρακάτω Directory section είτε στο /etc/apache2/httpd.conf είτε, αν έχουμε πολλά sites, στο αρχείο ρυθμίσεων του site πχ: /etc/apache2/sites-available/mysite. Με το Option ExecCGI επιτρέπουμε και την χρήση CGI εκτελέσιμων στον φάκελο αυτό.

<Directory /var/hg/cgi-bin>
	AllowOverride FileInfo AuthConfig Limit
	Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
</Directory>

Για να μην χρειάζεται να δίνουμε όλο το path μπορούμε να συντομεύσουμε το url με την χρήση ενός alias στο conf του httpd:

Alias /hg "/var/hg/cgi-bin/hgweb.cgi"

Για να ενεργοποιήσουμε (αν είναι απενεργοποιημένο) το CGI για τα αρχεία με κατάληξη .cgi προσθέτουμε την ακόλουθη γραμμή στο αρχείο ρυθμίσεων του apache: /etc/apache2/httpd.conf

AddHandler cgi-script .cgi

Για να διαβάσει τα config files του ο apache θέλει restart:

apache2ctl restart

hgweb.cgi Configuration

Τέλος, πρέπει να δηλώσουμε στο hgweb.cgi ποιο repository θέλουμε να εμφανίζει. Αυτό γίνεται τροποποιώντας το αρχείο του script hgweb.cgi και στην γραμμή:

return hgweb("/path/to/repo", "repository name")

βάλουμε τα δικά μας στοιχεία, δηλαδή:

return hgweb("/var/hg/repos/repo", "my repository")

Μετά από αυτό και αν όλα πάνε καλά θα πρέπει επισκεπτόμενοι την διεύθυνση: http://localhost/hg (ή κάποια αντίστοιχη, ανάλογα με το configuration) να μας εμφανιστεί ένα γραφικό περιβάλλον με πληροφορίες για το repository μας. Επίσης με την εντολή:

hg clone http://localhost/hg

μπορούμε να πάρουμε ένα ακριβές αντίγραφο του repository.

Πολλαπλά repositories με ένα CGI Script

Αν θέλουμε να βλέπουμε πολλά repositories από το ίδιο σημείο θα πρέπει να χρησιμοποιήσουμε το CGI script /usr/share/doc/mercurial/examples/hgwebdir.cgi αντί για το hgweb.cgi. Οι ρυθμίσεις γίνονται με τον ίδιο τρόπο μόνο που για να δηλώσουμε τα repositories που θέλουμε να εμφανίζει δεν αλλάζουμε το αρχείο αλλά προσθέτουμε ένα αρχείο hgweb.config που περιέχει τα path μέσα στα οποία είναι τα repositories που θέλουμε. Στην περίπτωσή μας το /var/hg/cgi-bin/hgweb.config είναι:

[collections]
/var/hg/repos=/var/hg/repos

Επίσης, τώρα τα διάφορα repositories εμφανίζονται στο url κάτω από το /hg σαν φάκελοι. Η αντίστοιχη με πριν εντολή για να αντιγράψουμε το repo μας είναι:

hg clone http://localhost/hg/repo

Repository Configuration

Το κάθε repository έχει της δικές του παραμέτρους που μπορεί κανείς να ρυθμίσει. Αυτό γίνεται αλλάζοντας το αρχείο .hg/hgrc για κάθε repo ξεχωριστά. Μερικές παράμετροι που σχετίζονται με το http access φαίνονται στο παρακάτω hgrc:

[web]
name=my repo
# Μπορούμε παίρνουμε τα περιεχόμενα του repo σε κάποια συμπιεσμένη μορφή
allow_archive=bz2 gz zip
# Ένα Git-like web interface
style=gitweb
contact=lala@koko.org
description=This is a simple repo
encoding=UTF-8
# Να επιτρέπετε το push στο repo μόνο από ssl
#push_ssl=false
# Να επιτρέπουμε το push μόνο από authenticated users
# το * σημαίνει από οποιονδήποτε (και non-authenticated)
#allow_push=user1 user2 ή *

Authentication

Το authentication των χρηστών γίνεται από τον apache και δεν χρειάζεται να είναι πραγματικοί χρήστες στο σύστημα. Για να επιτρέψουμε authentication προσθέτουμε στο Directory section που φτιάξαμε πριν αυτές τις γραμμές:

	AuthType Basic
	AuthName "Mercurial repository"
	AuthUserFile /var/hg/cgi-bin/.hg-auth
	Require valid-user

δημιουργούμε το αρχείο .hg-auth:

touch /var/hg/cgi-bin/.hg-auth

και για κάθε χρήστη που θέλουμε να συνδέεται εκτελούμε την εντολή:

htpasswd /var/hg/cgi-bin/.hg-auth userN

και μην ξεχνάμε ότι ο apache θέλει restart!



Links