ฉันได้รับมันส่วนใหญ่ทำงานโดยไม่มีสคริปต์ msbuild ที่กำหนดเอง นี่คือการตั้งค่าการกำหนดค่าการสร้าง TeamCity ที่เกี่ยวข้อง:
เส้นทางของสิ่งประดิษฐ์:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp
ประเภทของนักวิ่ง: MSBuild (Runner สำหรับไฟล์ MSBuild)
สร้างเส้นทางของไฟล์: MyProject \ MyProject.csproj
ไดเรกทอรีการทำงาน: เหมือนกับไดเรกทอรีชำระเงิน
รุ่น MSBuild: Microsoft .NET Framework 4.0
MSBuild ToolsVersion: 4.0
เรียกใช้แพลตฟอร์ม: x86
เป้าหมาย: แพ็คเกจ
พารามิเตอร์บรรทัดคำสั่งเพื่อ MSBuild.exe: / p: Configuration = Debug
สิ่งนี้จะคอมไพล์แพ็คเกจ (ด้วยการแปลง web.config) และบันทึกผลลัพธ์เป็นส่วน สิ่งเดียวที่ขาดหายไปคือการคัดลอกเอาต์พุตไปยังตำแหน่งที่ระบุ แต่สามารถทำได้ในการกำหนดค่าการสร้างของ TeamCity อื่นด้วยการพึ่งพาสิ่งประดิษฐ์หรือสคริปต์ msbuild
ปรับปรุง
นี่คือสคริปต์ msbuild ที่จะรวบรวมแพ็คเกจ (พร้อมการแปลง web.config) และคัดลอกผลลัพธ์ไปยังเซิร์ฟเวอร์ staging ของฉัน
<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<SolutionName>MySolution</SolutionName>
<SolutionFile>$(SolutionName).sln</SolutionFile>
<ProjectName>MyProject</ProjectName>
<ProjectFile>$(ProjectName)\$(ProjectName).csproj</ProjectFile>
</PropertyGroup>
<Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />
<Target Name="BuildPackage">
<MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
</Target>
<Target Name="CopyOutput">
<ItemGroup>
<PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
</ItemGroup>
<Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\build02\wwwroot\$(ProjectName)\$(Configuration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>
</Project>
คุณยังสามารถลบคุณสมบัติ SolutionName และ ProjectName จากแท็ก PropertyGroup และส่งต่อไปยัง msbuild
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
อัปเดต 2
เนื่องจากคำถามนี้ยังคงได้รับปริมาณข้อมูลที่ดีฉันคิดว่ามันคุ้มค่าที่จะอัปเดตคำตอบของฉันด้วยสคริปต์ปัจจุบันของฉันที่ใช้Web Deploy (หรือที่รู้จักในชื่อ MSDeploy)
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<ProjectFile Condition=" '$(ProjectFile)' == '' ">$(ProjectName)\$(ProjectName).csproj</ProjectFile>
<DeployServiceUrl Condition=" '$(DeployServiceUrl)' == '' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
</PropertyGroup>
<Target Name="VerifyProperties">
<!-- Verify that we have values for all required properties -->
<Error Condition=" '$(ProjectName)' == '' " Text="ProjectName is required." />
</Target>
<Target Name="Build" DependsOnTargets="VerifyProperties">
<!-- Deploy using windows authentication -->
<MSBuild Projects="$(ProjectFile)"
Properties="Configuration=$(Configuration);
MvcBuildViews=False;
DeployOnBuild=true;
DeployTarget=MSDeployPublish;
CreatePackageOnPublish=True;
AllowUntrustedCertificate=True;
MSDeployPublishMethod=RemoteAgent;
MsDeployServiceUrl=$(DeployServiceUrl);
SkipExtraFilesOnServer=True;
UserName=;
Password=;"
ContinueOnError="false" />
</Target>
</Project>
ใน TeamCity ฉันมีพารามิเตอร์ชื่อenv.Configuration
, และenv.ProjectName
env.DeployServiceUrl
นักวิ่ง MSBuild มีพา ธ ไฟล์บิลด์และพารามิเตอร์ถูกส่งโดยอัตโนมัติ (คุณไม่จำเป็นต้องระบุในพารามิเตอร์บรรทัดคำสั่ง)
คุณสามารถเรียกใช้จากบรรทัดคำสั่ง:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService