2014-02-19 24 views
1

我正在運行Capifony部署。但是,我注意到Capifony的內置命令針對之前的版本運行,而我的自定義命令正確地針對當前版本。Capifony部署針對以前版本運行一些命令

例如,如果我跑cap -d staging deploy,我看到(加換行符)一些命令的輸出是這樣的:

--> Updating Composer....................................... 
Preparing to execute command: "sh -c 'cd /home/myproj/releases/20130924144349 && 
php composer.phar self-update'" 
Execute ([Yes], No, Abort) ? |y| 

你會看到,這指的是我以前的版本 - 從2013年開始

我也看到了命令,指的是新版本的文件夾中(2014年):

--> Running migrations...................................... 
Preparing to execute command: "/home/myproj/releases/20140219150009/ 
app/console doctrine:migrations:migrate --no-interaction" 
Execute ([Yes], No, Abort) ? |y| 

在我的命令,我用的是#{release_path}變量,而尋找在Capifony的代碼中,它使用#{latest_release}。但顯然我無法改變Capifony的代碼。

This issue against Capistrano談到類似的事情,但我不認爲它真的有幫助,因爲我再也不能改變Capifony的代碼。

如果我刪除服務器上我releases文件夾中,我有一個類似的問題 - #{latest_release}沒有任何價值,所以它試圖做的事情一樣創建一個文件夾/app/cache(因爲代碼是一樣的東西mkdir -p #{latest_release}/app/cache) 。

(假設我不刪除current符號鏈接和文件夾release,當它無法複製的廠商我看到特定的錯誤是:cp: cannot copy a directory, /home/myproj/current/vendor, into itself然而,這是更大的問題只是症狀 - 如果它認爲。新發布實際上是前一個,這就解釋了爲什麼current也指向那裏!)

任何想法?我很高興從我的deploy.rbstaging.rb提供摘錄(我正在使用多級擴展),但並不只是想轉儲整個事情,所以讓我知道你感興趣的東西!謝謝

+0

一些額外的事情,我已經嘗試,因爲:重新安裝capistrano&capifony沒有幫助,也沒有部署到一個完全新創建的主機帳戶(我得到了上面提到的'/ app/cache'創建錯誤因爲沒有以前的版本)。 – Sam

+0

哦,我的同事機器上的回購清單出現了相同的行爲:-( – Sam

回答

0

我終於到了這一個的底部!

我有一個步驟中設置部署之前運行:

before "deploy", "maintenance:enable" 

該維護步驟(正確地)建立維護模式在現有網站(在上面的例子中,我的2013之一)。

但是,維護任務是使用latest_release變量引用以前的版本。由於該步驟在部署之前運行,因此latest_release的確涉及2013版本。但是,一旦使用了latest_release,就會爲其餘的部署運行設置其值 - 因此它仍然設置爲2013版本!

因此,我通過更改維護代碼來解決此問題,以便它不使用latest_release變量。我用current_release代替(這似乎沒有這種副作用)。然而,另一種方法是定義你自己的變量,得到相同的方式及其價值latest_release會:

set :prev_release, exists?(:deploy_timestamped) ? release_path : current_release 

我計算出如何latest_release正在通過查看Capistrano的代碼中設置。在我的環境中,我可以通過執行bundle show capistrano(因爲它與捆綁軟件一起安裝)來實現,但其他設置的方法會有所不同。

雖然我的問題的原因很明確,但我的方法可能會幫助其他人:我在Capifony instructions之後創建了一個完全香草的部署,並逐漸添加了舊部署中的功能,直到它崩潰!