Until recently, we have been using a virtual machine as our git server. The computer that hosted this was a big, noisy, ancient computer that ran XenServer and sat in a server rack.

We have been on the move recently and will be in temporary locations until we move to our permanent location in Q3 '14. This led us to cut down on the number of computers we depend on, especially our servers. We had to figure out a way to keep our dev loop going without sacrificing work space environment.

It was then that Umar started hacking on GitLab to get it working for us internally. We had discussed this idea in a few meetings before, but for various reasons, they were not acted upon. The office move came as a blessing in disguise. Umar used one of our old Dell laptops that was just gathering dust. We ordered new DDR2 (yes, DDR2) RAM for it and installed Ubuntu. Soon, we were ready to go.

It has been about 3 weeks since we have been using GitLab, and it has been nothing but great. Here few of the benefits of deploying GitLab:
<ul>
	<li><strong>Accounts</strong>: Each user has their own account and can manage SSH Keys. Previously we had to semi-automatically distribute keys throughout our build setup.</li>
	<li><strong>Automatic Email Updates</strong>: Using native git on a server, we had no auto-updates to really know what everyone was working on. Unless we checkout a branch and look at the logs, we would have no idea about the development going except for asking the person who is working on it. Also, the dashboard shows updates and activities to all the branches and repos that you are participating in or have marked as watch.</li>
	<li><strong>Groups and Owners</strong>: In our dev loop, we have various things going on. From adding new features to fixing existing bugs and adding unit tests, benchmarks and examples. This has led to most people "owning" a branch of ArrayFire. GitLab has allowed us to restrict push access to these branches. Only the Owners are allowed to push and anyone else needs so send out a "Merge Request" (similar to a pull request on GitHub). This has allowed us to restrict access to our main development branch. Any work now needs a new branch followed by a merge request. I had been one of the persons who worked directly on the devel branch. That being said, I am so much more happier now that my access to it restricted. This has made me work on new branches more often and not send out silly commits to the development branch.</li>
	<li><strong>Merge Requests</strong>: As soon as new code is open to be merged, we send out a merge request to the branch owners. The owner's receive notification and can review the various commits and diffs on the browser itself. Then we review, comment and create issues as discussed below.</li>
	<li><strong>Reviews and Comments</strong>: Users can add comments to specific lines of code or in general. Comments can also include "Thumbs Up" and "Thumbs Down" icons which really help in recognizing great work (albeit, we use thumbs up a lot more than thumbs down).  Comments can also include links to external websites as well as GitLab commits which can show that a comment that needs attention has been fixed. Users can also be tagged using the @username handle which sends them an email notification. And lastly, we can add comments to comments which makes them look neatly organized.</li>
	<li><strong>Issues</strong>: One of the best parts of GitLab has been the ability to create issues. Previously, we used Jira to handle this side of our dev loop. However the serious downside of Jira was that it required manual input at most times and had no way to link with git. Jira had become such a chore that at one point we had to make it company rule to have at least 1 Jira action a day. Even that failed to get us developers to use Jira effectively. I'm not saying that Jira was bad, it most definitely wasn't. The issue with Jira was that it was just another system we had to work with. With GitLab, that extra system has been eliminated. The issue system in GitLab provides the ability to create and close issues similar to Jira. But the additional benefits are all in its ability to integrated perfectly with our git activity.</li>
	<li><strong>Stats</strong>: GitLab also creates various statistics and graphs on its own, such as number of commits, lines added and deleted. Each user gets their own chart as well. The only thing we really use this for? Bragging rights.</li>
</ul>
<span style="line-height: 1.5em;">GitLab has been so useful that it has become a pinned tab on my browser (and from most people's from what I have seen). It have been the best thing to happen to our dev loop since our automated build system on Jenkins (the appreciation of Jenkins is a whole another blog on its own).</span>

Let us know what your experiences with internal development are and the tools that you use. If you are using or have used GitLab in your development, let us know what you think of it and how it affected your productivity.