ক্যাপিস্ট্রানো থেকে আমি কীভাবে রেক টাস্ক চালাব?


105

আমার ইতিমধ্যে একটি deploy.rb রয়েছে যা আমার অ্যাপ্লিকেশনটি আমার প্রোডাকশন সার্ভারে স্থাপন করতে পারে।

আমার অ্যাপ্লিকেশনটিতে একটি কাস্টম রেক টাস্ক রয়েছে (lib / Tasks ডিরেক্টরিতে একটি .rake ফাইল)।

আমি এমন একটি ক্যাপ টাস্ক তৈরি করতে চাই যা দূরবর্তীভাবে সেই রাক টাস্কটি চালাবে।


2
ক্যাপিসিট্র্যানোর নিজস্ব #{rake}ভেরিয়েবল ব্যবহারের উপকারিতা / বিধিগুলি কেউ ব্যাখ্যা করতে পারেন ? মনে হয় এটি সর্বদা সেরা বিকল্প নয়।
lulalala

উত্তর:


59

আপনার আরও কিছুটা স্পষ্ট, \config\deploy.rbকোনও কাজ বা নামের জায়গার বাইরে যুক্ত করুন:

namespace :rake do  
  desc "Run a task on a remote server."  
  # run like: cap staging rake:invoke task=a_certain_task  
  task :invoke do  
    run("cd #{deploy_to}/current; /usr/bin/env rake #{ENV['task']} RAILS_ENV=#{rails_env}")  
  end  
end

তারপরে, থেকে /rails_root/আপনি চালাতে পারবেন:

cap staging rake:invoke task=rebuild_table_abc

1
/ ইউএসআর / বিন / এনভি রেক ব্যবহার করা ভাল, যাতে আরভিএম সেটআপগুলি সঠিক রেকটি তুলবে।
ডিজিএম

8
যদি পাওয়া যায় তবে 'বান্ডেল
এক্সিকিউটিভ

44

... বছর কয়েক পরে ...

ক্যাপিস্ট্রানো রেল প্লাগইনটি দেখুন, আপনি https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/migration.rake#L5-L14 এ দেখতে দেখতে কিছু দেখতে পাবেন:

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

3
এটি কেবল ক্যাপিস্ট্রানো ভি 3 এর জন্য।
ফিলাবকার

অনেক সাহায্য করেছে। ধন্যবাদ! @ মীরেক রুসিন
নিশান্ত শ্রীবাস্তব

অন্যান্য উত্তরগুলি, যে ব্যবহারটি runসংস্করণ 2 পর্যন্ত ক্যাপিস্ট্রানোতে কাজ করবে সংস্করণ 3 থেকে এটি যাওয়ার উপায়।
ডন গিউলিও

44

ক্যাপিস্ট্রানো 3 জেনেরিক সংস্করণ (কোনও রেক টাস্ক চালান)

মিরেক রুসিনের উত্তরের জেনেরিক সংস্করণ তৈরি করা:

desc 'Invoke a rake command on the remote server'
task :invoke, [:command] => 'deploy:set_rails_env' do |task, args|
  on primary(:app) do
    within current_path do
      with :rails_env => fetch(:rails_env) do
        rake args[:command]
      end
    end
  end
end

ব্যবহারের উদাহরণ: cap staging "invoke[db:migrate]"

নোট deploy:set_rails_envযেটির প্রয়োজন তা ক্যাপিস্ট্রানো-রেল মণি থেকে আসে


1
এটি কেবলমাত্র একটি একক যুক্তিকে সমর্থন করে, যদি আপনি এর সাথে প্রতিস্থাপন rake args[:command] করেন তবে আপনি execute :rake, "#{args.command}[#{args.extras.join(",")}]" একাধিক যুক্তি দিয়ে কোনও কাজ cap production invoke["task","arg1","arg2"]
সম্পাদন করতে

1
@ রবিন ক্লোয়ার্স আপনি একাধিক যুক্তি যেমন পাস করতে পারেন cap staging invoke['task[arg1\,arg2]']। আপনি যেটির উল্লেখ করেছেন তার কাছে আমি এই পদ্ধতির পছন্দ করি কারণ এটি রকের প্রকৃত প্রার্থনাটি আয়না করে। এই পদ্ধতির সঙ্গে এছাড়াও আপনি একাধিক কার্য, যা প্রায়ই দরকারী চেইন পারেন: cap staging invoke['task1 task2[arg1] task3[arg2\,arg3]']। রেক 10.2.0 বা আরও নতুনর জন্য কাজ করে
মেরিনোসব

এটি দুর্দান্ত - আমি নোট করতে চাই, আপনার অন্তর্ভুক্ত করতে হবে: অ্যাপ্লিকেশনটিকে আপনার সার্ভারের অন্যতম ভূমিকা।
lfender6445

স্পষ্টতই এটি "অনুরোধ [ডিবি: মাইগ্রেট]]" হওয়া দরকার ... সংশোধন হয়েছে।
আব্রাম

@ আব্রাম আপনি যে আদেশটি দিয়েছিলেন তার পরামর্শ দিয়ে আমি পেয়েছি "টাস্ক 'চালানো কীভাবে তৈরি করা যায় তা জানি না"
ডিসি 10

41
run("cd #{deploy_to}/current && /usr/bin/env rake `<task_name>` RAILS_ENV=production")

এটি গুগলের সাথে খুঁজে পেয়েছে - http://ananelson.com/said/on/2007/12/30/remote-rake-tasks-with-capistrano/

এটি RAILS_ENV=productionছিল একটি গোচা - আমি প্রথমে এটি সম্পর্কে ভাবি নি এবং টাস্কটি কেন কিছুই করছে না তা বুঝতে পারি না।


2
একটি সামান্য উন্নতি: আপনি যদি সেমিকোলনটিকে && এর সাথে প্রতিস্থাপন করেন তবে প্রথম বিবৃতি (ডিরেক্টরি পরিবর্তন করা) ব্যর্থ হলে দ্বিতীয় বিবৃতি (রাক টাস্ক চালানো) চালিত হবে না।
টেলিফোন টেড

2
আপনি একাধিক সার্ভারে স্থাপন করা থাকলে এটি কাজ করবে না। এটি একাধিকবার রেক টাস্কটি চালাবে।
মার্ক রেডিং

4
একজনকে সত্যই "cd #{deploy_to}/current && #{rake} <task_name> RAILS_ENV=production"
ক্যাপিসিট্রানো রেক সেটিংকে

@ মার্ক রেডিং: আপনি কি রেক টাস্কগুলির জন্য নিজের একটি ভূমিকাটিতে একটি সার্ভার স্থাপন করতে পারেন এবং আপনার ক্যাপাসিট্রো টাস্ককে কেবল সেই ভূমিকা সহ সার্ভারগুলিতে চালিত করতে সীমাবদ্ধ রাখতে পারেন?
mj1531

আমি আমার ডিপ্লয়ে.আরবিতে একটি টাস্ক তৈরি করে এমন কিছু করেছি। এই টাস্কটির একটি: রোলস =>: ডিবি রয়েছে যাতে এটি কেবল একই সার্ভারে কার্যকর হবে যা আমি ডিবি: মাইগ্রেটের জন্য আমার প্রাথমিক হিসাবে সংজ্ঞায়িত করেছি।
মার্ক রেডিং

20

ক্যাপিস্ট্রানো স্টাইলের রেকের অনুরোধগুলি ব্যবহার করুন

একটি সাধারণ উপায় রয়েছে যা require 'bundler/capistrano'রেকটিকে সংশোধন করে এবং অন্যান্য এক্সটেনশানগুলির সাথে "কেবলমাত্র কাজ করবে" । যদি আপনি মাল্টিস্টেজ ব্যবহার করেন তবে এটি প্রাক-উত্পাদন পরিবেশের সাথেও কাজ করবে। সারকথা? পারলে কনফিগারেশন ভার্স ব্যবহার করুন।

desc "Run the super-awesome rake task"
task :super_awesome do
  rake = fetch(:rake, 'rake')
  rails_env = fetch(:rails_env, 'production')

  run "cd '#{current_path}' && #{rake} super_awesome RAILS_ENV=#{rails_env}"
end

2
এটি সর্বোত্তম সমাধান, যেখানে উপলব্ধ সেখানে
ক্যাপিস্ট্রানো

2
সম্ভবত top.runএটি run
যুক্তিযুক্ত

ধন্যবাদ @ ডলজেনকো পদ্ধতির জন্য সবেমাত্র ডকগুলিtop খুঁজে পেয়েছি । যে ক্ষেত্রে আমরা runএকই নেমস্পেসে সংজ্ঞায়িত করেছি , top.runপ্রয়োজনীয়, অন্যথায় এটি এখনও শীর্ষ স্তরের সন্ধান করা উচিত runযেখানে টাস্কটির নামগতি রয়েছে। আমি কিছু মিস করেছি? আপনার ক্ষেত্রে কি ঘটেছে?
অধিনায়ক

1
আমার কাছে একই নেমস্পেসে স্পষ্টভাবে কোনও রান পদ্ধতি সংজ্ঞায়িত হয়নি, তাই কেন আমার প্রয়োজন তা নিশ্চিত হন না। যে কোনও ক্ষেত্রে ক্যাপিস্ট্রানো ২.০ একটি ইতিহাস এবং পরবর্তী সংস্করণটি রাক ভিত্তিক (আশা আরও প্রত্যাশাযোগ্য করে
তোলে

16

capistrano-rakeরত্ন ব্যবহার করুন

কাস্টম ক্যাপিস্ট্রানো রেসিপিগুলির সাথে গোলযোগ না করে কেবল রত্নটি ইনস্টল করুন এবং এর মতো দূরবর্তী সার্ভারগুলিতে পছন্দসই রাক কার্য সম্পাদন করুন:

cap production invoke:rake TASK=my:rake_task

সম্পূর্ণ প্রকাশ: আমি এটি লিখেছি


7

আমি ব্যক্তিগতভাবে উত্পাদনে এই জাতীয় সাহায্যকারী পদ্ধতি ব্যবহার করি:

def run_rake(task, options={}, &block)
  command = "cd #{latest_release} && /usr/bin/env bundle exec rake #{task}"
  run(command, options, &block)
end

এটি রান (কমান্ড) পদ্ধতিটি ব্যবহার করার অনুরূপ রেক টাস্ক চালানোর অনুমতি দেয়।


দ্রষ্টব্য: ডিউকের প্রস্তাব অনুসারে এটি একই রকম , তবে আমি:

  • কারেন্ট_রিলেজের পরিবর্তে সর্বশেষ_আগ্রহ করে ব্যবহার করুন - আমার অভিজ্ঞতা থেকে রেক কমান্ড চালানোর সময় আপনি যা প্রত্যাশা করেন তা আরও বেশি;
  • রাক এবং ক্যাপিস্ট্রানো নামকরণের কনভেনশন অনুসরণ করুন (পরিবর্তে: সেমিডি -> টাস্ক এবং রেক -> রান_রেকে)
  • RAILS_ENV = # {Rails_env set সেট করবেন না কারণ এটি সেট করার জন্য সঠিক জায়গাটি ডিফল্ট_আরুন_অপশন চলক। যেমন ডিফল্ট_আরুন_পশন [: env] = {'RAILS_ENV' => 'উত্পাদন'} # -> DRY!

5

একটি আকর্ষণীয় রত্ন কেপ রয়েছে যা আপনার রাক কার্যগুলিকে ক্যাপিস্ট্রানো কার্য হিসাবে উপলব্ধ করে তোলে, যাতে আপনি এগুলি দূর থেকে চালাতে পারেন। capeভাল ডকুমেন্টেড, তবে আমি কীভাবে সেট আপ করব তার একটি সংক্ষিপ্ত বিবরণ এখানে।

রত্ন ইনস্টল করার পরে, কেবল এটি আপনার config/deploy.rbফাইলে যুক্ত করুন।

# config/deploy.rb
require 'cape'
Cape do
  # Create Capistrano recipes for all Rake tasks.
  mirror_rake_tasks
end

এখন, আপনি rakeস্থানীয়ভাবে বা দূরবর্তী মাধ্যমে আপনার সমস্ত কাজ পরিচালনা করতে পারেন cap

একটি যুক্ত বোনাস হিসাবে, capeআপনি কীভাবে স্থানীয়ভাবে এবং দূরবর্তীভাবে আপনার রেক টাস্কটি চালাতে চান তা সেট করতে দেয় (আর কোনও নয় bundle exec rake), কেবল এটি আপনার config/deploy.rbফাইলে যুক্ত করুন:

# Configure Cape to execute Rake via Bundler, both locally and remotely.
Cape.local_rake_executable  = '/usr/bin/env bundle exec rake'
Cape.remote_rake_executable = '/usr/bin/env bundle exec rake'

দ্রষ্টব্য: কেবল ক্যাপিস্ট্রানো v2.x এর জন্য কাজ করে। ক্যাপিস্ট্রানো ভি 3 এর সাথে সামঞ্জস্যপূর্ণ নয়।
নায়া

3
namespace :rake_task do
  task :invoke do
    if ENV['COMMAND'].to_s.strip == ''
      puts "USAGE: cap rake_task:invoke COMMAND='db:migrate'" 
    else
      run "cd #{current_path} && RAILS_ENV=production rake #{ENV['COMMAND']}"
    end
  end                           
end 

1
ভাল. এটিকে পরিবর্তন করা এটিকে আমার মঞ্চের সার্ভারেও কাজ RAILS_ENV=productionকরতে RAILS_ENV=#{rails_env}দেয়।
ইভানর্ম্মফি

2

চলমান র‌্যাক কার্যগুলি সহজ করার জন্য আমি আমার ডিপ্লয়ে.আরবিতে যা রেখেছি তা এখানে। এটি ক্যাপিস্ট্রানো রান () পদ্ধতির চারপাশে একটি সাধারণ মোড়ক।

def rake(cmd, options={}, &block)
  command = "cd #{current_release} && /usr/bin/env bundle exec rake #{cmd} RAILS_ENV=#{rails_env}"
  run(command, options, &block)
end

তারপরে আমি ঠিক তেমন কোনও রেক টাস্কটি চালাই:

rake 'app:compile:jammit'

এই দ্বন্দ্বগুলি ক্যাপিস্ট্রানো হিসাবে এটির নিজস্ব রাক পরিবর্তনশীল (কোনটি রেকটি ব্যবহার করতে হবে তা নির্ধারণ করতে ব্যবহৃত) সংজ্ঞায়িত করে এবং এইভাবে সম্পদের প্রাক্কলিতকরণের জন্য রসিদগুলিতে নির্মিত ব্রেকগুলি
মাইকেল

2

এটি আমার পক্ষে কাজ করেছে:

task :invoke, :command do |task, args|
  on roles(:app) do
    within current_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, args[:command]
      end
    end
  end
end

তারপরে সহজভাবে চালান cap production "invoke[task_name]"


1

এটি বেশিরভাগই উপরের উত্তর থেকে ক্যাপিস্ট্রানো থেকে কোনও রেক টাস্ক চালানোর জন্য একটি সামান্য বর্ধন সহ

ক্যাপিস্ট্রানো থেকে যে কোনও রেক টাস্ক চালান

$ cap rake -s rake_task=$rake_task

# Capfile     
task :rake do
  rake = fetch(:rake, 'rake')
  rails_env = fetch(:rails_env, 'production')

  run "cd '#{current_path}' && #{rake} #{rake_task} RAILS_ENV=#{rails_env}"
end

1

এটিও কাজ করে:

run("cd #{release_path}/current && /usr/bin/rake <rake_task_name>", :env => {'RAILS_ENV' => rails_env})

আরও তথ্য: ক্যাপিস্ট্রানো চালান


1
lo deploy_to} / বর্তমান এখানে কাজ করবে না। প্রতীকী লিঙ্কটি পরিবর্তন হয়নি। আপনি যদি রেক টাস্ক আপডেট করেন তবে এটি পুরানো কোডটি চালাবে। পরিবর্তে {প্রকাশ_পথ using ব্যবহার বিবেচনা করুন।
মার্ক রেডিং

আরও তথ্য স্প্যাম হয়?
hcarreras

1

আপনি যদি একাধিক যুক্তি পাস করতে সক্ষম হতে চান তবে এটি চেষ্টা করুন (মেরিনোসবারনের উত্তরের ভিত্তিতে):

task :invoke, [:command] => 'deploy:set_rails_env' do |task, args|
  on primary(:app) do
    within current_path do
      with :rails_env => fetch(:rails_env) do
        execute :rake, "#{args.command}[#{args.extras.join(",")}]"
      end
    end
  end
end

তারপরে আপনি এর মতো কোনও টাস্ক চালাতে পারেন: cap production invoke["task","arg1","arg2"]


0

সুতরাং আমি এই কাজ করে যাচ্ছি। এটি ভাল কাজ seams। তবে আপনার কোডটির সত্যিকারের সুবিধা নিতে একটি ফর্ম্যাটার দরকার।

আপনি যদি কোনও ফরম্যাটার ব্যবহার করতে না চান তবে লগ স্তরটি ডিবাগ মোডে সেট করুন। এই সেমাস থেকে এইচ

SSHKit.config.output_verbosity = Logger::DEBUG

ক্যাপ স্টাফ

namespace :invoke do
  desc 'Run a bash task on a remote server. cap environment invoke:bash[\'ls -la\'] '
  task :bash, :execute do |_task, args|
    on roles(:app), in: :sequence do
      SSHKit.config.format = :supersimple
      execute args[:execute]
    end
  end

  desc 'Run a rake task on a remote server. cap environment invoke:rake[\'db:migrate\'] '
  task :rake, :task do |_task, args|
    on primary :app do
      within current_path do
        with rails_env: fetch(:rails_env) do
          SSHKit.config.format = :supersimple
          rake args[:task]
        end
      end
    end
  end
end

এটি উপরের কোডটি দিয়ে কাজ করার জন্য তৈরি করা ফর্ম্যাটর। এটি ভিত্তিতে তৈরি করা হয়েছে: পাঠ্যপুস্তকটি স্ক্কিটের মধ্যে অন্তর্নির্মিত তবে কাস্টম কাজগুলি চালাবার কোনও খারাপ উপায় নয়। ওহ এই অনেকগুলি sshkit রত্নের নতুন সংস্করণে কাজ করে না। আমি জানি এটি 1.7.1 এর সাথে কাজ করে। আমি এটি বলছি কারণ মাস্টার শাখা এসএসএইচকিট :: উপলভ্য কমান্ড পদ্ধতিগুলি পরিবর্তন করেছে।

module SSHKit
  module Formatter
    class SuperSimple < SSHKit::Formatter::Abstract
      def write(obj)
        case obj
        when SSHKit::Command    then write_command(obj)
        when SSHKit::LogMessage then write_log_message(obj)
        end
      end
      alias :<< :write

      private

      def write_command(command)
        unless command.started? && SSHKit.config.output_verbosity == Logger::DEBUG
          original_output << "Running #{String(command)} #{command.host.user ? "as #{command.host.user}@" : "on "}#{command.host}\n"
          if SSHKit.config.output_verbosity == Logger::DEBUG
            original_output << "Command: #{command.to_command}" + "\n"
          end
        end

        unless command.stdout.empty?
          command.stdout.lines.each do |line|
            original_output << line
            original_output << "\n" unless line[-1] == "\n"
          end
        end

        unless command.stderr.empty?
          command.stderr.lines.each do |line|
            original_output << line
            original_output << "\n" unless line[-1] == "\n"
          end
        end

      end

      def write_log_message(log_message)
        original_output << log_message.to_s + "\n"
      end
    end
  end
end

0

পূর্ববর্তী উত্তরগুলি আমাকে সাহায্য করতে পারেনি এবং আমি এটি খুঁজে পেয়েছি: http://kenglish.co/run-rake-tasks-on-the-server-with-capistrano-3-and-rbenv/ থেকে

namespace :deploy do
  # ....
  # @example
  #   bundle exec cap uat deploy:invoke task=users:update_defaults
  desc 'Invoke rake task on the server'
  task :invoke do
    fail 'no task provided' unless ENV['task']

    on roles(:app) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, ENV['task']
        end
      end
    end
  end

end

আপনার টাস্ক ব্যবহার চালানোর জন্য

bundle exec cap uat deploy:invoke task=users:update_defaults

এটি কারও পক্ষে কাজে লাগবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.