2013-10-16 60 views
1

隨着Capistrano的V2子模塊可以包括通過使用選項部署:Capistrano的V3部署git倉庫及其子模塊

set :git_enable_submodules, 1 

在V3這似乎並沒有工作。這個選項是否仍然支持,或者有沒有一種新的方式來達到同樣的目標?

回答

1

正如您在Capistrano源代碼https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/git.rake#L34https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/git.rake#L56中看到的那樣,它使用git archive將代碼簽出到版本目錄中。

代碼轉載於此:

desc 'Clone the repo to the cache' 
task clone: :'git:wrapper' do 
    on roles :all do 
    if test " [ -f #{repo_path}/HEAD ] " 
     info t(:mirror_exists, at: repo_path) 
    else 
     within deploy_path do 
     with git_environmental_variables do 
      execute :git, :clone, '--mirror', repo_url, repo_path 
     end 
     end 
    end 
    end 
end 
desc 'Update the repo mirror to reflect the origin state' 
task update: :'git:clone' do 
    on roles :all do 
    within repo_path do 
     execute :git, :remote, :update 
    end 
    end 
end 
desc 'Copy repo to releases' 
task create_release: :'git:update' do 
    on roles :all do 
    with git_environmental_variables do 
    within repo_path do 
     execute :mkdir, '-p', release_path 
     execute :git, :archive, fetch(:branch), '| tar -x -C', release_path 
    end 
    end 
end 

從我們能夠確定子模塊,不支持。由於永遠不會發布克隆或初始化子模塊的命令,並且git-archive會忽略它們。

做出決定(來源:Capistrano的作者)不要將子模塊「開箱即用」作爲構建它的鉤子,如果你需要的話已經存在了,而且編寫一個附加組件也很簡單,在任務上,您可以按照適合您的方式執行您所需的結帳/更新子模塊。 Capistrano v2子模塊支持通常會給人們帶來意想不到的後果。

考慮到這一點。在更新完成後,可能需要掛鉤update來初始化和更新子模塊,並且檢查如何增加git-archive來做你所需要的。

+2

換句話說:這不是小事,或者你就已經演示瞭如何做到這一點。我相信這是一個非常錯誤的決定,使用git歸檔進行歸檔任務...此外,Rake不支持任務覆蓋開箱即用。我可以看到解決這個問題的唯一方法是清除create_release任務,並重新創建它使用另一個命令用於存檔與子模塊的代碼:( – rosenfeld

+0

「回扣不支持的任務壓倒一切的開箱即用的。」是公然錯,該API肯定自己借給擴展,而不是替代,但這是因爲它是一個構建工具。如果蓋默認設置不適合你,你是鼓勵的。任務文件複製出來的寶石,並在修改它們的應用程序,這就是爲什麼它使用標準工具已建成的標準格式,使人們可以這樣做。你的子模塊的用例是不特別,但它也是適度與存檔一個比較複雜的。隨着現代版本的Git寬子模塊支持多更容易,但檔案更簡單。 –

2

事實證明,很難掛鉤capistrano的任何git任務(因爲它們在舞臺設置之前不存在)。此外,git歸檔不會以任何方式提供對子模塊的支持,因此必須完全替換該部分。

由於顯而易見的原因,複製和粘貼也不是一個選項。

所以我寫了這個簡單的寶石,可以代替git scm。它使用類似於capistrano 2的方法,通過將repo與其子模塊進行克隆。這對我們的目標來說非常簡單和足夠。我懷疑有沒有很多不同的子模塊用法(如果人們試圖避免併發症)。

https://github.com/juanibiapina/capistrano-scm-gitsubmodules

讓我知道,如果它可以幫助你。

更新:

此模塊已被capistrano 3.1.0棄用。試試這個:https://gist.github.com/stevenscg/8176735

2

新拉請求「828」試圖再次實施是: https://github.com/capistrano/capistrano/pull/828

正如@coffeeaddict討論的,這Commit是代碼的廢料則需要在本地部署,直到它與Capistrano本身捆綁在一起。請注意,您需要使用Capistrano> = 3.1.0來使用代碼。

還有另一個Gist建議解決上述策略的一些問題。

2

在capistrano 3.1.x及更高版本中,您可以實施自己的SCM戰略。有一個可用的gem可以幫助使用git submodule,請參閱:https://github.com/i-ekho/capistrano-git-submodule-strategy

注意:您可能必須與repo文件夾的問題,如果你已經使用默認的git的戰略嘗試。只需轉到服務器上的部署目錄並將其刪除,然後再次運行cap deploy以進行修復。