Creating Your Own Bazaar Server

By now we've all heard about the Bazaar (bzr) version control system. If you're a coder then you're well aware of what a version control system is and why it's helpful. If you code on Launchpad you're equally aware how incredibly awesome this system is.

Rather than discuss how incredible bazaar is, I'd like to explain how to set up a production level deployment for a bzr server. If you're curious what makes bazaar great, just try it out. You can use https://staging.launchpad.net/ to create branches for playing around.

To deploy a low level and basic setup you only need to run this command on your server:

sudo aptitude install openssh-server bzr

That's really all there is to it. You can now push an existing code branch to your server using the following command:

bzr push bzr+ssh://yourserver.com/~/branch

That's only a basic deployment. What I like doing is having branches where multiple people can work on the same branch. This first thing I do is create a directory that this whole thing will be based in. I like to do this on its own partition for obvious reasons. For me this always exists at /bazaar. I then use the following:

# Get into the branch directory

cd /bazaar

# Create a directory for branch content

mkdir bzr

# Make a nice short directory name to this

cd /
ln -s /bazaar/bzr

Now anyone with the right permissions (root) can push to the server using bzr push bzr+ssh://yourserver.com/bzr/branch. However, we don't want to give everyone root access. Instead of doing this, I issue the following:

# Create a generic bzr group

groupadd bzr

# Assign group to branches

chown root:bzr /bazaar/bzr

Now anyone in the bzr group can push to this. However, we're working in teams of users. The user that makes the commit will be the only one that can manage this branch. I guess it's time to learn about the "sticky bit." This little bit allows us to retain the group that owns the directory. The sticky bit doesn't seem to like retaining the owner but that becomes irrelevant because it's the groups we care about.

# Set generic permissions

chmod 770 /bazaar/bzr

# Set the sticky bit

chmod +s /bazaar/bzr

Now it's time to give a user permission to work with these branches.

usermod -a -G bzr username

You should be ready to rock now. If you create a branch and decide that only a handful of users should be able to access it, this is easy. Something could be a highly secret piece of code that is the "bread and butter" to a massive project you are undertaking.

# Create new group

groupadd bzr-special

# Set permissions on branch

chown -R root:bzr-special /bzr/branch

# Add users to the special group

usermod -a -G bzr-special username

Heck Ya! That was easy enough wasn't it? It really is once you've gone through the hassle of picking out these little things. It's actually amazingly easy if you have a guide. I wasn't able to find this guide and I hope this will help others trying to do the same thing.

What's next? I'd suggest pulling the loggerhead source and setting it up. This is a great tool for seeing revision changes. I'd like to see a way to send an email diff on branch changes but this may be too hard without created a chopped down version of Launchpad.