2014-02-19 22 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之后创建了一个完全香草的部署,并逐渐添加了旧部署中的功能,直到它崩溃!