Got the Capistrano::CLI.parse().execute! command working in a process
forked from the rails app--which I needed to do anyway--but it's still
strange that it blows up when invoked twice from the same process.
The capfiles are reasonable staightforward--though I am using the
ec2onrails gem.

If anyone sees something obvious, let me know!

Here's the code to invoke the cap:
----------------
require 'capistrano/cli'

class DeployManager
    def self.deploy_data
        Capistrano::CLI.parse(['staging',
'deploy:db:update']).execute!
    end
end
------------------


Capfile:
----------------
load 'deploy' if respond_to?(:namespace) # cap2 differentiator

set :stages, %w(staging production)
require 'capistrano/ext/multistage'
---------------

config/deploy/staging.rb:
---------------
set :application, "myapp"

set :repository, "svn://myrepo/#{application}/trunk"
set :deploy_via, :copy
set :copy_stategy, :export

# NOTE: for some reason Capistrano requires you to have both the
public and
# the private key in the same folder, the public key should have the
# extension ".pub".
ssh_options[:keys] = ["#{ENV['HOME']}/.ssh/mykey.pem"]

role :web,      "myserver"
role :app,      "myserver"
role :db,       "myserver", :primary => true

set :rails_env, "staging"

# EC2 on Rails config. Many of these can be omitted if not needed,
check
# the documentation.
set :ec2onrails_config, {
  # S3 bucket and "subdir" used by the ec2onrails:db:restore task
  :restore_from_bucket => "foo",
  :restore_from_bucket_subdir => "bar",

  # Set a root password for MySQL. Run "cap
ec2onrails:db:set_root_password"
  # to enable this. This is optional, and after doing this the
  # ec2onrails:db:drop task won't work, but be aware that MySQL
accepts
  # connections on the public network interface (you should block the
MySQL
  # port with the firewall anyway).
  :mysql_root_password => "foobar",

  # Any extra Ubuntu packages to install if desired
  # :packages => ["logwatch", "imagemagick"],

  # Any extra RubyGems to install if desired: can be "gemname" or if
a
  # particular version is desired "gemname -v 1.0.1"
  # :rubygems => ["rmagick", "rfacebook -v 0.9.7"],

  # Set the server timezone. run "cap -e
ec2onrails:server:set_timezone" for
  # details
  :timezone => "US/Eastern",

  # Files to deploy to the server (they'll be owned by root). It's
intended
  # mainly for customized config files for new packages installed via
the
  # ec2onrails:server:install_packages task. Subdirectories and files
inside
  # here will be placed in the same structure relative to the root of
the
  # server's filesystem.
  #:server_config_files_root => "../server_config",

  # If config files are deployed, some services might need to be
restarted
  :services_to_restart => %w(apache2 postfix sysklogd),

  # Set an email address to forward admin mail messages to
  :admin_mail_forward_address => "[EMAIL PROTECTED]",
}

require 'ec2onrails/recipes'

namespace :deploy do
  namespace :db do

    # main update task -- run this to upload and then swap databases
    task :update, :roles => :db do
      # exec my task
    end
  end
end
--------------

On Jul 2, 8:22 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
> Could you post your entire script?
>
> - Jamis
>
> On Jul 2, 2008, at 5:50 PM, ben.koski wrote:
>
>
>
> > One more headscratcher for tonight:
>
> > I'm trying to embed Capistrano into a rails app.  I'm using cap 2.4
> > and capistrano-ext to handle stages.  The Capistrano::CLI docs make it
> > seem simple enough to call
>
> > Capistrano::CLI.parse(['staging', "deploy:db:update"]).execute!
>
> > or
>
> > config = Capistrano::Configuration.new
> > config.logger_level = Capistrano::Logger::TRACE
> > config.load "Capfile"
> > config.load "config/deploy/staging"
> > config.set(:stage) {'staging'}
> > config.deploy.db.update
>
> > both of these work _beautifully_ the first time.  Problem is, if I try
> > to execute this twice it blows up on "ArgumentError: defining a task
> > named `symlink' would shadow an existing method with that name" in
> > capistrano/configuration/namespaces.rb.
>
> > Makes sense to raise when trying to redefine something, but the
> > strange thing is that these definitions seem to persist even after
> > config or event the class making the call to CLI has gone out of
> > scope--kind of.  If I try to run config.deploy.db.update a second time
> > without running the config.load, the tasks aren't there.
>
> > Any suggestions?
--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---

Reply via email to