我总是使用一个非常简单的bash脚本来部署代码。我正在将Subversion用于Mercurial,但我并不认为修订控制软件对于部署很重要。
有什么方法可以做到这一点?
#!/bin/sh
date=`date +%Y%m%d_%H%M%S`
tar -zcvf app-dir-$date.tar.gz app/dir
tar -zcvf app-templates-$date.tar.gz app/templates
tar -zcvf app-media-$date.tar.gz app/media
svn export http://example.com/somepath/trunk hh/ --force
我用 Mercurial管理一切 ,包括我的静态HTML页面。它让我的生活变得非常轻松。
好处包括
免责声明,我写了教程。是的,您使用的VCS在某种程度上确实很重要。例如,我不会在这种情况下使用某些东西,我无法在本地提交并进行一次大的推送/更新。这只会迫使我将太多可能存在问题的变化归结为一个承诺。
I可以用Subversion来做,而我根本不会敲击SVN。我只是认为Mercurial是一个更好的工具,可以解决您要解决的问题。
我认为除非你别无选择,否则你不应该“解决”你的工具。这样做有点失败了拥有它们的目的,你有一个选择:)
除了其他答案中的出色建议之外,您可能还需要考虑进行原子更新是否重要。
在我的FreeBSD服务器上,我通过两种机制完成此任务:
版本化我的所有静态资源。 (例如http://static.example.com/images/logo.1.png
或http://static.example.com/style/main.3.css
)。这允许我在更新动态站点之前直接svn update
静态站点,而不必担心用户在旧页面中看到新文件。
对整个动态网站进行版本控制。在我的例子中,我的文档根指向一个符号链接。我的策略是让新版本的生产到位,然后用一个命令推送它。 。G。这样的事情:
cp -Rp www.site1.com.1 www.site1.com.2
(或svn checkout
)
svn update site1.com.2
(可能首先需要svn switch
)
ln -sf site1.com.2 www.site1.com
(原子地将更改转换为生产)
这可以确保我的所有用户都不会看到半生不熟的页面。他们要么看到旧版本,如果它仍然在他们的缓存中,或者新版本。
如果您不将用户上传的内容与动态网站混合,此策略仅适用。
在推出更新之前,使用版本控制是不是需要关注自己备份网站?
如果它正确完成,svn update
(或等效)应该足够了,如果是错误,那么将其回滚到之前的提交?无论如何,这就是我们所做的。提交所有更改,svn update
登台服务器,如果一切正常则svn update
实时服务器。