Prasad Surase
Prasad Surase

Reputation: 6574

Rails 4 app deployment using mina on webfaction

I have a rails 4 application that I am trying to deploy on webfaction. The app resides on bitbucket. Also, as per the webfaction documents, the app has to be deployed in the '/home/username/webapps/app' path. I have all my database.yml setting(for all envs) in secrets.yml which has been copied to the shared_path/config.

As per the documentation specified http://docs.webfaction.com/software/rails.html, the some environment variables have to be set. Webfaction needs you to set the env variables which are destroyed after the ssh session is over. I have tried to set them in the 'set_env_variables' task.

the directory structure is as:

$ pwd
/home/username/webapps/appname
$ ls
bin  gems  hello_world  lib  nginx  releases  scm  shared  src  tmp
$ls gems/
bin  build_info  cache  doc  extensions  gems  specifications
$ ls gems/gems/
actionmailer-4.1.8         bundler-1.7.9               jbuilder-2.2.5      rack-test-0.6.2        sass-rails-4.0.5       tilt-1.4.1 ...
$ cd hello_world/
[hello_world]$ bundle
-bash: bundle: command not found
$ cd ..
$ pwd
/home/username/webapps/appname
$ export PATH=$PWD/bin:$PATH
$ export GEM_HOME=$PWD/gems
$ export RUBYLIB=$PWD/lib
$ cd hello_world/
$ bundle
Using rake 10.4.2
...
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

It specifies that we need to set the env variables.

Here 'hello_world' is a sample rails application that webfaction has provided. I would be removing it. nginx-passenger are provided too. My deployment script is as

require 'mina/bundler'
require 'mina/rails'
require 'mina/git'

set :domain, 'webabc.webfaction.com'
set :deploy_to, '/home/username/webapps/appname'
set :repository, '[email protected]:username/appname.git'
set :branch, 'master'

set :shared_paths, ['config/secrets.yml', 'log', 'tmp']
set :user, 'ssh-username'    # Username in the server to SSH to.

task :environment do
end

task :setup => :environment do
  queue! %[mkdir -p "#{deploy_to}/#{shared_path}/tmp"]
  queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/tmp"]

  queue! %[mkdir -p "#{deploy_to}/#{shared_path}/log"]
  queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/log"]

  queue! %[mkdir -p "#{deploy_to}/#{shared_path}/config"]
  queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/config"]

  queue! %[touch "#{deploy_to}/#{shared_path}/config/secrets.yml"]
  queue  %[echo "-----> Be sure to edit '#{deploy_to}/#{shared_path}/config/secrets.yml'."]
end

desc "Deploys the current version to the server."
task :deploy => :environment do
  deploy do
    invoke :'set_env_variables'
    invoke :'git:clone'
    invoke :'deploy:link_shared_paths'
    invoke :'bundle:install'
    invoke :'rails:db_migrate'
    invoke :'rails:assets_precompile'
    invoke :'deploy:cleanup'

    to :launch do
      queue "mkdir -p #{deploy_to}/#{current_path}/tmp/"
      queue "touch #{deploy_to}/#{current_path}/tmp/restart.txt"
      invoke :restart
    end
  end
end

desc "Set the environment variables."
task :set_env_variables => :environment do
  queue! "cd /home/username/webapps/appname"
  queue! "export GEM_HOME=$PWD/gems"
  queue! "export RUBYLIB=$PWD/lib"
  queue! "export PATH=$PWD/bin:$PATH"
  queue! "export LD_LIBRARY_PATH=$HOME/lib/"
end

When I do 'mina deploy --verbose --trace', I get

** Invoke deploy (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute deploy
** Invoke set_env_variables (first_time)
** Invoke environment 
** Execute set_env_variables
** Invoke git:clone (first_time)
** Execute git:clone
** Invoke deploy:link_shared_paths (first_time)
** Execute deploy:link_shared_paths
** Invoke bundle:install (first_time)
** Execute bundle:install
** Invoke rails:db_migrate (first_time)
** Execute rails:db_migrate
** Invoke rails:assets_precompile (first_time)
** Execute rails:assets_precompile
** Invoke deploy:cleanup (first_time)
** Execute deploy:cleanup
** Invoke restart (first_time)
** Invoke environment 
** Execute restart

-----> Creating a temporary build path
   $ touch "deploy.lock"
   $ mkdir -p "$build_path"
   $ cd "$build_path"

   Setting environment variables
   $ cd /home/username/webapps/appname
   $ export GEM_HOME=$PWD/gems
   $ export RUBYLIB=$PWD/lib
   $ export PATH=$PWD/bin:$PATH
   $ export LD_LIBRARY_PATH=$HOME/lib/

-----> Fetching new git commits
   $ (cd "/home/username/webapps/appname/scm" && git fetch "[email protected]:username/appname.git" "master:master" --force)

-----> Using git branch 'master'
   $ git clone "/home/username/webapps/appname/scm" . --recursive --br       Cloning into '.'...
   $ git clone "/home/username/webapps/appname/scm" . --recursive --branch "master"
   done.

-----> Using this git commit

   $ git --no-pager log --format='%aN (%h):%n> %s' -n 1
   Prasad Surase (ce1654d):
   > Some git commit message
   $ rm -rf .git

-----> Symlinking shared paths
   $ mkdir -p "./config"
   bash: line 130: bundle: command not found
   $ mkdir -p "."
   $ rm -rf "./config/secrets.yml"
   $ ln -s "/home/username/webapps/appname/shared/config/secrets.yml" "./config/secrets.yml"
   $ rm -rf "./log"
   $ ln -s "/home/username/webapps/appname/shared/log" "./log"
   $ rm -rf "./tmp"
   $ ln -s "/home/username/webapps/appname/shared/tmp" "./tmp"

-----> Installing gem dependencies using Bundler
   $ mkdir -p "/home/username/webapps/appname/shared/bundle"
   $ mkdir -p "./vendor"
   $ ln -s "/home/username/webapps/appname/shared/bundle" "./vendor/bundle"
   $ bundle install --without development:test --path "./vendor/bundle" --deployment
!     ERROR: Deploy failed.

-----> Cleaning up build
   $ rm -rf "$build_path"
   Unlinking current
   $ rm -f "deploy.lock"
   OK

!     Command failed.
   Failed with status 19

The https://community.webfaction.com/questions/5186/capistrano-cant-find-bundle link specifies the solution for capistrano deployment script. How can i fix it for mina?

Upvotes: 1

Views: 1034

Answers (1)

Yoeran
Yoeran

Reputation: 71

Instead of using the :set_env_variables task try adding the :bundle_bin variable with your ENV parameters:

set :bundle_bin, %{PATH="#{deploy_to}/bin:$PATH" GEM_HOME="#{deploy_to}/gems" RUBYLIB="#{deploy_to}/lib" RAILS_ENV=#{env} #{deploy_to}/bin/bundle}

This way mina uses the correct variable every time it uses the bundle command. I think adding it as a task and just exporting the variables makes mina forget them. Order might be a problem as well.


This is my full deploy.rb for reference:

require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
# require 'mina/rbenv'  # for rbenv support. (http://rbenv.org)
# require 'mina/puma'

# Basic settings:
set :domain, 'USERNAME.webfactional.com'
set :repository, '[email protected]:GIT_USERNAME/REPO.git'
set :branch, 'master'

case ENV['to']
when 'production'
  set :deploy_to, '/home/USERNAME/webapps/PRODUCTION_APP'
  set :env, 'production'
else
  set :deploy_to, '/home/USERNAME/webapps/STAGING_APP'
  set :env, 'staging'
end

# Manually create these paths in shared/ (eg: shared/config/database.yml) in your server.
# They will be linked in the 'deploy:link_shared_paths' step.
set :shared_paths, ['config/database.yml', 'config/secrets.yml', 'log', 'public/uploads']

# Optional settings:
set :user, 'USERNAME'    # Username in the server to SSH to.
# set :port, '7331'     # SSH port number.

set :bundle_bin, %{PATH="#{deploy_to}/bin:$PATH" GEM_HOME="#{deploy_to}/gems" RUBYLIB="#{deploy_to}/lib" RAILS_ENV=#{env} #{deploy_to}/bin/bundle}

# This task is the environment that is loaded for most commands, such as
# `mina deploy` or `mina rake`.
task :environment do
  # If you're using rbenv, use this to load the rbenv environment.
  # Be sure to commit your .rbenv-version to your repository.
  # invoke :'rbenv:load'
end

# Put any custom mkdir's in here for when `mina setup` is ran.
# For Rails apps, we'll make some of the shared paths that are shared between
# all releases.
task :setup => :environment do
  queue! %[mkdir -p "#{deploy_to}/shared/log"]
  queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/log"]

  queue! %[mkdir -p "#{deploy_to}/shared/config"]
  queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/config"]

  queue! %[touch "#{deploy_to}/shared/config/database.yml"]
  queue  %[echo "-----> Be sure to edit 'shared/config/database.yml'."]

  queue! %[touch "#{deploy_to}/shared/config/secrets.yml"]
  queue  %[echo "-----> Be sure to edit 'shared/config/secrets.yml'."]

  queue! %[mkdir -p "#{deploy_to}/shared/public/uploads"]
  queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/public/uploads"]
end

desc "Deploys the current version to the server."
task :deploy => :environment do
  deploy do
    # Put things that will set up an empty directory into a fully set-up
    # instance of your project.
    invoke :'git:clone'
    invoke :'deploy:link_shared_paths'
    invoke :'bundle:install'
    invoke :'rails:db_migrate'
    invoke :'rails:assets_precompile'

    to :launch do
      queue %{#{deploy_to}/bin/restart}
    end
  end
end

namespace :nginx  do
  task :start => :environment do
    queue %{#{deploy_to}/bin/start}
  end

  task :stop => :environment do
    queue %{#{deploy_to}/bin/stop}
  end

  task :restart => :environment do
    queue %{#{deploy_to}/bin/restart}
  end
end

task :logs do
  queue 'echo "[ TAIL CONTENTS OF LOG FILE ]"'
  queue %{tail -f #{deploy_to}/current/log/#{env}.log}
end

task :console => :environment do
  queue 'echo "[ STARTING EXTERNAL RAILS CONSOLE ]"'
  queue %{#{bundle_bin} exec rails c}
end

Upvotes: 1

Related Questions