在使用Capistrano部署代码时如何替换共享文件?

时间:2016-01-29 02:58:03

标签: capistrano capistrano3

更新:TL; DR似乎没有内置的方法来实现这一点,因此自定义任务是一个简单的解决方案。

Capistrano提供了在所有版本上共享文件和目录的工具。这很方便,甚至可以对文件提供一些安全性,这些文件不容易更改(或者在不同版本中必须保持相同),例如:数据库配置文件。

但是当谈到替换或只更新其中一个共享文件时,我最终会直接在目标计算机上手动完成。我想对此进行改进,例如要求Capistrano在部署时覆盖部分或全部共享文件。一种具有一定粒度的--force标记。

我不知道有这样的设施,到目前为止在我的搜索中失败了。任何指针?

想一想

这个设施不存在的原因之一(除了我没有找到它!)是它可能比它看起来更难。例如,假设我们有一个共享数据库配置文件,出于安全原因(常见做法)我们将其从版本控制中排除。当前版本依赖于DB配置的版本1。下一版本需要DB配置的第2版。如果部署进展顺利,一切都很好。在使用新版本(例如回归)发生错误后回滚时会变得更难,因为版本1 必须然后才可用。

这种自动化既凉爽又方便,但也很危险。但我手头有实际的用例。

2 个答案:

答案 0 :(得分:0)

一种方法是使用像Chef或Puppet这样的系统配置工具,从Capistrano中清楚地部署配置文件。

另一种方法是创建自定义任务来执行此操作:https://coderwall.com/p/wgs6gw/copy-local-files-to-remote-server-using-capistrano-3

我个人不会经常更改服务器上的配置,也不会在足够的服务器上尝试自动化它。制作一个将所需配置文件复制到所有必需服务器的scp命令已经足够了。

答案 1 :(得分:0)

我创建了一个template方法来执行此操作。例如,我可以有这样的任务:

task :create_database_yml do
  on roles(:app, :db) do
    within(shared_path) do
      template "local/path/to/database.yml.erb",
               "config/database.yml",
               :mode => "600"
    end
  end
end

然后我有一个database.yml.erb模板,它使用fetch(:database_password)之类的内容来填充适当的值。您可以使用Capistrano中的ask方法来提示这些值,以便它们永远不会被提交。

template的实现可以非常简单:您只需要读取文件,通过ERB传递,然后使用Capistrano的upload!将结果放在服务器上。

我的版本比你的版本要复杂得多,但万一你好奇:

https://github.com/mattbrictson/capistrano-mb/blob/7600440ecd3331945d03e059368b75849857f1fb/lib/capistrano/mb/dsl.rb#L104

相关问题