summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-02-24 12:24:56 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-02-24 12:24:56 +0200
commit75f40d7a91e0df6f4ac4df98d789597ea861314e (patch)
tree7bec7bbf3863dce56646507178143a1d7eb534d7
parent842bfb4950d1d43de0b5e24053c93fac02051cab (diff)
parentdeaf72eeb041c3a913e6c7ad75ccb2f008e63304 (diff)
downloadgitlab-ci-75f40d7a91e0df6f4ac4df98d789597ea861314e.tar.gz
Merge pull request #381 from jvanbaarsen/to-unicorn
Move away from puma to unicorn
-rw-r--r--CHANGELOG2
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.lock10
-rw-r--r--Procfile2
-rw-r--r--config/puma.rb.example114
-rw-r--r--config/unicorn.rb.example102
-rw-r--r--doc/install/installation.md4
-rwxr-xr-xlib/support/init.d/gitlab_ci321
-rw-r--r--lib/support/init.d/gitlab_ci.default.example31
-rwxr-xr-xscript/web49
10 files changed, 438 insertions, 199 deletions
diff --git a/CHANGELOG b/CHANGELOG
index eb074e5..c23c05e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,8 @@ v4.3.0
- Update rails to 4.0.3
- Restyle project settings page
- Improve help page
+ - Replaced puma with unicorn
+ - Improved init.d script
v4.2.0
- Build duration chart
diff --git a/Gemfile b/Gemfile
index 1937366..4b26051 100644
--- a/Gemfile
+++ b/Gemfile
@@ -23,7 +23,7 @@ gem 'pg', group: :postgres
gem 'settingslogic'
# Web server
-gem "puma", "~> 2.7.1"
+gem "unicorn", "~> 4.8.2"
# Haml
gem 'haml-rails'
diff --git a/Gemfile.lock b/Gemfile.lock
index 425d5fd..e64b7b2 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -144,6 +144,7 @@ GEM
kaminari (0.15.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
+ kgio (2.9.2)
launchy (2.4.2)
addressable (~> 2.3)
letter_opener (1.1.2)
@@ -179,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)
@@ -206,6 +205,7 @@ GEM
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (10.1.1)
+ raindrops (0.12.0)
rb-fsevent (0.9.3)
rb-inotify (0.9.2)
ffi (>= 0.5.0)
@@ -290,6 +290,10 @@ GEM
uglifier (2.3.2)
execjs (>= 0.3.0)
json (>= 1.8.0)
+ unicorn (4.8.2)
+ kgio (~> 2.6)
+ rack
+ raindrops (~> 0.7)
virtus (1.0.0)
axiom-types (~> 0.0.5)
coercible (~> 0.2)
@@ -339,7 +343,6 @@ DEPENDENCIES
poltergeist
protected_attributes
pry
- puma (~> 2.7.1)
quiet_assets
rails (= 4.0.3)
rake
@@ -358,5 +361,6 @@ DEPENDENCIES
therubyracer
turbolinks
uglifier (>= 1.0.3)
+ unicorn (~> 4.8.2)
webmock
whenever
diff --git a/Procfile b/Procfile
index 184bfe7..f5149bd 100644
--- a/Procfile
+++ b/Procfile
@@ -1,2 +1,2 @@
-web: bundle exec puma -p $PORT
+web: bundle exec unicorn_rails -p $PORT
worker: bundle exec sidekiq -q runner,default
diff --git a/config/puma.rb.example b/config/puma.rb.example
deleted file mode 100644
index 7a7b96c..0000000
--- a/config/puma.rb.example
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/env puma
-
-# Start Puma with next command:
-# RAILS_ENV=production bundle exec puma -e production -C ./config/puma.rb
-
-application_path = '/home/gitlab_ci/gitlab-ci'
-
-# The directory to operate out of.
-#
-# The default is the current directory.
-#
-directory application_path
-
-# Set the environment in which the rack's app will run.
-#
-# The default is “development”.
-#
-environment = :production
-
-# Daemonize the server into the background. Highly suggest that
-# this be combined with “pidfile” and “stdout_redirect”.
-#
-# The default is “false”.
-#
-daemonize true
-
-# Store the pid of the server in the file at “path”.
-#
-pidfile "#{application_path}/tmp/pids/puma.pid"
-
-# Use “path” as the file to store the server info state. This is
-# used by “pumactl” to query and control the server.
-#
-state_path "#{application_path}/tmp/pids/puma.state"
-
-# Redirect STDOUT and STDERR to files specified. The 3rd parameter
-# (“append”) specifies whether the output is appended, the default is
-# “false”.
-#
-stdout_redirect "#{application_path}/log/puma.stdout.log", "#{application_path}/log/puma.stderr.log"
-# stdout_redirect '/u/apps/lolcat/log/stdout', '/u/apps/lolcat/log/stderr', true
-
-# Disable request logging.
-#
-# The default is “false”.
-#
-# quiet
-
-# Configure “min” to be the minimum number of threads to use to answer
-# requests and “max” the maximum.
-#
-# The default is “0, 16”.
-#
-# threads 0, 16
-
-# Bind the server to “url”. “tcp://”, “unix://” and “ssl://” are the only
-# accepted protocols.
-#
-# The default is “tcp://0.0.0.0:9292”.
-#
-# bind 'tcp://0.0.0.0:9292'
-bind "unix://#{application_path}/tmp/sockets/gitlab-ci.socket"
-
-# Instead of “bind 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'” you
-# can also use the “ssl_bind” option.
-#
-# ssl_bind '127.0.0.1', '9292', { key: path_to_key, cert: path_to_cert }
-
-# Code to run before doing a restart. This code should
-# close log files, database connections, etc.
-#
-# This can be called multiple times to add code each time.
-#
-# on_restart do
-# puts 'On restart...'
-# end
-
-# Command to use to restart puma. This should be just how to
-# load puma itself (ie. 'ruby -Ilib bin/puma'), not the arguments
-# to puma, as those are the same as the original process.
-#
-# restart_command '/u/app/lolcat/bin/restart_puma'
-
-# === Cluster mode ===
-
-# How many worker processes to run.
-#
-# The default is “0”.
-#
-# workers 2
-
-# Code to run when a worker boots to setup the process before booting
-# the app.
-#
-# This can be called multiple times to add hooks.
-#
-# on_worker_boot do
-# puts 'On worker boot...'
-# end
-
-# === Puma control rack application ===
-
-# Start the puma control rack application on “url”. This application can
-# be communicated with to control the main server. Additionally, you can
-# provide an authentication token, so all requests to the control server
-# will need to include that token as a query parameter. This allows for
-# simple authentication.
-#
-# Check out https://github.com/puma/puma/blob/master/lib/puma/app/status.rb
-# to see what the app has available.
-#
-# activate_control_app 'unix:///var/run/pumactl.sock'
-# activate_control_app 'unix:///var/run/pumactl.sock', { auth_token: '12345' }
-# activate_control_app 'unix:///var/run/pumactl.sock', { no_token: true }
diff --git a/config/unicorn.rb.example b/config/unicorn.rb.example
new file mode 100644
index 0000000..20f92c9
--- /dev/null
+++ b/config/unicorn.rb.example
@@ -0,0 +1,102 @@
+# Sample verbose configuration file for Unicorn (not Rack)
+#
+# This configuration file documents many features of Unicorn
+# that may not be needed for some applications. See
+# http://unicorn.bogomips.org/examples/unicorn.conf.minimal.rb
+# for a much simpler configuration file.
+#
+# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete
+# documentation.
+
+# Use at least one worker per core if you're on a dedicated server,
+# more will usually help for _short_ waits on databases/caches.
+worker_processes 2
+
+# Since Unicorn is never exposed to outside clients, it does not need to
+# run on the standard HTTP port (80), there is no reason to start Unicorn
+# as root unless it's from system init scripts.
+# If running the master process as root and the workers as an unprivileged
+# user, do this to switch euid/egid in the workers (also chowns logs):
+# user "unprivileged_user", "unprivileged_group"
+
+# Help ensure your application will always spawn in the symlinked
+# "current" directory that Capistrano sets up.
+working_directory "/home/gitlab_ci/gitlab-ci" # available in 0.94.0+
+
+# listen on both a Unix domain socket and a TCP port,
+# we use a shorter backlog for quicker failover when busy
+listen "/home/gitlab_ci/gitlab-ci/tmp/sockets/gitlab-ci.socket", :backlog => 64
+listen "127.0.0.1:8080", :tcp_nopush => true
+
+# nuke workers after 30 seconds instead of 60 seconds (the default)
+timeout 30
+
+# feel free to point this anywhere accessible on the filesystem
+pid "/home/gitlab_ci/gitlab-ci/tmp/pids/unicorn.pid"
+
+# By default, the Unicorn logger will write to stderr.
+# Additionally, some applications/frameworks log to stderr or stdout,
+# so prevent them from going to /dev/null when daemonized here:
+stderr_path "/home/gitlab_ci/gitlab-ci/log/unicorn.stderr.log"
+stdout_path "/home/gitlab_ci/gitlab-ci/log/unicorn.stdout.log"
+
+# combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings
+# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
+preload_app true
+GC.respond_to?(:copy_on_write_friendly=) and
+ GC.copy_on_write_friendly = true
+
+# Enable this flag to have unicorn test client connections by writing the
+# beginning of the HTTP headers before calling the application. This
+# prevents calling the application for connections that have disconnected
+# while queued. This is only guaranteed to detect clients on the same
+# host unicorn runs on, and unlikely to detect disconnects even on a
+# fast LAN.
+check_client_connection false
+
+before_fork do |server, worker|
+ # the following is highly recomended for Rails + "preload_app true"
+ # as there's no need for the master process to hold a connection
+ defined?(ActiveRecord::Base) and
+ ActiveRecord::Base.connection.disconnect!
+
+ # The following is only recommended for memory/DB-constrained
+ # installations. It is not needed if your system can house
+ # twice as many worker_processes as you have configured.
+ #
+ # This allows a new master process to incrementally
+ # phase out the old master process with SIGTTOU to avoid a
+ # thundering herd (especially in the "preload_app false" case)
+ # when doing a transparent upgrade. The last worker spawned
+ # will then kill off the old master process with a SIGQUIT.
+ old_pid = "#{server.config[:pid]}.oldbin"
+ if old_pid != server.pid
+ begin
+ sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
+ Process.kill(sig, File.read(old_pid).to_i)
+ rescue Errno::ENOENT, Errno::ESRCH
+ end
+ end
+ #
+ # Throttle the master from forking too quickly by sleeping. Due
+ # to the implementation of standard Unix signal handlers, this
+ # helps (but does not completely) prevent identical, repeated signals
+ # from being lost when the receiving process is busy.
+ # sleep 1
+end
+
+after_fork do |server, worker|
+ # per-process listener ports for debugging/admin/migrations
+ # addr = "127.0.0.1:#{9293 + worker.nr}"
+ # server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true)
+
+ # the following is *required* for Rails + "preload_app true",
+ defined?(ActiveRecord::Base) and
+ ActiveRecord::Base.establish_connection
+
+ # if preload_app is true, then you may also want to check and
+ # restart any other shared sockets/descriptors such as Memcached,
+ # and Redis. TokyoCabinet file handles are safe to reuse
+ # between any number of forked children (assuming your kernel
+ # correctly implements pread()/pwrite() system calls)
+end
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 9ee62b7..4691f11 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -105,8 +105,8 @@ You can use either MySQL or PostgreSQL.
sudo -u gitlab_ci -H editor config/application.yml
# Edit web server settings
- sudo -u gitlab_ci -H cp config/puma.rb.example config/puma.rb
- sudo -u gitlab_ci -H editor config/puma.rb
+ sudo -u gitlab_ci -H cp config/unicorn.rb.example config/unicorn.rb
+ sudo -u gitlab_ci -H editor config/unicorn.rb
# Create socket and pid directories
sudo -u gitlab_ci -H mkdir -p tmp/sockets/
diff --git a/lib/support/init.d/gitlab_ci b/lib/support/init.d/gitlab_ci
index a1e169e..7a959e2 100755
--- a/lib/support/init.d/gitlab_ci
+++ b/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
diff --git a/lib/support/init.d/gitlab_ci.default.example b/lib/support/init.d/gitlab_ci.default.example
new file mode 100644
index 0000000..fc74fce
--- /dev/null
+++ b/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"
diff --git a/script/web b/script/web
new file mode 100755
index 0000000..5464ed0
--- /dev/null
+++ b/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