2014-08-30 78 views
1

我與下的lib/Capistrano的/ setup.rake文件中的以下特殊任務部署Web應用程序:爲什麼Capistrano在部署時刪除.git存儲庫?

69 desc "Publish git commit log to changelog.txt" 
70 task :publish_changelog do 
71  on roles(:web) do 
72  log = "#{deploy_to}/current/public/changelog.txt" 
73  execute "echo '============ Last deployed on' `date` ============\n > #{log}" 
74  execute "echo >> #{log}" 
75  execute "cd #{deploy_to}/current && git log --since=\"10 days ago\" >> #{log}" 
76  end 
77 end 

我明白,這是一個特定的任務只是我的應用程序,但我有問題是因爲在我部署我的應用程序後,Capistrano刪除位於服務器角色(:web)上的應用程序中的.git目錄。

上面的命令只有在角色(:web)下的應用程序是git存儲庫時才起作用。實質上,這意味着我必須ssh進入Web服務器,刪除以前是git存儲庫的應用程序「current」,然後再次克隆它。一旦完成,運行上述Capistrano任務即可運行。爲什麼?我肯定錯過了什麼。

這是我推斷出來的。當我部署一個Capistrano應用程序時,Capistrano必須用git目錄替換我的「當前」並粘貼一個新的,有效地刪除.git目錄。雖然Capistrano創建了一個共享目錄和釋放目錄,但它必須粘貼我目前的目錄。這是什麼Capistrano呢?一個導致繼續下去,將不勝感激。我試圖決定命令是否需要重寫,或者如果我需要以某種方式配置Capistrano。謝謝。

回答

3

Capistrano保留在#{deploy_to}/repo克隆存儲庫。有一個很好的路徑變量:repo_path

注意該路徑上的git存儲庫實際上是一個「裸回購」。

擁有這種方式使得性能更合理,因爲回購克隆到此路徑只有一次。之後,回購僅更新更快,特別是對於大回購。在每次部署時將git存儲庫克隆到current_path將需要更長的時間。

這就是說,這裏是你的任務的精簡版,應該工作:

desc "Publish git commit log to changelog.txt" 
task :publish_changelog do 
    on roles(:web) do 
    within repo_path do 
     execute :git, :log, "--since='1100 days ago'" 
    end 
    end 
end 
+0

感謝在@Bruno!順便說一下,你怎麼知道repo_path是一個命名路徑,並且:git和:log是象語法一樣的符號。我一直很難找到一個可靠的參考。 – 2014-09-01 01:28:26

+2

我一直在使用capistrano很多,並閱讀它的源代碼。源代碼非常精美 - 有幾乎所有你可能需要的路徑方法。檢查他們[在這個文件中](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/dsl/paths.rb)。對於命令的符號式語法,請查看[sshkit](https://github.com/capistrano/sshkit)gem - capistrano使用它! – 2014-09-01 13:25:50