我们最近升级了 ASP.NET网站到Web应用程序我们对部署难度的突然增加感到震惊。考虑到这项任务是多么常见,我想知道人们使用什么插件/软件来部署快速发展、远程存储的项目(即网站)?
一定有比仅仅“发布”更好的方法视觉工作室然后必须手动通过 FTP 传输已更改的文件?尤其是当我们上传 .DLL 时,网站会瘫痪。
有这么多棘手的文件异常,我必须尽可能地自动化该过程,以防止意外上传。
在我们以前的解决方案中(在我们的网站上),我们使用ASP 调度这真是太棒了,整个过程只需单击一下。不幸的是,它对 DLL 不太好(如前所述)。
那么如何你的团队能做到吗?
谢谢您的任何建议。
PS - 我读到过 Visual Studio 2010 应该会解决 VS2005/08 中的这些缺陷,但在此之前...
答案1
我强烈建议使用持续集成。
TeamCity 将从您的源代码存储库中签出代码,然后使用 Rake 构建应用程序、执行单元测试,甚至运行数据库脚本(如果您愿意)。成功构建后,您可以将源代码打包成 zip 文件或将其复制到您选择的目标位置。
尽管 TeamCity 可与所有源代码控制系统配合使用,但我们使用 Git。
使用 TeamCity 和 Rake 与使用 CruiseControl 和 NANT 类似,但无需编辑 XML 文件。当然,如果您愿意,也可以将 TeamCity 与 NANT 一起使用。
从执行构建的 rakefile.rb 中提取的简短示例。恕我直言,比 XML 文件更易于阅读和调试。
require 'albacore'
require 'rexml/document'
require 'find'
VERSION_NO = "1.0"
OUTPUT_PATH = "output"
WEBOUTPUT_PATH = "output/web"
ADMINOUTPUT_PATH = "output/admin"
CONFIG = "Release"
WEB_PATH = "app/Company.Website.Web"
ADMIN_PATH = "app/Company.Website.Admin"
PACKAGE_PATH = "build/package"
DB_SCRIPT_PATH = "Company.Website.DB"
SOLUTION = "Company.Website.sln"
ARTIFACTS_PATH = "d:/build/artifacts/"
DEPLOY_WEB_PATH = "d:/deploy/company/website/"
DEPLOY_ADMIN_PATH = "d:/deploy/company/admin/"
task :default => ['setuptest','assemblyinfo','config','msbuild','createdb','sqlcmd','deploy']
task :setuptest do |setup|
if ENV['BuildNumber'].nil? then ENV['BuildNumber'] = "000" end
VERSION_NO = VERSION_NO + '.' + ENV['BuildNumber']
puts 'Version Number : ' + VERSION_NO
ZIPFILE_WEB = 'Company.Website.Web.' + VERSION_NO
ZIPFILE_ADMIN = 'Company.Website.Admin.' + VERSION_NO
DB_SERVER = "WEB2"
DB_DATABASE = "Website"
CREATEDB_SCRIPT = "app/Company.Website.DB/00CreateDatabaseTEST.sql"
end
assemblyinfotask do |asm|
asm.version = VERSION_NO
asm.company_name = "Company Name"
asm.copyright = "Copyright 2010"
asm.output_file = "CommonAssemblyInfo.cs"
end
task :config do
FileUtils.cp 'NHibernate.test.config', 'NHibernate.config'
end
msbuildtask do |msb|
msb.properties = { :configuration => :Debug }
msb.targets [:Clean, :Build]
msb.solution = "Company.Website.sln"
end
sqlcmdtask :createdb do |sql|
puts "executing sql scripts..."
sql.log_level = :verbose
sql.path_to_command = "sqlcmd.exe"
sql.server = DB_SERVER
sql.database = "master"
sql.scripts << CREATEDB_SCRIPT
end
sqlcmdtask do |sql|
puts "executing sql scripts..."
sql.log_level = :verbose
sql.path_to_command = "sqlcmd.exe"
sql.server = DB_SERVER
sql.database = DB_DATABASE
sql.scripts << "app/Company.Website.DB/01CreateTables.sql"
sql.scripts << "app/Company.Website.DB/02InsertReferenceData.sql"
end
task :deployprep do
FileUtils.remove_dir 'app/Company.Website.Web/obj'
FileUtils.remove_dir 'app/Company.Website.Admin/obj'
end
ziptask :zipweb do |zip|
puts "creating zip package in " + ZIPFILE_WEB
zip.directories_to_zip = ["app/Company.Website.Web"]
zip.output_file = ZIPFILE_WEB + '.zip'
zip.output_path = File.dirname(__FILE__)
end
ziptask :zipadmin do |zip|
puts "creating zip package in " + ZIPFILE_ADMIN
zip.directories_to_zip = ["app/Company.Website.Admin"]
zip.output_file = ZIPFILE_ADMIN + '.zip'
zip.output_path = File.dirname(__FILE__)
end
Albacore 是专为部署 .NET 应用程序而构建的一套 Rake 任务。
答案2
在 Linux 上,我使用了 fabric (fabfile.org) 和 capistrano (capify.org),它们是协助执行远程 SSH 和 SCP 命令的自动化工具。如果您在 Windows 主机上安装了 Cygwin,您应该能够将它们重新用作部署工具。
答案3
可以从命令行运行 Visual Studio 中的“发布”Web 应用程序msbuild "C:\proj\yourprojectpathandfilename.csproj" /deploydir:"C:\some\deploy\dir"
。目标目录是可部署的 Web 应用程序。
涵盖您更大问题的其他答案都很好。我还想补充一点,您应该查看几个开源 Web 应用程序项目并复制您最喜欢的构建过程。
答案4
PyroBatchFTP非常适合这个。它只会推送更改,您可以编写脚本,以便双击批处理文件即可推送。
在瓦斯内特我们已经为自己设置了理想的解决方案,但设置起来相当复杂,但如果可以的话,值得使用其中的部分或全部元素。它就是这样的:
- 所有开发机器上都有 SVN
- 我们的构建/部署服务器上的 SVN
- Cruisecontrol.net监视 SVN 的更改,并将构建和暂存所需的文件到暂存文件夹
- 使用 PyroBatchFTP,我们推送到暂存站点(由 Cruisecontrol 触发,因此会自动发生)
- 使用 IIS7 和应用程序请求路由(ARR)和 URL 重写,我们有以下暂存/生产设置:
- 前面的 ARR 会将流量引导至实例 01 或 02,具体取决于哪个实例处于“实时”状态,哪个实例处于“暂存”状态
- FTP 帐户始终绑定到“staging”
- 我有另一个迷你管理网站,只需单击一下即可切换暂存和实时版本。切换只需 1 秒钟,且不会停机,如果我们发现该版本有问题,我们可以再次切换回来(尽管这种情况很少见,因为我们可以在上线前轻松测试)。
因此,最终结果使我们能够签入 SVN,并让它自动构建并推送到生产环境,而无需任何手动交互。在我们对暂存 URL 进行测试并确定它已准备好上线后,我们登录到一个简单的网站,只需单击一下,它就可以上线了。