TeamCity - 在ASP.net网站上发布的问题

时间:2010-01-05 16:03:51

标签: teamcity

我正在尝试配置TeamCity 5.0以在我的一个项目上运行“发布”目标。

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

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

有没有人遇到同样的问题?

菲利普

7 个答案:

答案 0 :(得分: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。这是一个很棒的turtorial

答案 1 :(得分:3)

如果是WebProject,则可以使用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\" />

答案 2 :(得分:3)

以下是我如何通过TeamCity 5.1.2修改ASP.NET MVC项目的.csproj文件。在.csproj文件中,将AfterBuild目标替换为此XML(如果现有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,因此不会运行额外的目标。您可以通过转到构建配置的“属性和环境变量”页面并添加“系统属性”名称“PublishTarget”和“DeployTarget”并将其值设置为1来覆盖TeamCity中的默认值。

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

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

答案 3 :(得分:2)

我有同样的问题,这是我尝试过的:

我在Visual Studio 2010中有一个解决方案文件,已提交给Mercurial存储库。

我已经为要发布的网站的根目录设置了一个FTP服务器,并且在本地Visual Studio 2010中发布效果很好,它按预期连接和上传所有内容,并且网站正常工作。

现在,我想在每次推送到中央Mercurial存储库时自动执行此操作,并且由于我正在使用TeamCity,我发现指定构建目标的字段,通常是“重建”也可以采用“发布” ,所以我根据文档和帮助指定了“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,那么我会满意

答案 4 :(得分: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的跑步者,你总是可以尝试将一个项目添加到你的解决方案中,这个项目将是最后一个,(或者在最后建立的项目上做),然后进行产卵作为项目上的构建后命令行的技巧。

答案 5 :(得分:1)

TeamCity可以使用sln2008构建运行器发布Web项目 Can TeamCity publish a Web project using the sln2008 build runner?

您尝试发布哪种类型的项目?

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. Publish project from command line

答案 6 :(得分:1)

对于在VS2010中使用Web应用程序项目的任何人,我成功地让TeamCity打包可交付成果,然后在成功构建解决方案之后进行Web部署包。
通过稍微调整,这与在VS中点击“发布”按钮具有相同的效果。

我的解决方案有一些项目,其中一个是ASP.NET MVC Web应用程序项目。我构建解决方案,打包Web应用程序项目,并分三步部署软件包。我还没有想出一个(更好,更简单,更优雅)的方法。

我的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管理服务(即,在https://yourservername:8172/MsDeploy.axd上监听的内容)

有3个构建步骤:

  1. Visusal Studio(sln)目标 =重建,配置 =调试
  2. MSBuild WebProject.csproj,目标 =包命令行 = / p:PackageLocation =%teamcity.build.checkoutDir%\ Debug.zip / p:配置=调试
  3. 命令行可执行文件 =%teamcity.build.checkoutDir%\ Debug.deploy.cmd,参数 = / Y“-setParam:'IIS Web应用程序名称'='默认网站/ PreCreatedAppInIis'”
  4. 在最后一步中,“IIS Web应用程序名称”是实际的参数名称,请勿更改它。它的价值可以是“默认网站”或任何您在IIS中命名的网站和/或它可以是它下面的IIS应用程序路径。如果应用程序不存在,您可能会遇到有关未正确配置应用程序池以托管应用程序的错误。我只是在适当的应用程序池中创建了一个应用程序而不是调查它。就我而言,我的目标是ASP.NET 4.0 x64,默认应用程序池是ASP.NET 2.0 x64。