我听说过“部署应用程序”这个词组,它听起来比单独修改文件上传到服务器更好/更容易/更可靠,但我不知道该从何开始。
我有一个Zend框架应用程序,它受版本控制(在Subversion存储库中)。我如何“部署”我的应用程序?如果我有一个“上传”目录,我不想覆盖它,应该怎么办?
我通过第三方托管我的应用程序,所以我除了FTP之外不太了解。如果其中任何步骤涉及登录到我的服务器,请解释该过程。
我听说过“部署应用程序”这个词组,它听起来比单独修改文件上传到服务器更好/更容易/更可靠,但我不知道该从何开始。
我有一个Zend框架应用程序,它受版本控制(在Subversion存储库中)。我如何“部署”我的应用程序?如果我有一个“上传”目录,我不想覆盖它,应该怎么办?
我通过第三方托管我的应用程序,所以我除了FTP之外不太了解。如果其中任何步骤涉及登录到我的服务器,请解释该过程。
svn export svn://path/to/repository/tags/RELEASE_VERSION /usr/local/application/releases/TIMESTAMP
unlink /usr/local/application/current && ln -s /usr/local/application/releases/TIMESTAMP /usr/local/application/current
ln -s /usr/local/application/var /usr/local/application/releases/TIMESTAMP/var
/usr/local/application/current/scripts/migrate.php
(假设您的应用程序位于/usr/local/application/current
中)
Alias /uploads /home/user/uploads/
如果您对服务器没有足够的控制权,则选择会更少。
我有一个脚本,可以将给定的脚本部署到开发/生产网站(它们都在同一台服务器上运行)。
#!/bin/sh
REV=2410
REVDIR=$REV.20090602-1027
REPOSITORY=svn+ssh://topbit@svn.example.com/var/svn/website.com/trunk
IMAGES=$REVDIR/php/i
STATIC1=$REVDIR/anothersite.co.uk
svn export --revision $REV $REPOSITORY $REVDIR
mkdir -p $REVDIR/tmp/templates_c
chown -R username: $REVDIR
chmod -R 777 $REVDIR/tmp $REVDIR/php/cache/
chown -R nobody: $REVDIR/tmp $REVDIR/php/cache/ $IMAGES
dos2unix $REVDIR/bin/*sh $REVDIR/bin/*php
chmod 755 $REVDIR/bin/*sh $REVDIR/bin/*php
# chmod -x all the non-directories in images
find $IMAGES -type f -perm -a+x | xargs -r chmod --quiet -x
find $STATIC1 -type f -perm -a+x | xargs -r chmod --quiet -x
ls -l $IMAGES/* | grep -- "-x"
rm dev && ln -s $REVDIR dev
我将修订号和日期/时间放在检出目录名称中使用。中间的chmod也确保图像的权限正确,因为它们也链接到我们专用的图像服务器。
最后发生的事情是旧的符号链接.../website/dev/被重新链接到新检出的目录。然后Apache配置具有.../website/dev/htdocs/的文档根目录。
还有一个匹配的.../website/live/htdocs/文档根目录,同样,“live”是另一个符号链接。这是我的另一个脚本,将删除live符号链接,并用dev指向的内容替换它。
#!/bin/sh
# remove live, and copy the dir pointed to by dev, to be the live symlink
rm live && cp -d dev live
我每隔几天只推送一次新版本的网站,所以你可能不想一天使用多次(我的APC缓存不喜欢有几个版本的网站),但对于我来说,我发现这对我的部署非常无问题。
检查fredistrano,它是capistrano的克隆版 运行良好(安装有点混乱,但最终运行良好)
经过三年的学习,我对部署最佳实践有了一些了解。我目前使用一个叫做Capistrano的工具,因为它易于设置和使用,并且可以很好地处理许多默认值。
自动化部署流程的基本步骤如下:
脚本通过SSH连接到您的生产服务器,该服务器具有以下目录结构:
/your-application
/shared/
/logs
/uploads
/releases/
/20120917120000
/20120918120000 <-- 您的应用程序的最新版本
/app
/config
/public
...etc
/current --> 符号链接到最新版本
您的Apache文档根目录应设置为/your-application/current/public
脚本在releases目录中创建一个带有当前日期时间的新目录。在该目录中,您的代码将更新为您指定的标签。
需要在版本之间保留的内容放在共享目录中,并创建符号链接到这些共享目录。
require
一组类文件。这会导致不兼容的更改被少数用户使用(而且PHP不会知道这一点,因为每个文件的前后状态都在同一路径上)。将重新生成Apache vhost配置文件的脚本指向发布路径,然后进行优雅的reload
是否更安全? - halfer这取决于您的应用程序以及测试的可靠程度。
在我工作的地方,所有内容都会被检入存储库进行审核,然后才会发布。
对于我们来说,从存储库自动更新并不明智,因为有时我们只是为了让其他开发人员拉取更新版本并合并其更改而进行检入。
要做到您所说的需要某种形式的二次检入和检出,以允许开发人员在主要检入区域之间进行协作。虽然我不知道那是否可能或者如何实现。
还存在分支等功能的问题需要处理。