【问题标题】:Capistrano - How to put files in the shared folder?Capistrano - 如何将文件放入共享文件夹?
【发布时间】:2013-10-04 22:57:01
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: capistrano config web-deployment


    【解决方案1】:

    对我来说,上述方法都不起作用,所以我最终在部署过程的最后添加了两个函数:

    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"
    

    【讨论】:

      【解决方案2】:

      对于 Capistrano 3.5+,在 official doc 中指定:

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

      【讨论】:

        【解决方案3】:

        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}
        

        【讨论】:

        • 提示现在遇到此问题的其他任何人,上面的方法对我不起作用,但这个替代方法可以:append :linked_files, 'config/database.yml', 'etc etc etc', 'etc etc' 也就是说,它不再喜欢数组,它想要字符串。
        • 如果是这种情况,您只需在数组前添加一个 * 即可。 append :linked_files, *%w{.config/database.yml}
        【解决方案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 远程仓库。

        【讨论】:

          【解决方案5】:

          应用中的文件夹是指向共享目录中文件夹的符号链接。如果您的应用程序写入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}
          

          【讨论】:

          • 在最新的 2.x capistrano :linked_dirs 被称为 :shared_children
          • @Michael 为什么不将 public/system 添加到第一组 :linked_dirs 数组中?
          • 应该是两个单独的例子来说明如何编辑设置。
          • capistrano 3.x 好像又是:linked_dirs
          【解决方案6】:

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

          1. config/deploy/config/:stage/*.yml
          2. config/deploy/config/*.yml

          并上传找到的所有配置文件。它只会在文件发生更改时上传文件。另请注意,如果您在两个目录中有相同的文件,则第二个将被忽略。

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

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

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

          更新:

          如果您使用 Git,您可能希望忽略这些文件:

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

          【讨论】:

          • 如果部署失败,这些更改会回滚吗?
          • 不,不会。文件被部署到共享目录并覆盖旧文件,因此即使您尝试手动恢复它们也无法恢复。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-06-30
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 2020-09-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多