3

deploy:setupCapistranoを使用してコールドデプロイを実行する適切な方法は何ですか?

使用する

  • これdeploy.rb
  • キャピストラーノv2.14.2
  • サーバーを仮想化するためのVagrant、

これが私のシナリオです:

  1. 実行deploy:setup中、Capistranoはroot権限を使用して、展開用のディレクトリ構造を準備します。

    $ cap deploy:setup
      * 2013-02-28 14:50:21 executing `deploy:setup'
      * executing "sudo -p 'sudo password: ' mkdir -p /home/vagrant/example /home/vagrant/example/releases /home/vagrant/example/shared /home/vagrant/example/shared/system /home/vagrant/example/shared/log /home/vagrant/example/shared/pids"
        servers: ["example.com"]
        [example.com] executing command
        command finished in 29ms
      * executing "sudo -p 'sudo password: ' chmod g+w /home/vagrant/example /home/vagrant/example/releases /home/vagrant/example/shared /home/vagrant/example/shared/system /home/vagrant/example/shared/log /home/vagrant/example/shared/pids"
        servers: ["example.com"]
        [example.com] executing command
        command finished in 11ms
    
  2. しかし、deploy:coldCapistranoが(この場合はgitから)チェックアウトし、ユーザーとして書き込もうとすると、次のようにvagrant指定されたユーザーになりますdeploy.rb

    $ cap deploy:cold
      * 2013-02-28 14:50:47 executing `deploy:cold'
      * 2013-02-28 14:50:47 executing `deploy:update'
     ** transaction: start
      * 2013-02-28 14:50:47 executing `deploy:update_code'
        updating the cached checkout on all servers
        executing locally: "git ls-remote git@github.com:mariusbutuc/realtime-faye.git master"
        command finished in 2360ms
      * executing "if [ -d /home/vagrant/example/shared/cached-copy ]; then cd /home/vagrant/example/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard a7c05516bc31c2c18f89057c02f84bfad83a6b59 && git clean -q -d -x -f; else git clone -q git@github.com:mariusbutuc/realtime-faye.git /home/vagrant/example/shared/cached-copy && cd /home/vagrant/example/shared/cached-copy && git checkout -q -b deploy a7c05516bc31c2c18f89057c02f84bfad83a6b59; fi"
        servers: ["example.com"]
        [example.com] executing command
     ** [example.com :: out] fatal: could not create work tree dir '/home/vagrant/example/shared/cached-copy'.: Permission denied
        command finished in 26ms
    *** [deploy:update_code] rolling back
      * executing "rm -rf /home/vagrant/example/releases/20130228195049; true"
        servers: ["example.com"]
        [example.com] executing command
        command finished in 7ms
    failed: "sh -c 'if [ -d /home/vagrant/example/shared/cached-copy ]; then cd /home/vagrant/example/shared/cached-copy && git fetch -q origin && git fetch --tags -q origin && git reset -q --hard a7c05516bc31c2c18f89057c02f84bfad83a6b59 && git clean -q -d -x -f; else git clone -q git@github.com:mariusbutuc/realtime-faye.git /home/vagrant/example/shared/cached-copy && cd /home/vagrant/example/shared/cached-copy && git checkout -q -b deploy a7c05516bc31c2c18f89057c02f84bfad83a6b59; fi'" on example.com
    
  3. もちろん、deploy:checkレポートには驚くことはありません。2人のユーザーが異なるグループに属しているため、ユーザーはvagrant作成されたディレクトリに書き込むことができません。deploy:setuproot:rootvagrant:vagrant

    $ cap deploy:check
      [...]
    The following dependencies failed. Please check them and try again:
    --> You do not have permissions to write to `/home/vagrant/example'. (example.com)
    --> You do not have permissions to write to `/home/vagrant/example/releases'. (example.com)
    --> `/home/vagrant/example/shared' is not writable (example.com)
    

この背後にある理由は何ですか?また、展開がこの問題に合格するためにまだ満たされていない前提条件は何ですか?

4

2 に答える 2

1

このdeploy:setupタスクはsudo、アプリディレクトリの作成に使用しないでください。これにより、が所有される可能性がありrootます。

deploy.rbあなたはあなたのファイルでそれをオフにすることができます:

set :use_sudo, false
于 2013-03-04T07:12:40.400 に答える
0

Capistranoにはグループ設定がないため、回避策はそのような設定を拡張することです。たとえば、次のようになります。

set :user,  'vagrant'
set :group, 'vagrant'

次に、実行後に所有権を「修正」するタスクを作成しますdeploy:setup

after "deploy:setup", :setup_ownership
task :setup_ownership do
  run "#{sudo} chown -R #{user}:#{group} #{deploy_to} && chmod -R g+s #{deploy_to}"
end

しかし、問題を修正するよりも優れているのは、そもそも問題がないことだけです。そのため、スチュアートの答えは賢明でエレガントです。

于 2013-03-05T00:44:57.560 に答える