2014-12-12 1 views
1

У меня есть приложение rails 4, которое я пытаюсь развернуть на webfaction. Приложение находится на битбакете. Кроме того, в соответствии с документами webfaction приложение должно быть развернуто в пути «/ home/username/webapps/app». У меня есть вся моя настройка database.yml (для всех envs) в secrets.yml, которая была скопирована в shared_path/config.Развертывание приложений Rails 4 с использованием mina на webfaction

В соответствии с указанной в документации http://docs.webfaction.com/software/rails.html должны быть заданы некоторые переменные среды. Webfaction вам нужно установить переменные env, которые будут уничтожены после завершения сеанса ssh. Я попытался установить их в задаче set_env_variables.

структура каталога как:

$ 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. 

Он указывает, что нам нужно установить переменные окр.

Здесь 'hello_world' представляет собой пример рельсов, созданный webfaction. Я бы удалил его. Также предусмотрены nginx-пассажиры. Мой сценарий развертывания в

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 

Когда я 'Mina развернуть --verbose --trace', я получаю

** 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 

Ссылка https://community.webfaction.com/questions/5186/capistrano-cant-find-bundle определяет решение для сценария развертывания Capistrano. Как я могу исправить это для мины?

ответ

0

Вместо использования :set_env_variables задач, попробуйте добавить переменную :bundle_bin с параметрами ENV:

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

Таким образом Mina использует правильные переменный каждый раз, когда он использует команду bundle. Я думаю, что добавление его в качестве задачи и просто экспорт переменных заставляет их забыть. Заказ может быть проблемой.


Это мой полный deploy.rb для справки:

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 
+0

@Yoeran с вашей конфигурацией все работает нормально, только проблема, которую сервер продолжает указывать на установку по умолчанию Webfaction (пример:/home/myusername/webapps/myapp/defaultwebfactioninstallationfolder). Я уже изменил конфигурацию nginx, чтобы указать на/главная/MyUserName/WebApps/MyApp/ток. Что, по-вашему, мне не хватает? – albertopriore

+1

@albertopriore Вы должны добавить '/ public' к вашему корню сервера nginx. Таким образом, ваш полный корневой сервер становится: '/ home/USERNAME/webapps/APPNAME/current/public' – Yoeran