Browse files

Added the new init.d script

  • Loading branch information...
1 parent 30091a6 commit b2abce92fbed264229d44ae23b6528b3fb2f3256 @jvanbaarsen jvanbaarsen committed Feb 18, 2014
Showing with 458 additions and 82 deletions.
  1. +1 −1 Gemfile
  2. +0 −3 Gemfile.lock
  3. +243 −78 lib/support/init.d/gitlab_ci
  4. +31 −0 lib/support/init.d/gitlab_ci.default.example
  5. +134 −0 lib/support/init.d/gitlab_ci_old
  6. +49 −0 script/web
View
2 Gemfile
@@ -23,7 +23,7 @@ gem 'pg', group: :postgres
gem 'settingslogic'
# Web server
-gem "puma", "~> 2.7.1"
+# gem "puma", "~> 2.7.1"
gem "unicorn", "~> 4.8.2"
# Haml
View
3 Gemfile.lock
@@ -180,8 +180,6 @@ GEM
coderay (~> 1.0)
method_source (~> 0.8)
slop (~> 3.4)
- puma (2.7.1)
- rack (>= 1.1, < 2.0)
quiet_assets (1.0.2)
railties (>= 3.1, < 5.0)
rack (1.5.2)
@@ -345,7 +343,6 @@ DEPENDENCIES
poltergeist
protected_attributes
pry
- puma (~> 2.7.1)
quiet_assets
rails (= 4.0.3)
rake
View
321 lib/support/init.d/gitlab_ci
@@ -1,8 +1,8 @@
-#! /bin/bash
+#! /bin/sh
# GITLAB CI
# Maintainer: @randx
-# App Version: 2.2
+# Authors: rovanion.luckey@gmail.com, @randx, @jvanbaarsen
### BEGIN INIT INFO
# Provides: gitlab-ci
@@ -14,98 +14,264 @@
# Description: GitLab CI
### END INIT INFO
-APP_USER="gitlab_ci"
-APP_ROOT="/home/$APP_USER/gitlab-ci"
-DAEMON_OPTS="-C $APP_ROOT/config/puma.rb -e production"
-SOCKET_PATH="$APP_ROOT/tmp/sockets"
-SOCKET_FILE="$SOCKET_PATH/gitlab-ci.socket"
-PID_PATH="$APP_ROOT/tmp/pids"
-WEB_SERVER_PID="$PID_PATH/puma.pid"
-SIDEKIQ_PID="$PID_PATH/sidekiq.pid"
-STOP_SIDEKIQ="RAILS_ENV=production script/background_jobs stop"
-START_SIDEKIQ="RAILS_ENV=production script/background_jobs start"
-NAME="GitLab CI"
-DESC="Gitlab CI service"
-
-check_pid(){
- if [ -f $WEB_SERVER_PID ]; then
- PID=`cat $WEB_SERVER_PID`
- SPID=`cat $SIDEKIQ_PID`
- STATUS=`ps aux | grep $PID | grep -v grep | wc -l`
+###
+# DO NOT EDIT THIS FILE!
+# This file will be overwritten on update.
+# Instead add/change your variables in /etc/default/gitlab-ci
+# An example defaults file can be found in lib/support/init.d/gitlab_ci.default.example
+###
+
+
+### Environment variables
+RAILS_ENV="production"
+
+# Script variable names should be lower-case not to conflict with
+# internal /bin/sh variables such as PATH, EDITOR or SHELL.
+app_user="gitlab_ci"
+app_root="/home/$app_user/gitlab-ci"
+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"
+
+# Read configuration variable file if it is present
+test -f /etc/default/gitlab-ci && . /etc/default/gitlab-ci
+
+# Switch to the app_user if it is not he/she who is running the script.
+if [ "$USER" != "$app_user" ]; then
+ sudo -u "$app_user" -H -i $0 "$@"; exit;
+fi
+
+# Switch to the gitlab path, exit on failure.
+if ! cd "$app_root" ; then
+ echo "Failed to cd into $app_root, exiting!"; exit 1
+fi
+
+
+### Init Script functions
+
+## Gets the pids from the files
+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
- STATUS=0
- PID=0
+ wpid=0
+ fi
+ if [ -f "$sidekiq_pid_path" ]; then
+ spid=$(cat "$sidekiq_pid_path")
+ else
+ spid=0
fi
}
-start() {
- cd $APP_ROOT
- check_pid
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
- # Program is running, exit with error code 1.
- echo "Error! $DESC is currently running!"
- exit 1
+## Called when we have started the two processes and are waiting for their pid files.
+wait_for_pids(){
+ # We are sleeping a bit here mostly because sidekiq is slow at writing it's pid
+ i=0;
+ while [ ! -f $web_server_pid_path -o ! -f $sidekiq_pid_path ]; do
+ sleep 0.1;
+ i=$((i+1))
+ if [ $((i%10)) = 0 ]; then
+ echo -n "."
+ elif [ $((i)) = 301 ]; then
+ echo "Waited 30s for the processes to write their pids, something probably went wrong."
+ exit 1;
+ fi
+ done
+ echo
+}
+
+# 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
+
+
+## Checks whether the different parts of the service are already running or not.
+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="$?"
+ else
+ web_status="-1"
+ fi
+ if [ $spid -ne 0 ]; then
+ kill -0 "$spid" 2>/dev/null
+ sidekiq_status="$?"
+ else
+ sidekiq_status="-1"
+ fi
+ if [ $web_status = 0 -a $sidekiq_status = 0 ]; then
+ gitlab_status=0
else
- if [ `whoami` = root ]; then
- ! [ -e $SOCKET_FILE ] || sudo -u $APP_USER -H bash -l -c "rm $SOCKET_FILE"
- sudo -u $APP_USER -H bash -l -c "RAILS_ENV=production bundle exec puma $DAEMON_OPTS"
- sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $START_SIDEKIQ"
- echo "$DESC started"
+ # http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
+ # code 3 means 'program is not running'
+ gitlab_status=3
+ fi
+}
+
+## 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
+ 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
+ fi
+ if [ "$spid" != "0" -a "$sidekiq_status" != "0" ]; then
+ 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
fi
}
-stop() {
- cd $APP_ROOT
- check_pid
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
- ## Program is running, stop it.
- kill -QUIT `cat $WEB_SERVER_PID`
- sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $STOP_SIDEKIQ"
- rm "$WEB_SERVER_PID" > /dev/null
- echo "$DESC stopped"
+## If no parts of the service is running, bail out.
+exit_if_not_running(){
+ check_stale_pids
+ if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then
+ echo "GitLab CI is not running."
+ exit
+ fi
+}
+
+## Starts Unicorn and Sidekiq if they're not running.
+start() {
+ check_stale_pids
+
+ if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then
+ echo -n "Starting both the GitLab CI Unicorn and Sidekiq"
+ elif [ "$web_status" != "0" ]; then
+ echo -n "Starting GitLab CI Sidekiq"
+ elif [ "$sidekiq_status" != "0" ]; then
+ echo -n "Starting GitLab CI Unicorn"
+ fi
+
+ # 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."
else
- ## Program is not running, exit with error.
- echo "Error! $DESC not started!"
- exit 1
+ # Remove old socket if it exists
+ rm -f "$socket_path"/gitlab_ci.socket 2>/dev/null
+ # Start the web server
+ RAILS_ENV=$RAILS_ENV script/web start &
+ fi
+
+ # 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"
+ else
+ RAILS_ENV=$RAILS_ENV script/background_jobs start &
fi
+
+ # Wait for the pids to be planted
+ wait_for_pids
+ # Finally check the status to tell wether or not GitLab is running
+ print_status
}
-restart() {
- cd $APP_ROOT
- check_pid
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
- echo "Restarting $DESC..."
- kill -USR2 `cat $WEB_SERVER_PID`
- sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $STOP_SIDEKIQ"
- if [ `whoami` = root ]; then
- sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $START_SIDEKIQ"
+## Asks the Unicorn and the Sidekiq if they would be so kind as to stop, if not kills them.
+stop() {
+ exit_if_not_running
+
+ if [ "$web_status" = "0" -a "$sidekiq_status" = "0" ]; then
+ echo -n "Shutting down both Unicorn and Sidekiq"
+ elif [ "$web_status" = "0" ]; then
+ echo -n "Shutting down Sidekiq"
+ elif [ "$sidekiq_status" = "0" ]; then
+ echo -n "Shutting down Unicorn"
+ fi
+
+ # If the Unicorn web server is running, tell it to stop;
+ if [ "$web_status" = "0" ]; then
+ RAILS_ENV=$RAILS_ENV script/web stop
+ fi
+ # And do the same thing for the Sidekiq.
+ if [ "$sidekiq_status" = "0" ]; then
+ RAILS_ENV=$RAILS_ENV script/background_jobs stop
+ fi
+
+ # If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script.
+ while [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; do
+ sleep 1
+ check_status
+ printf "."
+ if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then
+ printf "\n"
+ break
fi
- echo "$DESC restarted."
+ 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.
+
+ print_status
+}
+
+## Prints the status of GitLab CI and it's components.
+print_status() {
+ check_status
+ if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then
+ echo "GitLab is not running."
+ return
+ fi
+ if [ "$web_status" = "0" ]; then
+ echo "The GitLab Unicorn web server with pid $wpid is running."
else
- echo "Error, $NAME not running!"
- exit 1
+ printf "The GitLab Unicorn web server 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 its components are \033[32mup and running\033[0m.\n"
fi
}
-status() {
- cd $APP_ROOT
- check_pid
- if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
- echo "$DESC / Unicorn with PID $PID is running."
- echo "$DESC / Sidekiq with PID $SPID is running."
- else
- echo "$DESC is not running."
+## Tells unicorn to reload it's config and Sidekiq to restart
+reload(){
+ exit_if_not_running
+ if [ "$wpid" = "0" ];then
+ echo "The GitLab CI Unicorn Web server is not running thus its configuration can't be reloaded."
exit 1
fi
+ printf "Reloading GitLab CI Unicorn configuration... "
+ RAILS_ENV=$RAILS_ENV script/web reload
+ echo "Done."
+ echo "Restarting GitLab CI Sidekiq since it isn't capable of reloading its config..."
+ RAILS_ENV=$RAILS_ENV script/background_jobs restart
+
+ wait_for_pids
+ print_status
}
-## Check to see if we are running as root first.
-## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html
-if [ "$(id -u)" != "0" ]; then
- echo "This script must be run as root"
- exit 1
-fi
+## Restarts Sidekiq and Unicorn.
+restart(){
+ check_status
+ if [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; then
+ stop
+ fi
+ start
+}
+
+
+### Finally the input handling.
case "$1" in
start)
@@ -118,17 +284,16 @@ case "$1" in
restart
;;
reload|force-reload)
- echo -n "Reloading $NAME configuration: "
- kill -HUP `cat $PID`
- echo "done."
+ reload
;;
status)
- status
+ print_status
+ exit $gitlab_status
;;
*)
- echo "Usage: sudo service gitlab_ci {start|stop|restart|reload}" >&2
+ echo "Usage: service gitlab_ci {start|stop|restart|reload|status}"
exit 1
;;
esac
-exit 0
+exit
View
31 lib/support/init.d/gitlab_ci.default.example
@@ -0,0 +1,31 @@
+# Copy this lib/support/init.d/gitlab_ci.default.example file to
+# /etc/default/gitlab_ci in order for it to apply to your system.
+
+# RAILS_ENV defines the type of installation that is running.
+# Normal values are "production", "test" and "development".
+RAILS_ENV="production"
+
+# app_user defines the user that GitLab is run as.
+# The default is "git".
+app_user="git"
+
+# app_root defines the folder in which gitlab and it's components are installed.
+# The default is "/home/$app_user/gitlab-ci"
+app_root="/home/$app_user/gitlab-ci"
+
+# pid_path defines a folder in which the gitlab ci and it's components place their pids.
+# This variable is also used below to define the relevant pids for the gitlab ci components.
+# The default is "$app_root/tmp/pids"
+pid_path="$app_root/tmp/pids"
+
+# socket_path defines the folder in which gitlab ci places the sockets
+#The default is "$app_root/tmp/sockets"
+socket_path="$app_root/tmp/sockets"
+
+# web_server_pid_path defines the path in which to create the pid file fo the web_server
+# The default is "$pid_path/unicorn.pid"
+web_server_pid_path="$pid_path/unicorn.pid"
+
+# sidekiq_pid_path defines the path in which to create the pid file for sidekiq
+# The default is "$pid_path/sidekiq.pid"
+sidekiq_pid_path="$pid_path/sidekiq.pid"
View
134 lib/support/init.d/gitlab_ci_old
@@ -0,0 +1,134 @@
+#! /bin/bash
+
+# GITLAB CI
+# Maintainer: @randx
+# App Version: 2.2
+
+### BEGIN INIT INFO
+# Provides: gitlab-ci
+# 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 CI
+# Description: GitLab CI
+### END INIT INFO
+
+APP_USER="gitlab_ci"
+APP_ROOT="/home/$APP_USER/gitlab-ci"
+DAEMON_OPTS="-C $APP_ROOT/config/puma.rb -e production"
+SOCKET_PATH="$APP_ROOT/tmp/sockets"
+SOCKET_FILE="$SOCKET_PATH/gitlab-ci.socket"
+PID_PATH="$APP_ROOT/tmp/pids"
+WEB_SERVER_PID="$PID_PATH/puma.pid"
+SIDEKIQ_PID="$PID_PATH/sidekiq.pid"
+STOP_SIDEKIQ="RAILS_ENV=production script/background_jobs stop"
+START_SIDEKIQ="RAILS_ENV=production script/background_jobs start"
+NAME="GitLab CI"
+DESC="Gitlab CI service"
+
+check_pid(){
+ if [ -f $WEB_SERVER_PID ]; then
+ PID=`cat $WEB_SERVER_PID`
+ SPID=`cat $SIDEKIQ_PID`
+ STATUS=`ps aux | grep $PID | grep -v grep | wc -l`
+ else
+ STATUS=0
+ PID=0
+ fi
+}
+
+start() {
+ cd $APP_ROOT
+ check_pid
+ if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
+ # Program is running, exit with error code 1.
+ echo "Error! $DESC is currently running!"
+ exit 1
+ else
+ if [ `whoami` = root ]; then
+ ! [ -e $SOCKET_FILE ] || sudo -u $APP_USER -H bash -l -c "rm $SOCKET_FILE"
+ sudo -u $APP_USER -H bash -l -c "RAILS_ENV=production bundle exec puma $DAEMON_OPTS"
+ sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $START_SIDEKIQ"
+ echo "$DESC started"
+ fi
+ fi
+}
+
+stop() {
+ cd $APP_ROOT
+ check_pid
+ if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
+ ## Program is running, stop it.
+ kill -QUIT `cat $WEB_SERVER_PID`
+ sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $STOP_SIDEKIQ"
+ rm "$WEB_SERVER_PID" > /dev/null
+ echo "$DESC stopped"
+ else
+ ## Program is not running, exit with error.
+ echo "Error! $DESC not started!"
+ exit 1
+ fi
+}
+
+restart() {
+ cd $APP_ROOT
+ check_pid
+ if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
+ echo "Restarting $DESC..."
+ kill -USR2 `cat $WEB_SERVER_PID`
+ sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $STOP_SIDEKIQ"
+ if [ `whoami` = root ]; then
+ sudo -u $APP_USER -H bash -l -c "mkdir -p $PID_PATH && $START_SIDEKIQ"
+ fi
+ echo "$DESC restarted."
+ else
+ echo "Error, $NAME not running!"
+ exit 1
+ fi
+}
+
+status() {
+ cd $APP_ROOT
+ check_pid
+ if [ "$PID" -ne 0 -a "$STATUS" -ne 0 ]; then
+ echo "$DESC / Unicorn with PID $PID is running."
+ echo "$DESC / Sidekiq with PID $SPID is running."
+ else
+ echo "$DESC is not running."
+ exit 1
+ fi
+}
+
+## Check to see if we are running as root first.
+## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html
+if [ "$(id -u)" != "0" ]; then
+ echo "This script must be run as root"
+ exit 1
+fi
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ restart
+ ;;
+ reload|force-reload)
+ echo -n "Reloading $NAME configuration: "
+ kill -HUP `cat $PID`
+ echo "done."
+ ;;
+ status)
+ status
+ ;;
+ *)
+ echo "Usage: sudo service gitlab_ci {start|stop|restart|reload}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
View
49 script/web
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+cd $(dirname $0)/..
+app_root=$(pwd)
+
+unicorn_pidfile="$app_root/tmp/pids/unicorn.pid"
+unicorn_config="$app_root/config/unicorn.rb"
+
+function get_unicorn_pid
+{
+ local pid=$(cat $unicorn_pidfile)
+ if [ -z $pid ] ; then
+ echo "Could not find a PID in $unicorn_pidfile"
+ exit 1
+ fi
+ unicorn_pid=$pid
+}
+
+function start
+{
+ bundle exec unicorn_rails -D -c $unicorn_config -E $RAILS_ENV
+}
+
+function stop
+{
+ get_unicorn_pid
+ kill -QUIT $unicorn_pid
+}
+
+function reload
+{
+ get_unicorn_pid
+ kill -USR2 $unicorn_pid
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ reload)
+ reload
+ ;;
+ *)
+ echo "Usage: RAILS_ENV=your_env $0 {start|stop|reload}"
+ ;;
+esac

0 comments on commit b2abce9

Please sign in to comment.