目前我正在使用以下手动过程将我的PHP网站从分段部署到生产:
所有这些过程都是非常复杂的,大概需要5-10分钟,每当我对网站进行更改时,我都必须这样做,所以这已经变得很麻烦。
现在有什么办法使用一些脚本工具来自动化这个过程吗? 还是有一个很好的部署工具,人们使用,可以做到这一切? 我的舞台和生产机器是基于Ubuntu 12.04服务器,所以我可以使用bash脚本来完成一些工作。
我能看到的一些改进可以做到如此:
我所从事的一家公司使用Fabric命令行工具来自动化部署并做这种事情。 然而,这是一个很好的select,还是有更好的工具吗?
织物将是这种任务的理想select。 如果你熟悉python,你可以做很多的灵活性。
Capistrano是另一个可能有用的选项,我用它来进行Rails部署,在那里没有问题。 允许您轻松地在远程主机上运行shell命令。
另一个select可能是使用Ant(Python的方式与织物是更好的IMO)。
你使用源代码控制像git? 当您将其推送到“生产”分支时,您可以将这些任务中的一部分添加为提交后的挂钩。
Rsync将是最快最安全的select。 确保排除不应该在生产中的任何文件(备份文件,vim .swp文件等)。
那么我结束了使用Fabric,并提出了一个脚本,正是我想要的。 在48秒内,所有文件都被复制到一个临时目录,所有文件都被缩小,然后站点显示一个“上传正在进行中的页面”,所有的东西都通过SSH同步到服务器,然后重新生效。
from fabric.api import * import datetime # Format the current date as string 20120908-221521 (8 Sep 2012, 22:15:21) # This will be used to append to the folder of the deployment directory so there's a backup of what was deployed currentDate = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") # Where the files for this deployment are stored deploymentDir = "/var/www/deployments/mysite-deployment-" + currentDate # SSH config for production server env.use_ssh_config = True env.hosts = ["mysite.net"] env.user = "root" env.port = 44 # Test connection to live server def test(): run("ls -al") #-------------------------------------------------------------------------------------- # Main functions - to run use "fab live" from command line to update production server #-------------------------------------------------------------------------------------- def live(): backupToDeploymentDir() switchToProductionFiles() minifyCssAndJavaScript() switchToUpdatesInProgress() rsyncToProduction() switchToLive() print("Deployment " + currentDate + " complete") # Alias for the clearCachedFiles method - to run use "fab cc" or "fab live cc" def cc(): clearCachedFiles() #------------------- # Utility functions #------------------- # Backup to deployment directory def backupToDeploymentDir(): local("cp -a /var/www/staging/ %s" % deploymentDir) # Remove development cache and log files, switch into production mode for htaccess and front controller def switchToProductionFiles(): local("rm -rf " + deploymentDir + "/temp/cache/*") local("rm -rf " + deploymentDir + "/temp/logs/*") local("rm -rf " + deploymentDir + "/fabfile.pyc") local("rm -rf " + deploymentDir + "/nbproject") local("rm " + deploymentDir + "/.htaccess") local("rm " + deploymentDir + "/index.php") local("mv " + deploymentDir + "/live-.htaccess " + deploymentDir + "/" + ".htaccess") # Minify CSS and JavaScript files def minifyCssAndJavaScript(): # Compress CSS local("sudo yui-compressor --line-break 1 -o " + deploymentDir + "/public/css/main.css " + deploymentDir + "/public/css/main.css --type css") local("sudo yui-compressor --line-break 1 -o " + deploymentDir + "/public/css/pdf.css " + deploymentDir + "/public/css/pdf.css --type css") local("sudo yui-compressor --line-break 1 -o " + deploymentDir + "/public/css/print.css " + deploymentDir + "/public/css/print.css --type css") local("sudo yui-compressor --line-break 1 -o " + deploymentDir + "/public/css/reset.css " + deploymentDir + "/public/css/reset.css --type css") # Compress CSS external library files local("sudo yui-compressor --line-break 1 -o " + deploymentDir + "/public/css/lib/fullcalendar.css " + deploymentDir + "/public/css/lib/fullcalendar.css --type css") local("sudo yui-compressor --line-break 1 -o " + deploymentDir + "/public/css/lib/fullcalendar.print.css " + deploymentDir + "/public/css/lib/fullcalendar.print.css --type css") # Compress JavaScript local("sudo yui-compressor -o " + deploymentDir + "/public/js/ajax.js " + deploymentDir + "/public/js/ajax.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/common.js " + deploymentDir + "/public/js/common.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/default.js " + deploymentDir + "/public/js/default.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/global.js " + deploymentDir + "/public/js/global.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/organisation.js " + deploymentDir + "/public/js/organisation.js") # Compress JavaScript external library files local("sudo yui-compressor -o " + deploymentDir + "/public/js/lib/fullcalendar.js " + deploymentDir + "/public/js/lib/fullcalendar.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/lib/head.load.js " + deploymentDir + "/public/js/lib/head.load.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/lib/jquery.js " + deploymentDir + "/public/js/lib/jquery.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/lib/jquery-ui.js " + deploymentDir + "/public/js/lib/jquery-ui.js") local("sudo yui-compressor -o " + deploymentDir + "/public/js/lib/sha512.js " + deploymentDir + "/public/js/lib/sha512.js") # Switch out the main index.php file for updates in progress one, before we rsync def switchToUpdatesInProgress(): run("mv /var/www/updates-index.php /var/www/index.php") # Sync all files from deployment directory to live site then run permissions def rsyncToProduction(): local("rsync -azvv -e \"ssh -p 44\" " + deploymentDir + "/ [email protected]:/var/www") run("chown -R root:www-data /var/www") run("chmod -R 750 /var/www") run("chmod -R 770 /var/www/temp/cache") run("chmod -R 770 /var/www/temp/logs") run("chmod -R 770 /var/www/temp/sessions") run("chmod -R 770 /var/www/library/mPDF/ttfontdata") run("chmod -R 770 /var/www/library/mPDF/tmp") run("chmod -R 770 /var/www/library/mPDF/graph_cache") # Clear cached files from the production server, useful if the PDF or JSON cache output has changed def clearCachedFiles(): run("rm -rf /var/www/temp/cache/*") print("Cached files cleared") # Switch out the updates index.php file for the live one which will put the website live def switchToLive(): run("rm /var/www/index.php") run("mv /var/www/live-index.php /var/www/index.php")