Sunday, December 11, 2011

Mercurial with Apache... on the Cloud!!

And here we go with our third tutorial explaining how to deploy and enjoy applications 'In the cloud'. This time we will take advantage of our previous post where we configured Apache to serve securely and authenticated information across the Internet and we will deploy a distributed source code management system 'Mercurial'. You can find a lot of information about what is and what is  Mercurial used for in the official web page http://mercurial.selenic.com/

A. Installing and configuring Apache with Mercurial

And here we go...

The first thing we have to do is install python (Mercurial is developed on python and mercurial packages):

sudo apt-get install python python-dev mercurial

The next step is create our repository folder, and give it the appropriated permissions  from where Apache will interact:

sudo mkdir -p /var/hg/repos
sudo  touch /var/hg/hgweb.config
sudo chown -R www-data:www-data /var/hg

Edit the file /var/hg/hgweb.config that you just created and include the following Mercurial configuration directives:

[collections]
repos/ = repos/

[web]
style = gitweb

Now we are going to copy a little script that will allow to interact apache with our Mercurial repository and again we will set the correct permissions:

cd /var/hg/
sudo cp /usr/share/doc/mercurial/examples/hgwebdir.cgi ./
sudo chown www-data:www-data ./hgwebdir.cgi
sudo chmod +x ./hgwebdir.cgi

In the following step we are going to initialize a repository called 'myRepos', this is the general way to do it, so if in the future you need to initialize another repository you just need to execute this command again by changing the name of 'myRepos' by the new name.

sudo su - www-data -c "hg init /var/hg/repos/myRepos"

Edit your new repository config file /var/hg/repos/myRepos/.hg/hgrc to include information about itself and allow push from everywhere (push is mercurial terminology)

[web]
contact = Javier
description = My first Mercurial repository
allow_push = *

# Allow the download for the last snapshot in compacted format
allow_archive = gz zip bz2 



And last but not least we have to configure Apache to start serving from our repository, this is done by adding the following section on the /etc/apache2/sites-available/default-ssl:

AddHandler cgi-script .cgi
ScriptAliasMatch      ^/hg(.*) /var/hg/hgwebdir.cgi$1
<Directory "/var/hg">
  Options FollowSymLinks +ExecCGI
  AllowOverride All
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "Password Required"
  AuthUserFile /etc/apache2/passwd/passwords
  Require valid-user
</Directory>


 You can place it right after the <Directory /var/www/> section so your config file will looks like:

...
<Directory /var/www/>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride None
 Order allow,deny
 allow from all
 AuthType Basic
 AuthName "Password Required"
 AuthUserFile /etc/apache2/passwd/passwords
 Require valid-user
</Directory>
AddHandler cgi-script .cgi
ScriptAliasMatch      ^/hg(.*) /var/hg/hgwebdir.cgi$1
<Directory "/var/hg">
  Options FollowSymLinks +ExecCGI
  AllowOverride All
  Order allow,deny
  Allow from all
  AuthType Basic
  AuthName "Password Required"
  AuthUserFile /etc/apache2/passwd/passwords
  Require valid-user
</Directory>
...

Restart apache:

sudo apache2ctl restart


And that's all!! You can now access to your repository via web:



B. Using mercurial from our local machine

First of all you will need to install Mercurial in your local machine:

sudo apt-get install mercurial mercurial-common


Now that we have created a remote repository, we can clone it locally an perform our changes:

(From your local pc)

mkdir ~/MercurialRepositories

cd ~/MercurialRepositories

hg clone https://ec2-46-137-60-179.eu-west-1.compute.amazonaws.com/hg/myRepos/

You will receive a set of messages as following:

warning: ec2-46-137-60-179.eu-west-1.compute.amazonaws.com certificate with fingerprint 6a:11:f3:d4:be:ed:54:f3:d3:78:ca:6b:03:58:55:b0:3b:25:44:58 not verified (check hostfingerprints or web.cacerts config setting)
http authorization required
realm: Password Required
user: javier
password:
warning: ec2-46-137-60-179.eu-west-1.compute.amazonaws.com certificate with fingerprint 6a:11:f3:d4:be:ed:54:f3:d3:78:ca:6b:03:58:55:b0:3b:25:44:58 not verified (check hostfingerprints or web.cacerts config setting)
destination directory: myRepos
warning: ec2-46-137-60-179.eu-west-1.compute.amazonaws.com certificate with fingerprint 6a:11:f3:d4:be:ed:54:f3:d3:78:ca:6b:03:58:55:b0:3b:25:44:58 not verified (check hostfingerprints or web.cacerts config setting)
no changes found
updating to branch default
resolving manifests
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

If you want to avoid all these annoying warnings just edit  the file ~/MercurialRepositories/myRepos/.hg/hgrc

And add the following lines:

[hostfingerprints]
ec2-46-137-60-179.eu-west-1.compute.amazonaws.com = 6a:11:f3:d4:be:ed:54:f3:d3:78:ca:6b:03:58:55:b0:3b:25:44:58

Where the value of the fingerprint is the one displayed on the warning

Resources


APENDIX

A. Some useful commands on mercurial:


hg sum
Shows state of the working directory (include info of the repository).

--remote (shows if there are incomings)

hg st
Shows differences of the working directory with the current working repository.

hg resolve -m <file>
Mark file as resolved (we have to make a commit afterwards)

hg incoming
Show if there is a new changeset coming from the central repository
-p Show the differences between files

hg outcoming
Show if there is a new changeset going to the central repository

No comments:

Post a Comment