msjit / testcasedb

TestCaseDB - Web based test case management
MIT License
40 stars 18 forks source link

tcdb init script to run unicorn #29

Closed kirantpatil closed 10 years ago

kirantpatil commented 10 years ago

We have modified GitLab init script to run unicorn server. GitLab has included such scripts under the lib directory (https://github.com/gitlabhq/gitlabhq/tree/master/lib/support).

! /bin/sh

GITLAB CI

Maintainer: @randx

Authors: rovanion.luckey@gmail.com, @randx, @jvanbaarsen

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

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="kiran" app_root="/home/$app_user/testcasedb" 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/tcdb && . /etc/default/tcdb

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 wpid=0 fi }

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 ]; 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 [ $web_status = 0 ]; then gitlab_status=0 else

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 no parts of the service is running, bail out.

exit_if_not_running(){ check_stale_pids if [ "$web_status" != "0" ]; then echo "TestcaseDB is not running." exit fi }

Starts Unicorn and Sidekiq if they're not running.

start() { check_stale_pids

if [ "$web_status" != "0" ]; then echo -n "Starting TestcaseDB Unicorn " fi

Then check if the service is running. If it is: don't start again.

if [ "$web_status" = "0" ]; then echo "The TestcaseDB Unicorn web server already running with pid $wpid, not restarting." else

Remove old socket if it exists

rm -f "$socket_path"/tcdb.socket 2>/dev/null
# Start the web server
RAILS_ENV=$RAILS_ENV script/web 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 }

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" ]; then echo -n "Shutting down TestcaseDB 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

If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script.

while [ "$web_status" = "0" ]; do sleep 1 check_status printf "." if [ "$web_status" != "0" ]; then 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.

print_status }

Prints the status of GitLab CI and it's components.

print_status() { check_status if [ "$web_status" = "0" ]; then echo "The TestcaseDB Unicorn web server with pid $wpid is running." else printf "The TestcaseDB Unicorn web server is \033[31mnot running\033[0m.\n" fi }

Tells unicorn to reload it's config and Sidekiq to restart

reload(){ exit_if_not_running if [ "$wpid" = "0" ];then echo "The TestcaseDB Unicorn Web server is not running thus its configuration can't be reloaded." exit 1 fi printf "Reloading TestcaseDB Unicorn configuration... " RAILS_ENV=$RAILS_ENV script/web reload echo "Done."

wait_for_pids print_status }

Restarts Sidekiq and Unicorn.

restart(){ check_status if [ "$web_status" = "0" ]; then stop fi start }

Finally the input handling.

case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload|force-reload) reload ;; status) print_status exit $gitlab_status ;; *) echo "Usage: service tcdb {start|stop|restart|reload|status}" exit 1 ;; esac

exit

kirantpatil commented 10 years ago

Added a wiki page for each unicorn and nginx files.

joffems commented 10 years ago

Unicorn code was merged.