【问题标题】:Difference between current_path vs release_path in Capistrano?Capistrano 中 current_path 与 release_path 的区别?
【发布时间】:2014-06-18 00:41:58
【问题描述】:

Capistrano中current_pathrelease_path路径变量有什么区别,如

task :path do
    on roles :app do
        puts "Release path: #{release_path}"
        puts "Current path: #{current_path}"
    end
end

current_path 是否始终包含最新的代码?

【问题讨论】:

    标签: ruby-on-rails capistrano


    【解决方案1】:

    由于这没有得到满意的答案,我将添加我发现的内容。

    查看this blog post我们可以看到path变量指向的位置:

    current_path – deploy_to + current_dir 的路径(例如 /u/apps/example/current ) release_path – release_path + release_name 的路径(例如 /u/apps/example/releases/20100624000000 )

    所以回答你的问题:是的,current_path 确实指向最新的代码(最新的部署)。它通过符号链接指向最新版本目录。如果您对所有文件夹的含义感兴趣,请查看capistrano structure

    release_path 的不同之处在于它指向您当前正在部署的版本的路径。如果您想在部署期间引用存储库中的文件(例如运行脚本),这将非常有用。

    但是,release_path 仅在deploy:starting 命名空间期间更新,在任何其他时间,它与current_path 完全相同。 请参阅此github isssue 了解更多信息。

    我的特定用例是我想使用位于我的回购根目录中的composer.phar 运行composer install。所以,按照the documentation 我这样做了:

    SSHKit.config.command_map[:composer] = "#{release_path}/composer.phar"
    

    但这不起作用,因为在定义 this 时,release_path 仍然指向 current_path

    我找到的解决方法来自this answer,它是懒惰地评估release_path

    SSHKit.config.command_map[:composer] = lambda { "#{release_path}/" + fetch(:src_path) + "/composer.phar" }
    

    所以只要在deploy:starting命名空间之后访问变量,release_path就会按照我们的预期设置。

    【讨论】:

    • 这正是我一直在寻找的。谢谢!
    【解决方案2】:

    我觉得有必要在这里回答以澄清关于 current_pathrelease_path

    的一些事情

    Capistrano 分阶段工作,因此为了回答这个问题,我将描述以下重要阶段。

    第 1 阶段:在 current_dir 重新链接之前

    在我正在查看的 Capistrano 版本中,“当前”目录的“链接”发生在任务中

    deploy:create_symlink
    

    但是您应该检查您的 capistrano 设置以获取确切的任务名称。在 capistrano 终端输出中很容易看到,只需查找对“ln -s”的 sshkit 调用。

    在此步骤运行之前

    • current_dir 是符号链接的路径,指向由 capistrano 的最后 [非当前] 运行创建的 last 目录。 不是真的是最新的吗?或者不会很长时间......
    • release_dir 是在此次 capistrano 运行中创建的最新签出版本。

    所以要特别注意,在这个阶段在 current_dir 中工作的任何东西都在在错误的地方工作。

    第 2 阶段:current_dir 重新链接后

    AFTER 符号链接步骤运行 [它将在 release_dir 上运行“ln -s”,链接到 current_dir(它并不是真正的目录,它是一个链接。无论如何.....)]

    • current_dir 是符号链接的路径,指向 release_dir。现在它确实是最新的
    • release_dir 是在此次 capistrano 运行中创建的最新签出版本。

    在这个阶段,您的任务是在 release_dir 还是 current_dir 中工作不再重要,它们指向的是磁盘上的“相同”文件。 p>

    为什么这很重要?

    在符号链接更改之前工作通常更可取,因为如果出现故障,不会造成任何中断。在这个阶段,您必须使用 release_dir

    如果您在符号链接更改后工作,您仍然可以使用 release_dir。如果您使用 current_dir,问问自己为什么不使用 release_dir, 并问自己为什么在符号链接更改之后运行这些构建步骤。如果您可以在符号链接更改之前移动它们,那么您应该这样做。在 我正在查看的设置,我这样做了

    before "deploy:create_symlink",  "a_task_that_must_use_release_dir"
    

    如果您在符号链接更改后、网络服务器重新启动之前在 current_dir 中工作,并且遇到问题,则您可能已经破坏了您的环境。

    这会使 current_dir 变得邪恶吗?我不这么认为,权力越大,责任越大。

    【讨论】:

      【解决方案3】:

      每次您使用 Capistrano 部署 Rails 应用程序时,都会在 Releases 目录中创建一个新目录,并以新版本作为文件名。该目录包含最新的代码。 current symlink directory 将指向最新创建的目录来运行应用程序。

      任务 rake、bundle 等将在创建单独目录的共享路径目录上运行

      我们可以使用rollback 之类的命令恢复发布

       cap deploy:rollback # capistrano 2
       cap stage_name rollback  #capistrano 3
      

      希望对你有所帮助。

      【讨论】:

      • 答案是不确定的
      猜你喜欢
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多