如何部署 .NET Web 应用程序?(请提出建议!)

如何部署 .NET Web 应用程序?(请提出建议!)

我们最近升级了 ASP.NET网站Web应用程序我们对部署难度的突然增加感到震惊。考虑到这项任务是多么常见,我想知道人们使用什么插件/软件来部署快速发展、远程存储的项目(即网站)?

一定有比仅仅“发布”更好的方法视觉工作室然后必须手动通过 FTP 传输已更改的文件?尤其是当我们上传 .DLL 时,网站会瘫痪。

有这么多棘手的文件异常,我必须尽可能地自动化该过程,以防止意外上传。

在我们以前的解决方案中(在我们的网站上),我们使用ASP 调度这真是太棒了,整个过程只需单击一下。不幸的是,它对 DLL 不太好(如前所述)。

那么如何你的团队能做到吗?

谢谢您的任何建议。

PS - 我读到过 Visual Studio 2010 应该会解决 VS2005/08 中的这些缺陷,但在此之前...

答案1

我强烈建议使用持续集成。

我们采用团队城市对于 CI,长鳍金枪鱼用于自动化构建。

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 进行测试并确定它已准备好上线后,我们登录到一个简单的网站,只需单击一下,它就可以上线了。

相关内容