Commit 7ef5d80

mo khan <mo@mokhan.ca>
2015-05-23 23:58:54
split the unicorn recipe from the puma one.
1 parent 8412560
recipes/puma.rb
@@ -0,0 +1,13 @@
+configuration = node['puma']
+
+template "/etc/init.d/puma" do
+  source "puma.erb"
+  owner configuration['username']
+  group configuration['username']
+  mode "0744"
+  variables(configuration)
+end
+
+service "puma" do
+  action [:enable, :start]
+end if File.exists?("#{configuration['current_path']}/Gemfile")
recipes/rails.rb
@@ -1,7 +1,7 @@
 include_recipe "mokhan-myface::rbenv"
 include_recipe "mokhan-myface::capistrano"
 include_recipe "mokhan-myface::nginx"
-include_recipe "mokhan-myface::unicorn"
+include_recipe "mokhan-myface::puma"
 include_recipe "mokhan-myface::nodejs"
 
 [
spec/puma_spec.rb
@@ -0,0 +1,37 @@
+describe "mokhan-myface::puma" do
+  subject do
+    ChefSpec::SoloRunner.new do |node|
+      node.set['puma'] = configuration
+    end.converge(described_recipe)
+  end
+
+  let(:username) { FFaker::Internet.user_name }
+  let(:configuration) do
+    {
+      username: username,
+      current_path: '/tmp',
+    }
+  end
+
+  it 'creates the puma init.d script' do
+    expect(subject).to create_template("/etc/init.d/puma")
+      .with_source("puma.erb")
+      .with_owner(username)
+      .with_group(username)
+      .with_mode("0744")
+  end
+
+  context "when the app is deployed" do
+    before :each do
+      FileUtils.touch('/tmp/Gemfile')
+    end
+
+    after :each do
+      FileUtils.rm('/tmp/Gemfile')
+    end
+
+    it 'starts the puma service' do
+      expect(subject).to start_service("puma")
+    end
+  end
+end
templates/default/puma.erb
@@ -0,0 +1,92 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides:          puma
+# Required-Start:    $remote_fs $syslog
+# Required-Stop:     $remote_fs $syslog
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start puma at boot time
+# Description:       Run input app server
+### END INIT INFO
+set -e
+
+TIMEOUT=${TIMEOUT-60}
+APP_ROOT=<%= @current_path %>
+PID=$APP_ROOT/tmp/pids/puma.pid
+ENVIRONMENT=<%= @rails_env %>
+CMD="cd $APP_ROOT; bin/puma -C config/puma_production.rb"
+action="$1"
+set -u
+
+old_pid="$PID.oldbin"
+
+cd $APP_ROOT || exit 1
+
+sig () {
+  test -s "$PID" && kill -$1 `cat $PID`
+}
+
+oldsig () {
+  test -s $old_pid && kill -$1 `cat $old_pid`
+}
+
+workersig () {
+  workerpid="$APP_ROOT/tmp/pids/unicorn.$2.pid"
+  test -s "$workerpid" && kill -$1 `cat $workerpid`
+}
+
+case $action in
+status )
+  sig 0 && echo >&2 "unicorn is running." && exit 0
+  echo >&2 "unicorn is not running." && exit 1 
+  ;;
+start)
+  sig 0 && echo >&2 "Already running" && exit 0
+  eval "$CMD"
+  ;;
+stop)
+  sig QUIT && exit 0
+  echo >&2 "Not running"
+  ;;
+force-stop)
+  sig TERM && exit 0
+  echo >&2 "Not running"
+  ;;
+restart|reload)
+  sig HUP && echo reloaded OK && exit 0
+  echo >&2 "Couldn't reload, starting '$CMD' instead"
+  eval "$CMD"
+  ;;
+upgrade)
+  if sig USR2 && sleep 20 && sig 0 && oldsig QUIT
+  then
+    n=$TIMEOUT
+    while test -s $old_pid && test $n -ge 0
+    do
+      printf '.' && sleep 1 && n=$(( $n - 1 ))
+    done
+    echo
+
+    if test $n -lt 0 && test -s $old_pid
+    then
+      echo >&2 "$old_pid still exists after $TIMEOUT seconds"
+      exit 1
+    fi
+    exit 0
+  fi
+  echo >&2 "Couldn't upgrade, starting '$CMD' instead"
+  eval "$CMD"
+  ;;
+kill_worker)
+  workersig QUIT $2 && exit 0
+  echo >&2 "Worker not running"
+  ;;
+
+reopen-logs)
+  sig USR1
+  ;;
+*)
+  echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
+  exit 1
+  ;;
+esac
templates/default/unicorn.erb
@@ -17,8 +17,7 @@ TIMEOUT=${TIMEOUT-60}
 APP_ROOT=<%= @current_path %>
 PID=$APP_ROOT/tmp/pids/unicorn.pid
 ENVIRONMENT=<%= @rails_env %>
-#CMD="cd $APP_ROOT; bin/unicorn -E $ENVIRONMENT -D -c $APP_ROOT/config/unicorn.rb"
-CMD="cd $APP_ROOT; bin/foreman start -e .env.production"
+CMD="cd $APP_ROOT; bin/unicorn -E $ENVIRONMENT -D -c $APP_ROOT/config/unicorn.rb"
 action="$1"
 set -u
 
.kitchen.yml
@@ -50,7 +50,7 @@ suites:
           app_secret_key: 'secret-key'
       nginx:
         domain: 'www.mokhan.ca'
-      unicorn:
+      puma:
         username: 'rails'
         current_path: '/var/www/app/current'
       postgres: