如何在ubuntu 14.04.2上配置gitlab(可靠)

时间:2015-04-17 05:23:59

标签: ubuntu rvm gitlab

运行gitlab升级脚本后,依赖于ruby 2.x

我已经安装了rvm,以便在升级后运行gitlab,这取决于ruby 2.x. Ubuntu只提供ruby 1.9但gitlab服务将不再启动,因为你可以看到它使用了错误版本的ruby。我已尝试使用/home/git/.bashrc,/ etc / default / gitlab改变路径,甚至直接在init脚本中设置路径,但无论我设置什么配置,总是选择错误红宝石的版本。

root@home:~# service gitlab start
Removing stale Unicorn web server pid. This is most likely caused by the web server crashing the last time it ran.
Removing stale Sidekiq job dispatcher pid. This is most likely caused by Sidekiq crashing the last time it ran.
Starting both the GitLab Unicorn and Sidekiq/usr/lib/ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find bundler (>= 0) amongst [bundler-unload-1.0.2, executable-hooks-1.3.2, gem-wrappers-1.2.7, minitest-5.4.3, power_assert-0.2.2, rubygems-bundler-1.4.4, rvm-1.11.3.9, test-unit-3.0.8] (Gem::LoadError)
        from /usr/lib/ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
        from /usr/lib/ruby/1.9.1/rubygems.rb:1231:in `gem'
        from /usr/local/bin/bundle:22:in `<main>'
....................^C
Session terminated, terminating shell... ...terminated.

这是init脚本

#! /bin/sh

# GITLAB
# Maintainer: @randx
# Authors: rovanion.luckey@gmail.com, @randx

### 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
# chkconfig: - 85 14
### END INIT INFO


###
# DO NOT EDIT THIS FILE!
# This file will be overwritten on update.
# Instead add/change your variables in /etc/default/gitlab
# An example defaults file can be found in lib/support/init.d/gitlab.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="git"
app_root="/home/$app_user/gitlab"
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 && . /etc/default/gitlab

# Switch to the app_user if it is not he/she who is running the script.
if [ "$USER" != "$app_user" ]; then
        eval su - "$app_user" -c $(echo \")$0 "$@"$(echo \"); 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
  if [ -f "$sidekiq_pid_path" ]; then
    spid=$(cat "$sidekiq_pid_path")
  else
    spid=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 -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
    # 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 job dispatcher pid. This is most likely caused by Sidekiq crashing the last time it ran."
    if ! rm "$sidekiq_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" -a "$sidekiq_status" != "0" ]; then
    echo "GitLab is not running."
    exit
  fi
}

## Starts Unicorn and Sidekiq if they're not running.
start_gitlab() {
  check_stale_pids

  if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then
    echo -n "Starting both the GitLab Unicorn and Sidekiq"
  elif [ "$web_status" != "0" ]; then
    echo -n "Starting GitLab Unicorn"
  elif [ "$sidekiq_status" != "0" ]; then
    echo -n "Starting GitLab Sidekiq"
  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
    # Remove old socket if it exists
    rm -f "$socket_path"/gitlab.socket 2>/dev/null
    # Start the web server
    RAILS_ENV=$RAILS_ENV bin/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 bin/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
}

## Asks the Unicorn and the Sidekiq if they would be so kind as to stop, if not kills them.
stop_gitlab() {
  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 Unicorn"
  elif [ "$sidekiq_status" = "0" ]; then
    echo -n "Shutting down Sidekiq"
  fi

  # If the Unicorn web server is running, tell it to stop;
  if [ "$web_status" = "0" ]; then
     RAILS_ENV=$RAILS_ENV bin/web stop
  fi
  # And do the same thing for the Sidekiq.
  if [ "$sidekiq_status" = "0" ]; then
    RAILS_ENV=$RAILS_ENV bin/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
  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 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
      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
}

## Tells unicorn to reload it's config and Sidekiq to restart
reload_gitlab(){
  exit_if_not_running
  if [ "$wpid" = "0" ];then
    echo "The GitLab Unicorn Web server is not running thus its configuration can't be reloaded."
    exit 1
  fi
  printf "Reloading GitLab Unicorn configuration... "
  RAILS_ENV=$RAILS_ENV bin/web reload
  echo "Done."
  echo "Restarting GitLab Sidekiq since it isn't capable of reloading its config..."
  RAILS_ENV=$RAILS_ENV bin/background_jobs restart

  wait_for_pids
  print_status
}

## Restarts Sidekiq and Unicorn.
restart_gitlab(){
  check_status
  if [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; then
    stop_gitlab
  fi
  start_gitlab
}


### Finally the input handling.

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

exit

如果我以用户git身份登录并启动该服务,似乎rvm在某种程度上正在工作,它仍然使用不正确的版本和核心转储。

git@home:~/public_html/gitlab$ /etc/init.d/gitlab start
Starting both the GitLab Unicorn and Sidekiq/usr/local/rvm/gems/ruby-2.1.5/gems/kgio-2.9.2/lib/kgio_ext.so: [BUG] Segmentation fault
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0021 p:---- s:0063 b:0063 l:000062 d:000062 CFUNC  :method_defined?
c:0020 p:-4161246 s:0061 b:0061 l:000060 d:000060 TOP
c:0019 p:---- s:0059 b:0059 l:000058 d:000058 CFUNC  :require
c:0018 p:0033 s:0055 b:0055 l:000054 d:000054 TOP    /usr/local/rvm/gems/ruby-2.1.5/gems/kgio-2.9.2/lib/kgio.rb:21
c:0017 p:---- s:0053 b:0053 l:000052 d:000052 FINISH
c:0016 p:---- s:0051 b:0051 l:000050 d:000050 CFUNC  :require
c:0015 p:0059 s:0047 b:0047 l:000046 d:000046 TOP    /usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/lib/unicorn.rb:6
c:0014 p:---- s:0045 b:0045 l:000044 d:000044 FINISH
c:0013 p:---- s:0043 b:0043 l:000042 d:000042 CFUNC  :require
c:0012 p:0069 s:0039 b:0039 l:000038 d:000038 TOP    /usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/lib/unicorn/launcher.rb:9
c:0011 p:---- s:0037 b:0037 l:000036 d:000036 FINISH
c:0010 p:---- s:0035 b:0035 l:000034 d:000034 CFUNC  :require
c:0009 p:0011 s:0031 b:0031 l:000030 d:000030 TOP    /usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/bin/unicorn_rails:3
c:0008 p:---- s:0025 b:0025 l:000024 d:000024 FINISH
c:0007 p:---- s:0023 b:0023 l:000022 d:000022 CFUNC  :load
c:0006 p:0187 s:0019 b:0019 l:000cd8 d:001578 EVAL   /usr/local/rvm/gems/ruby-2.1.5/bin/unicorn_rails:23
c:0005 p:---- s:0015 b:0015 l:000014 d:000014 FINISH
c:0004 p:---- s:0013 b:0013 l:000012 d:000012 CFUNC  :eval
c:0003 p:0160 s:0007 b:0007 l:000cd8 d:001450 EVAL   /usr/local/rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:000cd8 d:000cd8 TOP

-- Ruby level backtrace information ----------------------------------------
/usr/local/rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `<main>'
/usr/local/rvm/gems/ruby-2.1.5/bin/ruby_executable_hooks:15:in `eval'
/usr/local/rvm/gems/ruby-2.1.5/bin/unicorn_rails:23:in `<main>'
/usr/local/rvm/gems/ruby-2.1.5/bin/unicorn_rails:23:in `load'
/usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/bin/unicorn_rails:3:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/bin/unicorn_rails:3:in `require'
/usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/lib/unicorn/launcher.rb:9:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/lib/unicorn/launcher.rb:9:in `require'
/usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/lib/unicorn.rb:6:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.1.5/gems/unicorn-4.6.3/lib/unicorn.rb:6:in `require'
/usr/local/rvm/gems/ruby-2.1.5/gems/kgio-2.9.2/lib/kgio.rb:21:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.1.5/gems/kgio-2.9.2/lib/kgio.rb:21:in `require'
/usr/local/rvm/gems/ruby-2.1.5/gems/kgio-2.9.2/lib/kgio.rb:21:in `method_defined?'

-- C level backtrace information -------------------------------------------
Segmentation fault (core dumped)
..............................Waited 30s for the processes to write their pids, something probably went wrong.

您可以从rvm列表中看到它没有使用默认版本,但已将自身切换为2.1.5。

git@home:~/public_html/gitlab$ /usr/local/rvm/bin/rvm list

rvm rubies

=> ruby-2.1.5 [ x86_64 ]
 * ruby-2.2.1 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

0 个答案:

没有答案