什么工具用于自动化建筑和在VS2010中发布内容?

时间:2011-06-07 17:46:27

标签: visual-studio-2010 msbuild msdeploy webdeploy

我正在使用vs 2010并拥有一个Web应用程序项目。 我目前使用“web deploy”选项在项目上右键单击“发布”选项,将整个应用程序发布到运行msdeploy.axd的服务器。

我必须多次发布此项目(100+),每次只更改web.config。

我正在研究应该使用什么技术来自动化这个过程。我更愿意使用标准的MS技术。

我应该看看MSBuild吗? VS命令提示符? (这些是相同的吗?)

我应该学习哪种技术来最好地自动化这种情况。我正在寻找最标准的方法......

在我脑海中,我要写的剧本将是:

  1. 更改web.config文件
  2. 相当于右键单击我的项目,单击发布,使用web-deploy选项,并使用我在Visual Studio中保存的Windows域\用户名+密码详细信息将其部署到该服务器
  3. 感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我已经使用MSBuild做了这件事。我的案件涉及的步骤是:

  1. TFS使用自定义MSBuild项目执行构建,而不是解决方案文件。任何CI构建系统都可以工作,在这种情况下TFS没有什么特别之处。
  2. 在自定义构建项目中,除了构建所有项目之外,我还将一堆web.config“模板”文件复制到$(OutDir)文件夹下的特殊文件夹中。这些将最终导致TFS的构建下降。在我的情况下,内置的配置文件转换远远不够复杂,但如果这对你有用,那么到目前为止它更简单。
  3. web.config文件实际上包含对其他配置文件的引用,每个配置文件对应一个可配置的功能。这使用了自定义配置提供程序。如果您只有一个web.config文件,这种技术也可以使用。
  4. 我从命令行启用了自动部署(发布),作为驱动构建的同一个自定义MSBuild项目中的新MSBuild目标。
  5. 然后很容易将主构建中的Publish步骤自动化到VM或QA机器,并且可以从命令行手动部署到其他服务器(最终是登台服务器)。
  6. web.config模板有这样的东西:

    In the connection string:  "Data Source=${SQLINSTANCE};Initial Catalog=${SQLDATABASENAME}..."
    

    重要的是,可替换令牌的分隔符是$ {}而不是$(),因为MSBuild不会弄乱大括号。

    在“发布”步骤中,使用MSBuild属性函数替换配置文件中的位,以下内容取自MSDN对MSBuild内联任务的描述:

    <UsingTask
       TaskName="ReplaceToken"
       TaskFactory="CodeTaskFactory"
       AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
       <ParameterGroup>
          <File ParameterType="System.String" Required="true" />
          <Token ParameterType="System.String" Required="true" />
          <Replacement ParameterType="System.String" Required="true" />
       </ParameterGroup>
       <Task>
          <Code Type="Fragment" Language="cs">
          <![CDATA[
             string content = File.ReadAllText(File);
             content = content.Replace(Token, Replacement);
             File.WriteAllText(File, content);
          ]]>
          </Code>
        </Task>
     </UsingTask>
    

    然后在您的项目中,您可以使用此任务,

    <ReplaceToken
      File="PathTo\Web.config"
      Token="${SQLINSTANCE}"
      Replacement=".\SQLEXPRESS"
      />
    

    这实际上只是一个粗略的指南,ReplaceToken的所有参数也在MSBuild项元数据中配置,允许选择哪些数据库,服务器,安全性等,每个都可以单独指定。

    因此,对于每个构建/部署,它将执行构建,复制配置模板,对它们执行字符串替换,然后自动执行Package / Publish,这是最后一点。

    你最好的选择是从这个博客开始:http://vishaljoshi.blogspot.com/2009/02/web-packaging-creating-web-packages.html解释了一下,这个答案包含了许多其他相关的StackOverflow帖子MsBuild and MsDeploy with multiple environments,然后用{{在线搜索3}}深入挖掘。我真的很讨厌把你转移到这个部分的搜索引擎,但我发现有很多不同的场景,很难单出一个。十大回复中约有一半对某些有价值的角度有所了解。回复更多信息,以帮助缩小我的响应。对于我的实现,我使用Exec任务直接从MSBuild调用了MSDeploy.exe。有些事情需要考虑:

    • 如何处理各种发布网站的安全性。我不得不设置一堆构建服务帐户,并且总是需要在msbuild命令行上传递密码。如果你可以使用Windows auth,就像你建议它会更容易一些。
    • 对于服务,我必须使用PSExec在远程服务器上运行installutil
    • 我使用PSExec在远程服务器上调用appcmd自动执行了一些其他配置项。
    • 很容易在服务器上打开远程共享并使用“net use”命令在构建期间映射和取消映射,您可能还有其他偏好。
    • 表现很难。对于较大的站点,它可以运行很长时间来逐个文件。 RoboCopy并不快。我发现使用MSDeploy远程打包(指向本地drop作为源,并且包源的远程共享)对Rackspace非常快。您可能需要首先使用一个MSDeploy调用打包到zip文件,然后使用一秒钟远程推送包。

    希望这能让你开始。如果我确实遗漏或掩饰了某些内容,请在您的问题中发表评论或提供更多详细信息。

    对评论的回应:

    “发布”目标就是这些行,

    <Target Name="Publish">
       <!-- token replacement in config files, as above -->
       <!-- ...lots of custom setup, selection of various properties used below -->
       <PropertyGroup>
         <_MsDeployExe>$(PROGRAMFILES)\IIS\Microsoft Web Deploy\msdeploy</_MsDeployExe>
         <_MsDeploySourceArg>-source:contentpath="$(_BuildDropFolder)"</_MsDeploySourceArg>
         <_MsDeployDestArg>-dest:contentpath=\\$(_RemoteComputerName)\DropFolder</_MsDeployDestArg>
       </PropertyGroup>
       <Message
         Text="&quot;$(_MsDeployExe)&quot; -verb:sync $(_MsDeploySourceArg) $(_MsDeployDestArg)"
         />
       <Exec
         Condition="'$(DryRun)' != 'true'"
         Command="&quot;$(_MsDeployExe)&quot; -verb:sync $(_MsDeploySourceArg) $(_MsDeployDestArg)"
         ContinueOnError="false"
         WorkingDirectory="$(MSBuildThisFileDirectory)"
         />
      </Target>
    
相关问题