I’ve been hosting my Gitlab instance for some time now. Gives me the freedom of experimenting with various features and also forces me to learn a thing or two about it.

Install I currently have has been done via installation from source. Reason for that was that Omnibus package has certain things in which would break other components on that system.

So long story short, the main issue I had with it was upgrading it to latest patch release. This issue got even amplified by the fact Gitlab releases new versions quite often, so I simply had to automate it.

You can take many different approaches, but I decided to do it in bash. Full script for upgrading instance is as follows:

#!/usr/bin/env bash

# Define variables
GITLAB_CURRENT_VERSION=$(cat /home/git/gitlab/VERSION 2> /dev/null)

# Define functions
gitlab_backup() {
        cd "$GITLAB_INSTALL_DIR" || exit 1
        bundle exec rake gitlab:backup:create RAILS_ENV=production

gitlab_stop() {
        sudo systemctl stop gitlab

gitlab_start() {
        sudo systemctl start gitlab

gitlab_update() {
        cd "$GITLAB_INSTALL_DIR" || exit 1
        git fetch --all
        git checkout -- Gemfile.lock db/schema.rb locale
        git checkout "v$GITLAB_PATCH_VERSION" -b "v$GITLAB_PATCH_VERSION"

        echo -e "---\nBUNDLE INSTALL\n---"
        bundle install --without development test mysql --deployment
        echo -e "---\nBUNDLE CLEAN\n---"
        bundle clean
        echo -e "---\nYARN INSTALL\n---"
        echo -e "---\nDB MIGRATIONS\n---"
        bundle exec rake db:migrate RAILS_ENV=production
        echo -e "---\nGETTEXT PACK\n---"
        bundle exec rake gettext:pack RAILS_ENV=production
        echo -e "---\nGETTEXT PO TO JSON\n---"
        bundle exec rake gettext:po_to_json RAILS_ENV=production
        echo -e "---\nASSETS\n---"
        bundle exec rake yarn:install gitlab:assets:clean gitlab:assets:compile cache:clear RAILS_ENV=production NODE_ENV=production

        # Upgrade Gitlab Workhorse
        echo -e "---\nGITLAB WORKHORSE\n---"
        bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production

        # Upgrade Gitaly
        echo -e "---\nGITALY\n---"
        bundle exec rake "gitlab:gitaly:install[/home/git/gitaly,/home/git/repositories]" RAILS_ENV=production

        # Upgrade Gitlab Shell
        cd "$GITLAB_SHELL_INSTALL_DIR" || exit 1
        git fetch --all --tags
        git checkout "v$(</home/git/gitlab/GITLAB_SHELL_VERSION)" -b "v$(</home/git/gitlab/GITLAB_SHELL_VERSION)"
        sh -c 'if [ -x bin/compile ]; then bin/compile; fi'

gitlab_status() {
        cd "$GITLAB_INSTALL_DIR" || exit 1
        bundle exec rake gitlab:env:info RAILS_ENV=production
        bundle exec rake gitlab:check RAILS_ENV=production

# Perform variable checks and start upgrade
if [ -z "$GITLAB_PATCH_VERSION" ] ; then
        echo -e "[ERROR] Undefined desired version"
        echo -e "Usage:\n$0 GITLAB_PATCH_VERSION"
elif [ -z "$GITLAB_CURRENT_VERSION" ] ; then
        echo -e "[ERROR] Couldn't determine current Gitlab version. Exiting..."
elif [ "$GITLAB_CURRENT_VERSION" == "$GITLAB_PATCH_VERSION" ] ; then                                                                                                                                                                                                            
        echo -e "[ERROR] Gitlab is already updated to the specified patch version. Nothing to do here, exiting..."                                                                                                                                                              
        echo -e "[NOTICE] Starting upgrade process..."                                                                                                                                                                                                                          
        echo -e "\t- Current version: $GITLAB_CURRENT_VERSION"                                                                                                                                                                                                                  
        echo -e "\t- New version: $GITLAB_PATCH_VERSION"                                                                                                                                                                                                                        
        # Run all of the steps                                                                                                                                                                                                                                                  

Few requirements and assumptions:

  • Gitlab is installed under git user on the machine
  • git user has access to start|stop|status|restart the gitlab service
  • git user has access to update/install ruby gems (I use rbenv)

For permission to start|stop|status|restart the gitlab service I have following in /etc/sudoers.d/git

git ALL=NOPASSWD:/bin/systemctl restart gitlab*                                                                                                                                                                                                                                 
git ALL=NOPASSWD:/bin/systemctl start gitlab*
git ALL=NOPASSWD:/bin/systemctl status gitlab*
git ALL=NOPASSWD:/bin/systemctl stop gitlab*