Capistrano - 如何将文件放入共享文件夹?

时间:2013-09-28 20:09:11

标签: capistrano config web-deployment

我是Capistrano的新手,我看到有共享文件夹和选项:linked_files。我认为共享文件夹用于在版本之间保存文件。但我的问题是,文件最终如何进入共享文件夹?

另外,如果我想将另一个目录符号链接到当前目录,例如某个路径上的静态文件夹,如何将其放在linked_dirs

最后,如何将chmod 755设置为linked_files和linked_dirs。

谢谢。

6 个答案:

答案 0 :(得分:60)

您应用内的文件夹是共享目录中文件夹的符号链接。如果您的应用写入log/production.log,它实际上会写入../shared/log/production.log。这就是文件最终出现在共享文件夹中的方式。

您可以通过查看feature specs or tests in Capistrano来了解其工作原理。

如果你想chmod这些共享文件,你可以直接通过ssh进行一次,因为Capistrano创建后不会修改它们。

要在deploy.rb

中添加链接目录
set :linked_dirs, %w{bin log tmp/backup tmp/pids tmp/cache tmp/sockets vendor/bundle}

set :linked_dirs, fetch(:linked_dirs) + %w{public/system}

答案 1 :(得分:9)

我已经为Capistrano 3写了一个任务,将您的配置文件上传到每个服务器的共享文件夹中,它会按顺序检查这些目录:

  1. 配置/部署/配置/:阶段/ * YML
  2. 配置/部署/配置/ *。YML
  3. 并上传找到的所有配置文件。只有在文件发生变化时才会上传文件。另请注意,如果两个目录上都有相同的文件,则第二个目录将被忽略。

    以下是代码:https://gist.github.com/Jesus/448d618c83fb0445ebbf

    最后一件事,这个任务就是上传配置。文件到您的远程共享文件夹,您仍然需要在linked_files中设置config/deploy.rb,例如:

    set :linked_files, %w{config/database.yml config/aws.yml}
    

    更新:

    如果你正在使用Git,你可能会想忽略这些文件:

    echo "config/deploy/config/*" >> .gitignore
    

答案 2 :(得分:8)

Capistrano 3.5 +

Capistrano 3.5为数组字段引入了appendFrom the official docs,你应该使用这些:

对于共享文件:

append :linked_files, %w{config/database.yml}

对于共享目录:

append :linked_dirs, %w{bin log public/uploads vendor/bundle}

答案 3 :(得分:4)

您可以按照3个简单的步骤来放置一个您不希望在连续版本中更改的文件;将您的文件添加到linked_files列表。

set :linked_files, fetch(:linked_files, []).push('config.php')

选择要共享的所有文件。通过scp

将此文件从本地文件放到远程服务器
scp config.php deployer@amazon:~/capistrano/shared/config.php

现在,通过以下命令进行部署:

bundle exec cap staging deploy

当然, staging 可以根据需求进行更改,可能是生产,沙箱等。

还有一件事,因为您不希望您的团队成员提交此类文件。因此,将此文件放入.gitignore文件中。然后把它推到git远程回购。

答案 4 :(得分:2)

对于Capistrano 3.5 + ,如official doc中所述:

append :linked_dirs, ".bundle", "tmp"

答案 5 :(得分:0)

对我来说,以上方法均无效,因此我最终在部署过程的最后添加了两个功能:

namespace :your_company do
    desc "remove index.php"
    task :rm_files do
        on roles(:all) do
                execute "rm -rf #{release_path}/index.php"
        end
    end
end

namespace :your_company do
    desc "add symlink to index.php"
    task :add_files do
        on roles(:all) do
                execute "ln -sf #{shared_path }/index.php #{release_path}/index.php"
        end
    end
end

after "deploy:finished", "your_company:rm_files"
after "deploy:finished", "your_company:add_files"