Запустите `rails db: migrate` с помощью capistrano в геме / субмодуле - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть приложение rails 5.2.Я пытаюсь развернуть его с помощью Capistrano.

В приложении есть подмодуль зависимости от гемов, который содержит все модели и миграции, необходимые для этого проекта.Этот подмодуль зависит от других гемов в его .gemspec.

. Поэтому мне нужно запустить rails db:migrate в корне подмодуля, а не в корне родительского проекта.

Я добавил следующеена deploy.rb:

  desc 'Runs rake db:migrate if migrations are set'
  task :migrate => [:set_rails_env] do
    on primary fetch(:migration_role) do
      within "#{release_path}/PATH/TO/SUBMODULE" do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:migrate"
        end
      end
    end
  end

  before :starting,    :migrate

Gemfile:

gem 'dependency', path: 'PATH/TO/SUBMODULE'
gem 'capistrano-git-with-submodules', '~> 2.0'
group :development do
  gem 'capistrano',         require: false
  gem 'capistrano-rvm',     require: false
  gem 'capistrano-rails',   require: false
  gem 'capistrano-bundler', require: false
  gem 'capistrano3-puma',   require: false
end

Когда я пытаюсь запустить эту задачу, я получаю сообщение об ошибке:

 DEBUG [b4c1cf18]   [31mCould not find aasm-5.0.2 in any of the sources[0m
 DEBUG [b4c1cf18]   
 DEBUG [b4c1cf18]   [33mRun `bundle install` to install missing gems.[0m
 DEBUG [b4c1cf18]

Itпохоже, что набор гемов (содержащий все гемы родительского и субмодульного), используемый при развертывании родительского проекта, находится не в пути или недоступен, когда наступает время для выполнения этой задачи.

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

Я не совсем уверен, как Capistrano работает под капотом, как я могу убедиться, что эти драгоценные камни доступны для этой задачи, когда она выполняется?

1 Ответ

0 голосов
/ 09 апреля 2019

Я понял, мне нужно 3 вещи:

1. execute :bundle до execute :rake, :"db:migrate"

  1. Предоставьте второй аргумент within "#{release_path}/PATH/TO/SUBMODULE", чтобы сделать его within "#{release_path}/PATH/TO/SUBMODULE", release_path - не удалось найти документы по этому вопросу, только этот PR: https://github.com/capistrano/bundler/pull/84

  2. символическая ссылка секретирует движку, чтобы он не мешал выполнению каких-либо задач:

    task :symlink_secrets do
        on roles(:app) do
          execute "rm -rf #{release_path}/PATH/TO/SUBMODULE/spec/dummy/config/secrets.yml"
          execute "ln -nfs ~/secrets.yml #{release_path}/PATH/TO/SUBMODULE/spec/dummy/config/secrets.yml"
        end 
    end
...