TeamCity іске қосқан қадам әрдайым жасалады - өзгеріс болмаса да

The problem: I am setting up TeamCity as a build server for an ASP.NET MVC project. I am using Powershell with psake to run msbuild against our .csproj file and create a deployable package. From the build server, I can open up powershell, run the script and, because there are no source code changes, msbuild does not regenerate the project DLL files. BUT, when I call the exact same script from the TeamCity web interface, msbuild ALWAYS rebuilds and regenerates the DLL files even though there are no changes. Not what it should do AFAIK.

Мен бұл мәселені бір қадамға дейін қысқарттым. Оны қарапайым сақтау үшін, менің TeamCity теңшелімін орнатқанмын, сондықтан ол ешқандай көзді басқаруды пайдаланбайды, ол менің powerhell сценарийін шақыратын бір «powerhell» құру қадамын іске қосады.

Powershell сценарийі бір пәрменді іске қосады:

exec { &$msbuild $ProjectFile /t:Package "/p:PackageLocation=$PackageFile;OutDir=$TempPath;Configuration=$Config;SolutionDir=$BaseDir\Source\" /v:m }

Сценарийді қолмен басқаратын пәрмен жолынан қоңырау шалғанда, мен көремін:

CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.

Мен TeamCity арқылы дәл сол сценарийді шақырғанда, мен көремін:

[11:11:26]: CoreCompile:
[11:11:26]:   c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig ...

[11:11:32]: CopyFilesToOutputDirectory:
[11:11:32]:   Copying file from "obj\Demo\Website.Web.dll" to "d:\deploy\Build\package\Demo\temp\Website.Web.dll".
[11:11:32]:   Website.Web -> d:\deploy\Build\package\Demo\temp\Website.Web.dll
[11:11:32]:   Copying file from "obj\Demo\Website.Web.pdb" to "d:\deploy\Build\package\Demo\temp\Website.Web.pdb".
[11:11:32]: _CopyWebApplicationLegacy:
[11:11:32]:   Copying Web Application Project Files for Website.Web
[11:11:32]:   Copying file from "obj\Demo\Website.Web.dll" to "d:\deploy\Build\package\Demo\temp\_PublishedWebsites\Website.Web\bin\Website.Web.dll".
[11:11:32]:   Copying file from "obj\Demo\Website.Web.pdb" to "d:\deploy\Build\package\Demo\temp\_PublishedWebsites\Website.Web\bin\Website.Web.pdb".
[11:11:32]:   Copying file from "d:\deploy\Build\package\Demo\temp\Website.Data.dll" to "d:\deploy\Build\package\Demo\temp\_PublishedWebsites\Website.Web\bin\Website.Data.dll".
[11:11:32]:   Copying file from "d:\deploy\Build\package\Demo\temp\Website.Data.pdb" to "d:\deploy\Build\package\Demo\temp\_PublishedWebsites\Website.Web\bin\Website.Data.pdb".

Бұл сценарийді TeamCity жүйесінен іске қосқан кез-келген идеялар msbuild-ге өзгерістерді анықтауға және қайта жасауға мүмкіндік береді, бірақ дәл сол сценарийді қолмен іске қосады емес пе?

UPDATE: Thinking this might be caused by some quirk with the TeamCity Powershell runner, I just tried making a batch file that passes the script into Powershell.exe and called it using the Command Line runner:

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -File D:\deploy\Build\run-build.ps1 && exit /b %ERRORLEVEL%

мен дәл осындай мінез-құлықты аламын. Егер мен бұл пакеттік файлды пәрмен жолынан шақырсам, msbuild компиляцияны өткізіп жібереді. Егер оны TeamCity деп атасам, DLL-лер қайта топтастырылған.

UPDATE #2: Eureka! I turned on diagnostic debugging in msbuild and found the cause of the forced recompile. It is caused by the GenerateTargetFrameworkMonikerAttribute target. Here is the key bits from the log output:

[15:23:28]: Target "GenerateTargetFrameworkMonikerAttribute" in file "c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets" from project "d:\deploy\source\Website.Data\Website.Data.csproj" (target "BeforeCompile" depends on it):
[15:23:28]: Building target "GenerateTargetFrameworkMonikerAttribute" completely.
[15:23:28]: Output file "C:\TeamCity\buildAgent\temp\buildTmp\.NETFramework,Version=v4.0.AssemblyAttributes.cs" does not exist.
[15:23:28]: Using "WriteLinesToFile" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
[15:23:28]: Task "WriteLinesToFile"
[15:23:28]: Done executing task "WriteLinesToFile".
[15:23:28]: Done building target "GenerateTargetFrameworkMonikerAttribute" in project "SMM.Data.csproj".

Бұл мақсат TEMP айнымалы ортасындағы TEMP айнымалы мәнінде көрсетілгендей AssemblyAttributes файлын жасайды/жаңартады. Әлбетте, TeamCity TEMP ортасының айнымалы мәнін анықтайды және оны келесіге орнатады: C: \ TeamCity \ buildAgent \ temp \ buildTmp және бұл каталог әр салынғаннан бұрын тазаланады.

Мен Get-ChildItem Env деп атасам, мына жағдайды көре аламын: powershell:

TEMP                           C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
TMP                            C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp

Бірақ егер мен оны TeamCity-ден шақырылған авторлық сценарийден шақырсам:

TEMP                           C:\TeamCity\buildAgent\temp\buildTmp            
TMP                            C:\TeamCity\buildAgent\temp\buildTmp   

Негізгі файл мына файлды тіркегеннен кейін:

[15:23:28]: Building target "CoreCompile" completely.
[15:23:28]: Input file "C:\TeamCity\buildAgent\temp\buildTmp\.NETFramework,Version=v4.0.AssemblyAttributes.cs" is newer than output file "obj\Demo\SMM.Data.pdb".

Міне, сондықтан да барлық жоба қайтадан жиналады.

Мен Powershell сценарийін іске қосқан кезде, уақытша каталог өзгертілмеген немесе тазаланбаған, және құрылым күткендей жұмыс істейді.

Мәселен, осы AssemblyAttributes файлын құрайтын каталогты қалай өзгерте алатынымды немесе TeamCity-ге басқа TEMP айнымалы мәнін пайдалануды қалай айтамын? Менің ойымша, бұл мәселе басқа адамдармен айналысады.

Рахмет!

6

2 жауаптар

Мәселен, жоғарыда айтылғандай, «2-жаңарту», ​​мәселе туындаған екі нәрсе: - TeamCity TEMP және TMP ортасын өз уақытша каталогына орнатады - TeamCity әрбір құрылғының алдында осы уақытша каталогты «тазартады» - msbuild процесінің бір бөлігі GenerateTargetFrameworkMonikerAttribute мақсатты іске қосады, ол TEMP ортасының айнымалысы арқылы анықталған каталогта нақты файлды жаңартады - компиляторды бүкіл жобаны

Once I figured this out, I found an applicable answer in this unrelated question: In Visual Studio 2010 why is the .NETFramework,Version=v4.0.AssemblyAttributes.cpp file created, and can I disable this?

Сондықтан мен:


DLL-ті құрастыратын шешімдерімнің екеуіне де және ол жұмыс істеді.

6
қосылды
Мәселені қайта шығара алдым және ұқсас тұжырымдарға келдім. Қалай болса да, жауапты тапқаныңыз жақсы. Жауапты қабылдай отырып, қабылдаңыз.
қосылды автор manojlds, көзі
+1 мұқият түсініктеме беру үшін және оны бөлісу керемет!
қосылды автор Niklas Wulff, көзі
TeamCity икемді қалталарға немесе басқа нақты қалталарға байланысты істеу керек нәрсені жасайды, бұл CI-де жақсы идея емес.
қосылды автор Pavel Sher, көзі

Obliojoe жауабының өзгерісі ретінде, егер сіз жеке жобалық файлдарды өзгерткіңіз келмесе немесе өзгерте алмасаңыз, TEMP қалтасына осы файлдарды резервтік көшіруге және қалпына келтіруге болады:

  1. First attempt to restore the files from a backup:

    copy temp\*.* %%temp%% /y
    echo AssemblyAttributes restore attempted
    
  2. Then perform your build step(s) using TeamCity build runner

  3. Backup the files:

    mkdir temp 2> nil
    copy %%temp%%\*AssemblyAttributes.cs temp /y
    echo AssemblyAttributes files saved
    

Екі партия файлдары сол каталогтан іске қосылуы керек.

Бұл пакеттік файлдардағы соңғы ECHO-ға назар аударыңыз, бұл табысты шығуды қамтамасыз ету үшін (қате коды 0).

0
қосылды