2014-10-14 7 views
7

ScenariuszWłącz MvcBuildViews korzystających TeamCity jeśli widok jest zmieniany

Mamy TeamCity 8.1.3 budowę każdą prośbę ciągnąć. Błędy budowania są zgłaszane w GitHub. To jest świetne. Jednak błędy wyświetlania nie są wykrywane. To jest złe. Mogłem włączyć MvcBuildViews na całej płycie, ale wolałbym nie, ponieważ nasze rozwiązanie jest dość duże i z grubsza potraja czas kompilacji.

Co chcę zrobić, to włączyć MvcBuildViews tylko wtedy, gdy widok został zmieniony w zatwierdzeniu w PR. Na przykład, jeśli ktoś zmieni plik .cs, a następnie skompiluj go tak, jak zwykle. Jeśli plik .cshtml zostanie zmieniony, włącz MvcBuildViews i skompiluj.

Co Próbowałem

Moja pierwsza próba wykorzystywane VCS triggers. W TeamCity utworzyłem dwa niemal identyczne projekty. Jedyną różnicą były wyzwalacze VCS. Jedna kompilacja została zaprojektowana do tworzenia zmian w kodzie i innych zmian widoku.

zasady zmiana spustowe Kod: Zasady zmiany wyzwalające -:\**.cshtml i +:**.cs

Widok: +:**.cshtml

To nie działa jak się spodziewałem. Zatwierdzenie pliku .cs i pliku .cshtml w tej samej gałęzi spowoduje wyzwolenie obu wersji.

Moja druga próba polegała na użyciu kroku budowania PowerShell. Zastanawiałem się, czy można użyć PowerShell do odczytu właściwości kompilacji agenta teamcity.build.changedFiles.file, ustalić, czy plik cshtml został zmieniony, a jeśli tak, ustawić MvcBuildViews na true.

Nie powiodło się, ponieważ nie mogłem wymyślić, aby przeczytać właściwości agenta. Znalazłem to relevant SO question, ale nie zadziałało.

Mój krok budowania PS wygląda następująco. W większości trzymam się słomek.

write-host "##teamcity[message text='Starting PhilTest build step']" 

write-host "##teamcity[message text='Build number $env:build_number']" #Outputs build number 

write-host "##teamcity[message text='Changed files $env:teamcity_build_changedFiles_file']" #Outputs nothing 

foreach ($row in $env:teamcity_build_changedFiles_file) 
{ 
    write-host "##teamcity[message text='Changed files row $row']" #Outputs nothing 
} 

write-host "##teamcity[message text='Ending PhilTest build step']" 

Co dalej?

Czy ktoś to wcześniej zrobił? Czy ktoś wie, jak mogę uzyskać jedną z moich wcześniejszych prób pracy lub wiem o innym sposobie jej wykonania?

Odpowiedz

1

Korzystanie odpowiedź Giacomelli jako punkt wyjścia Utworzyłem ten TeamCity PowerShell etapu budowy, która nie dokładnie to, czego chcę. Odczytuje na liście zmienionych plików, określa, czy widok został zmieniony, a jeśli tak, ustawia wartość MvcBuildViews na wartość true we wszystkich plikach csproj.Należy pamiętać:

  • Nie jestem ekspertem lub TeamCity PowerShell, prawdopodobnie będziesz chciał uporządkować to się trochę
  • Jest mało prawdopodobne, będziemy chcieli ustawić MvcBuildViews na wszystkich plików csproj

Co ważniejsze, gdy używam tego, zauważyłem, że TeamCity sądzi, że kompilacja jest z czasem. Nie jestem pewien, czy można coś z tym zrobić.

$changedFileInfoPath = '%system.teamcity.build.changedFiles.file%' 
$fileData = Get-Content $changedFileInfoPath 

$containsViews = $false 

foreach($line in $fileData) 
{ 
    write-host "##teamcity[message text='File contents = $line']" 
    if($line -like "*.cshtml*") 
    { 
     $containsViews = $true 
     break 
    } 
} 

if ($containsViews) 
{ 
    write-host "##teamcity[message text='View changes found']" 

    function xmlPoke($file, $xpath, $value) 
    { 
     $filePath = $file.FullName 

     [xml] $fileXml = Get-Content $filePath 
     $node = $fileXml.SelectSingleNode($xpath) 
     if ($node) 
     { 
      $node.InnerText = $value 

      $fileXml.Save($filePath) 
     } 
    } 

    $workingDirectory = '%teamcity.build.workingDir%' 

    $webCsProjFiles = Get-ChildItem -Path $workingDirectory -Recurse -Include "*.csproj" 

    foreach ($csProjFile in $webCsProjFiles) 
    { 
     xmlPoke $csProjFile "//*[local-name()='MvcBuildViews']" "true" 
     write-host "##teamcity[message text='Set MvcBuildViews true in $csProjFile']" 
    } 
} 
else 
{ 
    write-host "##teamcity[message text='No view changes were found']" 
} 

Aktualizacja 22/10/2014

pisałem nieco bardziej zaawansowaną wersję tego skryptu here.

2

Plik teamcity.build.changedFiles.file nie zawiera zmiennej środowiskowej, co widać w tym dokumencie: Predefined Build Parameters.

W tym przypadku można użyć pliku% system.teamcity.build.changedFiles.file%. TeamCity przekaże do twojego skryptu PowerShell pełną ścieżkę do pliku z informacjami o zmienionych plikach zawartych w kompilacji.

Plik zawiera oddzielne pliki new-line: każda linia odpowiada jeden plik i ma następujący format:

<relative file path>:<change type>:<revision> 
Powiązane problemy