gitlab 7.03 KB
Newer Older
Rovanion's avatar
Rovanion committed
1
#! /bin/sh
2 3 4

# GITLAB
# Maintainer: @randx
Rovanion's avatar
Rovanion committed
5
# Authors: rovanion.luckey@gmail.com, @randx
6
# App Version: 6.0
7 8 9 10 11 12 13 14 15 16 17

### BEGIN INIT INFO
# Provides:          gitlab
# Required-Start:    $local_fs $remote_fs $network $syslog redis-server
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: GitLab git repository management
# Description:       GitLab git repository management
### END INIT INFO

Rovanion's avatar
Rovanion committed
18 19
### Environment variables
RAILS_ENV="production"
20

Rovanion's avatar
Rovanion committed
21 22
# Script variable names should be lower-case not to conflict with internal
# /bin/sh variables such as PATH, EDITOR or SHELL.
23 24
app_root="/home/git/gitlab"
app_user="git"
Rovanion's avatar
Rovanion committed
25 26 27 28 29 30 31 32 33 34 35 36 37
unicorn_conf="$app_root/config/unicorn.rb"
pid_path="$app_root/tmp/pids"
socket_path="$app_root/tmp/sockets"
web_server_pid_path="$pid_path/unicorn.pid"
sidekiq_pid_path="$pid_path/sidekiq.pid"



### Here ends user configuration ###


# Switch to the app_user if it is not he/she who is running the script.
if [ "$USER" != "$app_user" ]; then
38
  sudo -u "$app_user" -H -i $0 "$@"; exit;
Rovanion's avatar
Rovanion committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
fi

# Switch to the gitlab path, if it fails exit with an error.
if ! cd "$app_root" ; then
 echo "Failed to cd into $app_root, exiting!";  exit 1
fi

### Init Script functions

check_pids(){
  if ! mkdir -p "$pid_path"; then
    echo "Could not create the path $pid_path needed to store the pids."
    exit 1
  fi
  # If there exists a file which should hold the value of the Unicorn pid: read it.
  if [ -f "$web_server_pid_path" ]; then
    wpid=$(cat "$web_server_pid_path")
  else
    wpid=0
  fi
  if [ -f "$sidekiq_pid_path" ]; then
    spid=$(cat "$sidekiq_pid_path")
61
  else
Rovanion's avatar
Rovanion committed
62
    spid=0
63 64 65
  fi
}

Rovanion's avatar
Rovanion committed
66 67 68 69 70
# We use the pids in so many parts of the script it makes sense to always check them.
# Only after start() is run should the pids change. Sidekiq sets it's own pid.
check_pids


Rovanion's avatar
Rovanion committed
71
# Checks whether the different parts of the service are already running or not.
Rovanion's avatar
Rovanion committed
72 73 74 75 76 77 78
check_status(){
  check_pids
  # If the web server is running kill -0 $wpid returns true, or rather 0.
  # Checks of *_status should only check for == 0 or != 0, never anything else.
  if [ $wpid -ne 0 ]; then
    kill -0 "$wpid" 2>/dev/null
    web_status="$?"
79 80
  else
    web_status="-1"
Rovanion's avatar
Rovanion committed
81 82 83 84
  fi
  if [ $spid -ne 0 ]; then
    kill -0 "$spid" 2>/dev/null
    sidekiq_status="$?"
85 86
  else
    sidekiq_status="-1"
Rovanion's avatar
Rovanion committed
87
  fi
rezigned's avatar
rezigned committed
88 89
}

Rovanion's avatar
Rovanion committed
90 91 92 93 94 95
# Check for stale pids and remove them if necessary
check_stale_pids(){
  check_status
  # If there is a pid it is something else than 0, the service is running if
  # *_status is == 0.
  if [ "$wpid" != "0" -a "$web_status" != "0" ]; then
96 97 98 99 100
    echo "Removing stale Unicorn web server pid. This is most likely caused by the web server crashing the last time it ran."
    if ! rm "$web_server_pid_path"; then
      echo "Unable to remove stale pid, exiting"
      exit 1
    fi
Rovanion's avatar
Rovanion committed
101 102
  fi
  if [ "$spid" != "0" -a "$sidekiq_status" != "0" ]; then
103 104 105 106 107
    echo "Removing stale Sidekiq web server pid. This is most likely caused by the Sidekiq crashing the last time it ran."
    if ! rm "$sidekiq_pid_path"; then
      echo "Unable to remove stale pid, exiting"
      exit 1
    fi
Rovanion's avatar
Rovanion committed
108 109 110 111
  fi
}

# If no parts of the service is running, bail out.
112
exit_if_not_running(){
Rovanion's avatar
Rovanion committed
113 114 115 116 117 118 119 120
  check_stale_pids
  if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then
    echo "GitLab is not running."
    exit
  fi
}

# Starts Unicorn and Sidekiq.
121
start() {
Rovanion's avatar
Rovanion committed
122 123 124 125 126
  check_stale_pids

  # Then check if the service is running. If it is: don't start again.
  if [ "$web_status" = "0" ]; then
    echo "The Unicorn web server already running with pid $wpid, not restarting."
127
  else
Rovanion's avatar
Rovanion committed
128 129
    echo "Starting the GitLab Unicorn web server..."
    # Remove old socket if it exists
Rovanion's avatar
Rovanion committed
130
    rm -f "$socket_path"/gitlab.socket 2>/dev/null
Rovanion's avatar
Rovanion committed
131 132
    # Start the webserver
    bundle exec unicorn_rails -D -c "$unicorn_conf" -E "$RAILS_ENV"
133 134
  fi

Rovanion's avatar
Rovanion committed
135 136 137
  # If sidekiq is already running, don't start it again.
  if [ "$sidekiq_status" = "0" ]; then
    echo "The Sidekiq job dispatcher is already running with pid $spid, not restarting"
138
  else
Rovanion's avatar
Rovanion committed
139 140 141 142
    echo "Starting the GitLab Sidekiq event dispatcher..."
    RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:start
    # We are sleeping a bit here because sidekiq is slow at writing it's pid
    sleep 2
143
  fi
Rovanion's avatar
Rovanion committed
144 145 146

  # Finally check the status to tell wether or not GitLab is running
  status
147 148
}

Rovanion's avatar
Rovanion committed
149 150
# Asks the Unicorn and the Sidekiq if they would be so kind as to stop, if not kills them.
stop() {
151
  exit_if_not_running
Rovanion's avatar
Rovanion committed
152 153 154 155 156
  # If the Unicorn web server is running, tell it to stop;
  if [ "$web_status" = "0" ]; then
    kill -QUIT "$wpid" &
    echo "Stopping the GitLab Unicorn web server..."
    stopping=true
157
  else
Rovanion's avatar
Rovanion committed
158 159 160 161 162 163 164 165 166
    echo "The Unicorn web was not running, doing nothing."
  fi
  # And do the same thing for the Sidekiq.
  if [ "$sidekiq_status" = "0" ]; then
    printf "Stopping Sidekiq job dispatcher."
    RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:stop &
    stopping=true
  else
    echo "The Sidekiq was not running, must have run out of breath."
167
  fi
Rovanion's avatar
Rovanion committed
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186


  # If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script.
  while [ "$stopping" = "true" ]; do
    sleep 1
    check_status
    if [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; then
      printf "."
    else
      printf "\n"
      break
    fi
  done
  sleep 1
  # Cleaning up unused pids
  rm "$web_server_pid_path" 2>/dev/null
  # rm "$sidekiq_pid_path" # Sidekiq seems to be cleaning up it's own pid.

  status
187 188
}

Rovanion's avatar
Rovanion committed
189
# Returns the status of GitLab and it's components
190
status() {
191 192 193 194 195
  check_status
  if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then
    echo "GitLab is not running."
    return
  fi
Rovanion's avatar
Rovanion committed
196 197
  if [ "$web_status" = "0" ]; then
      echo "The GitLab Unicorn webserver with pid $wpid is running."
198
  else
Rovanion's avatar
Rovanion committed
199 200 201 202 203 204 205 206 207
      printf "The GitLab Unicorn webserver is \033[31mnot running\033[0m.\n"
  fi
  if [ "$sidekiq_status" = "0" ]; then
      echo "The GitLab Sidekiq job dispatcher with pid $spid is running."
  else
      printf "The GitLab Sidekiq job dispatcher is \033[31mnot running\033[0m.\n"
  fi
  if [ "$web_status" = "0" -a "$sidekiq_status" = "0" ]; then
    printf "GitLab and all it's components are \033[32mup and running\033[0m.\n"
208 209 210
  fi
}

Rovanion's avatar
Rovanion committed
211
reload(){
212
  exit_if_not_running
Rovanion's avatar
Rovanion committed
213
  if [ "$wpid" = "0" ];then
214
    echo "The GitLab Unicorn Web server is not running thus its configuration can't be reloaded."
215
    exit 1
Rovanion's avatar
Rovanion committed
216
  fi
217 218
  printf "Reloading GitLab Unicorn configuration... "
  kill -USR2 "$wpid"
Rovanion's avatar
Rovanion committed
219
  echo "Done."
220
  echo "Restarting GitLab Sidekiq since it isn't capable of reloading its config..."
221
  RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:stop
222
  echo "Starting Sidekiq..."
223 224 225 226
  RAILS_ENV=$RAILS_ENV bundle exec rake sidekiq:start
  # Waiting 2 seconds for sidekiq to write it.
  sleep 2
  status
Rovanion's avatar
Rovanion committed
227 228
}

229 230 231 232 233 234 235 236
restart(){
  check_status
  if [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; then
    stop
  fi
  start
}

Rovanion's avatar
Rovanion committed
237 238

## Finally the input handling.
239 240 241 242 243 244 245 246 247

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
248
        restart
249 250
        ;;
  reload|force-reload)
Rovanion's avatar
Rovanion committed
251
	reload
252 253 254 255 256
        ;;
  status)
        status
        ;;
  *)
Rovanion's avatar
Rovanion committed
257
        echo "Usage: service gitlab {start|stop|restart|reload|status}"
258 259 260 261
        exit 1
        ;;
esac

Rovanion's avatar
Rovanion committed
262
exit