Reputation: 6574
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
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