50

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

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

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

谢谢你。

4

6 回答 6

65

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

您可以通过查看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}
于 2013-10-10T21:02:38.423 回答
12

卡皮斯特拉诺 3.5+

Capistrano 3.5append为数组字段引入。从官方文档,你应该使用这些:

对于共享文件:

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

对于共享目录:

append :linked_dirs, %w{bin log public/uploads vendor/bundle}
于 2017-02-19T00:31:57.813 回答
11

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

  1. config/deploy/config/:stage/*.yml
  2. 配置/部署/配置/*.yml

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

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

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

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

更新:

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

echo "config/deploy/config/*" >> .gitignore
于 2014-05-07T14:36:15.340 回答
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

当然,可以根据要求更改分期,可能是生产,沙盒等。

还有一件事,因为您不希望您的团队成员提交此类文件。所以,把这个文件放到你的 .gitignore 文件中。并将其推送到 git 远程仓库。

于 2015-12-06T16:23:21.667 回答
4

对于 Capistrano 3.5+,如官方文档中所述:

append :linked_dirs, ".bundle", "tmp"
于 2017-03-23T09:33:25.673 回答
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"
于 2019-07-29T11:35:05.377 回答