团队城市 - ASP.net站点发布问题

13

我正在尝试配置TeamCity 5.0来运行我的一个项目的"Publish"目标。

当我在VS 2008中加载解决方案并单击项目上的发布时,网站会很好地构建 - 文件自动出现在服务器上等。但是当我通过TeamCity Sln2008运行sln文件时,TeamCity返回:

[项目"Portal.csproj"(发布目标):]跳过不可发布的项目。

有人遇到过同样的问题吗?

Filip


你想要发布什么类型的项目? - Gage
7个回答

4
您可以创建自己的简单构建文件。例如:
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

    <PropertyGroup>
        <PackageFolder>C:\Builds\AppServer\Actual</PackageFolder>
    </PropertyGroup>

    <Target Name="Build" DependsOnTargets="BeforeBuild">
        <MSBuild Projects="TeamWork-AppServer.sln"
                 Targets="Rebuild"
                 Properties="Configuration=Debug;OutDir=$(PackageFolder)\;"></MSBuild>
    </Target>
</Project>

或者您可以使用 VS 2008 Web Deployment Project。这里有一个很好的教程


这是.NET 4.0和Visual Studio 2010,新版本的工具中是否仍然提供Web部署项目?我一直在寻找它们,但找不到。无论如何,现在我有两个建议可以使用MSBuild来完成这个任务,所以我一定会研究一下。 - Lasse V. Karlsen
1
是的,有一个适用于.NET 4的版本。在这里您可以找到它:http://blogs.msdn.com/b/webdevtools/archive/2010/05/26/visual-studio-2010-web-deployment-projects-rtw-available-now.aspx。也许您还可以看一下这个链接:http://microsoftpdc.com/Sessions/FT56。 - Martin Fabik
一个小提示:您需要从http://msbuildtasks.tigris.org/在您的服务器上安装MSBuild社区任务。 - Chris S

3

如果它是一个Web项目,您可以使用Microsoft.WebApplication.targets。除非您在构建代理上安装了Windows SDK,否则您需要将目标文件复制到您的源代码控制中,并通过添加以下内容从您的Web项目引用:

<Import Project="{path to your tools}\Microsoft.WebApplication.targets" />

您可以在此处找到目标文件(根据您的操作系统):

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications

现在你只需要更新你的msbuild任务以引用正确的目标:
<MSBuild Projects="{path to your web project file}"
         Targets="Build;ResolveReferences;_CopyWebApplication"
         Properties="Configuration=Release;Architecture=Any;WebProjectOutputDir={your web root};OutDir={your web root}\bin\" />

3

这是我如何修改ASP.NET MVC项目的.csproj文件以通过TeamCity 5.1.2进行部署。 在.csproj文件中,用以下XML替换AfterBuild目标(如果您现有的AfterBuild中已经有命令,则必须将它们合并到这些目标中):

<PropertyGroup>
    <DeployTarget>0</DeployTarget>
    <PublishTarget>0</PublishTarget>
    <PublishFolder>..\Deployment\YourWebsiteName</PublishFolder>
</PropertyGroup>
<Target Name="PublishProperties">
    <CreateProperty Value="$(PublishFolder)">
    <Output TaskParameter="Value" PropertyName="WebProjectOutputDir"/>
    </CreateProperty>
    <CreateProperty Value="$(PublishFolder)\bin\">
    <Output TaskParameter="Value" PropertyName="OutDir"/>
    </CreateProperty>
</Target>
<Target Name="WebPublish" DependsOnTargets="BeforeBuild;PublishProperties">
    <RemoveDir Directories="$(PublishFolder)"
            ContinueOnError="true" />
    <CallTarget Targets="ResolveReferences;_CopyWebApplication" />
</Target>
<Target Name="Deploy" DependsOnTargets="WebPublish">
    <CreateProperty Value="Path\To\Your\Server" Condition="$(DeployFolder) == ''">
    <Output TaskParameter="Value" PropertyName="DeployFolder"/>
    </CreateProperty>
    <RemoveDir Directories="$(DeployFolder)" Condition="$(CleanDeploy) == 1" />
    <ItemGroup>
    <DeploymentFiles Include="$(PublishFolder)\**\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(DeploymentFiles)"
        DestinationFolder="$(DeployFolder)\%(RecursiveDir)" />
</Target>
<Target Name="AfterBuild">
    <CallTarget Targets="WebPublish" Condition="$(PublishTarget) == 1" />
    <CallTarget Targets="Deploy" Condition="$(DeployTarget) == 1" />
</Target>

这个脚本使用$(PublishTarget)和$(DeployTarget)属性在项目构建完成后触发额外的步骤。PropertyGroup在开头将默认值设置为0,因此不会运行额外的目标。您可以在TeamCity中通过进入构建配置的“属性和环境变量”页面并添加系统属性名称“PublishTarget”和“DeployTarget”,并将它们的值设置为1来覆盖默认值。

Publish目标包含大部分的魔法。它调用Visual Studio的_CopyWebApplication目标将网站输出到PublishFolder。默认情况下,发布文件夹相对于项目文件是".. \ Deployment \ YourWebsiteName",但是这也可以用系统属性进行覆盖。Deploy目标获取由Publish目标输出的文件并将其复制到DeployFolder。在TeamCity中,可以使用系统属性设置DeployFolder,或者可以在Deploy目标中替换“Path\To\Your\Server”路径。

您还可以通过将PublishFolder设置为您的部署目标来跳过额外的Deploy步骤。这个脚本依赖于Visual Studio安装的“Microsoft.WebApplication.Build.Tasks.Dll”和“Microsoft.WebApplication.targets”文件,但是您可以将这些文件从开发工作站复制到构建服务器上。默认位置是“C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications”。


2
我有同样的问题,这是我尝试过的方法:
我在Visual Studio 2010中有一个解决方案文件,提交到了Mercurial存储库中。
我设置了一个FTP服务器用于网站根目录的发布,并且在Visual Studio 2010中本地发布工作得很好,它连接并上传了所有内容,网站也可以正常工作。
现在,我想在每次推送到中央Mercurial存储库时自动化此过程,由于我正在使用TeamCity,我发现构建目标的字段通常为“Rebuild”可以使用“Publish”,因此我指定了“Rebuild;Publish”,如文档和帮助所述。
我已经验证,在Visual Studio中发布并提交新文件后,一个名为ProjectName.Publish.xml的文件会伴随我的ProjectName.csproj文件一起出现,并且当TeamCity构建时,该文件被拉入服务器目录。
然而,没有进行任何发布,当我检查构建日志时,它说:
[19:01:02]: [Project "Test.sln" (Rebuild;Publish target(s)):] Project "Test.UI.Web.csproj" (Publish target(s)):
[19:01:02]: [Project "Test.UI.Web.csproj" (Publish target(s)):] Skipping unpublishable project.
就像这里所说的那样。
请注意,这是开发网站,只是为了让更多人测试更改而发布,因此不要讨论这是否是一个好主意。 注意:我不关心文件以哪种方式发布,我只需要单个TeamCity构建步骤来实际执行它,因此,如果有人拥有类似MSBuild的解决方案,可以绕过TeamCity,那么我会满意。

我已经在这个问题上设置了悬赏,希望能够吸引一些关注。 - Lasse V. Karlsen
我们的构建过程就是这样。我已经发布了一个关于如何通过调用Web项目上的msbuild来使部署工作的答案,但如果您有兴趣,我可以更详细地介绍我们的构建链。 - Bronumski

2

您是否尝试直接执行Visual Studio,而不是依赖于MSBuild直接发布项目。MSBuild无法执行某些类型的项目。我曾经在从Team City内构建MSI时遇到类似的问题。由于不知道您的确切设置,因此我猜测了确切的命令行设置。

<PropertyGroup>    
    <buildconfiguration>Release</buildconfiguration>
    <DevEnv>C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.com</DevEnv>
</PropertyGroup>
<Exec Command="%22$(DevEnv)%22  /build $(buildconfiguration) $(teamcity_build_checkoutDir)\Test.sln /project Test.UI.Web.csproj"/>

如果您使用的是Team City解决方案运行器作为构建运行器,您将需要切换到MSBuild。
如果您想继续使用Team City运行器,您可以尝试向解决方案添加一个最后构建的项目(或在当前最后构建的项目上进行操作),并将生成技巧作为项目的后期构建命令行。

今晚我会试一下这个,看看它的效果如何。如果我成功了,我会发布与TeamCity相关的确切步骤,以备将来参考。最初当我读到你的帖子时,我担心我会失去在TeamCity中作为构建配置的自动运行单元测试和代码覆盖率的能力,但是转换到MSBuild并不会删除这些选项。我想在早期版本中可能会这样做,也许这就是为什么我没有考虑更多地尝试MSBuild的原因。无论如何,我会测试这个。我想我需要确保这只在TeamCity中运行,而不是本地运行。 - Lasse V. Karlsen
在构建代理上安装Visual Studio或任何其他开发应用程序可能会导致许多问题。您最终会在GAC中拥有程序集和其他艺术品,这些艺术品通常不会安装在目标环境中。这导致测试在构建代理上通过,但由于缺少依赖项,您的应用程序在目标环境上失败。如果您的构建代理是干净的,则可以更早地发现此问题。虽然总会有例外情况,但您应该尽可能保持构建环境的清洁,并将与构建相关的所有内容保存在源代码控制中。 - Bronumski
我知道那个问题。我们在我们的环境中解决这个问题的方式是通过一个干净的“构建”代理,它使用msbuild进行编译。那台机器也运行我们所有的测试。构建MSI,使用代码分析是在另一个构建代理上使用VS.NET完成的,在稍后的构建步骤中完成。那应该可以捕捉到大部分的问题。作为最后的保障,您可以有一些简单的自动化烟雾测试,使用来自最后一步的发布版本。如果MSbuild中有一些基本功能而不是VS.NET,则不需要这些功能。如果仍然是一个主要问题,请更换工具。 - Frederik
你看到我下面关于使用微软的'Microsoft.WebApplication.targets' msbuild目标的建议了吗? - Bronumski
啊 - 看漏了。不错。在我的情况下,我仍然需要一种方式来构建MSI。经过一番查找,我没有发现可以用来构建MSI .vdproj的任何东西。 - Frederik

1

TeamCity能否使用sln2008构建运行器发布Web项目 TeamCity能否使用sln2008构建运行器发布Web项目?

您要发布哪种类型的项目?

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/7ec0d942-6354-41c3-9c97-7e7d1f461c29 来自上述链接:

   What I discovered is that "Shared-addins" are not publishable 
and are distinct and different from document and application level 
VSTO addins, which are deployable.
    When I rebuilt my application as an application level 
VSTO addin, the publish option was available.

http://www.automise.com/Default.aspx?tabid=53&aft=9813 从上面的链接中获取:

      Assuming you're using Visual Studio 2008, we're unable to execute the web site 
    publish feature from FinalBuilder as it's partially implemented by the VS IDE. 
    You'll need to use to the MSBuild action to compile the application and then 
    use one of the other actions (FTP, File Copy, etc) in FinalBuilder to perform 
    the deployment. Visual Studio 2010 has fixed this problem by performing the 
    entire publish using MSBuild, see this post for more info: 
http://www.finalbuilder.com/forums....&afv=topic 

这里有两个可能会有帮助的线程

http://devnet.jetbrains.net/thread/280420;jsessionid=5E8948AE810FFFF251996D85E7EB3FE3

Visual Studio。从命令行发布项目


1

对于在VS2010中使用Web应用程序项目的任何人,我成功地将TeamCity配置为在成功构建解决方案后打包交付内容并进行Web部署。
稍加调整后,这与在VS中点击“发布”按钮具有相同的效果。

我的解决方案有几个项目,其中一个是ASP.NET MVC Web应用程序项目。我通过3个步骤构建解决方案,打包Web应用程序项目,并进行msdeploy包部署。我还没有找到更好、更短、更简单或更优雅的方法来完成这个过程。

我的TeamCity服务器上没有安装VS,所以我需要获取C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\Web和C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\Web Applications,并将它们放在TeamCity服务器的同一位置(第二个依赖于第一个)。如果你正在使用x64机器,我建议你从Program Files (x86)和Program Files两个文件夹中都获取。你还需要在你的机器上安装Web Deploy和IIS Management Service(即,监听https://yourservername:8172/MsDeploy.axd的服务)。

有3个构建步骤:

  1. Visusal Studio (sln)Target=Rebuild,Configuration=Debug
  2. MSBuild WebProject.csproj,Targets=Package,Commandline=/p:PackageLocation=%teamcity.build.checkoutDir%\Debug.zip /p:Configuration=Debug
  3. CommandlineExecutable=%teamcity.build.checkoutDir%\Debug.deploy.cmd,Parameters= /Y "-setParam:'IIS Web Application Name'='Default Web Site/PreCreatedAppInIis'"

在最后一步中,“IIS Web Application Name”是一个实际的参数名称,请勿更改。它的值可以是类似于“Default Web Site”的内容,或者是您在IIS中命名的网站名称和/或其下面的IIS应用程序路径。如果该应用程序不存在,则可能会遇到有关应用程序池未正确配置以托管应用程序的错误。与其调查它,我只是在适当的应用程序池中创建了一个应用程序。在我的情况下,我针对ASP.NET 4.0 x64,其中默认应用程序池为ASP.NET 2.0 x64。


1
我一直在第二步出现失败。[12:19:40]: [CopyAllFilesToSingleFolderForPackage] CopyPipelineFiles (1s) [12:19:41]: [CopyPipelineFiles] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets(1966, 5): 将文件 bin\MyGeneration.dOOdads.xml 复制到 obj\Debug\Package\PackageTmp\bin\MyGeneration.dOOdads.xml 失败。找不到文件 'bin\MyGeneration.dOOdads.xml'。[12:19:41]: [Step 2/2] 步骤 MSBuild 失败。有什么想法如何解决这个问题? - sam
请检查您的项目中的输出目录。我将我的项目属性更改为将构建输出放在bin/而不是bin/debug和bin/release中。请查看资源管理器中是否可以找到这些文件。第二步骤的CommandLine可能需要更改为%teamcity.build.checkoutDir%\Debug\Debug.zip或类似的内容。 - scottt732
如果可能的话,您能否清晰地给出第三步的语法,因为在执行命令时我遇到了错误,它说“G:\ test \ Debug.deploy.cmd”不被识别为内部或外部命令。请帮忙。 - sam
MSBuild在构建Package目标(步骤1)后,会在obj\Debug\Package中创建一个Deploy.cmd文件。文件名可能会有所不同(例如YourProject.Deploy.cmd)。'Default Web Site/PreCreatedAppInIis'应该替换为您在IIS中目标应用程序的路径。PreCreatedAppInIis可能是'Default Web Site/YourAppName',或者您可能要部署到根目录的'Default Web Site',或者您可能已将'Default Web Site'重命名为其他名称。重点是应用程序必须已经在IIS中配置好。 - scottt732

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接