如果视图更改,则使用TeamCity打开MvcBuildViews

脚本

我们有TeamCity 8.1.3构建每个拉取请求。 构建失败在GitHub中报告。 这很棒。 然而,视图错误不会被拾取。 这不好。 我可以在整个开发板上打开MvcBuildViews,但我宁愿不这样做,因为我们的解决方案非常庞大,并且大约可以缩短三倍编译时间。

我只想在PR中的提交中更改视图时启用MvcBuildViews。 例如,如果有人更改.cs文件,然后正常编译。 如果一个.cshtml文件被改变,启用MvcBuildViews并编译。

我试过的

我第一次尝试使用VCS触发器。 我在TeamCity中设置了两个几乎完全相同的项目。 唯一的区别是VCS触发器。 一个构建旨在构建代码更改和其他视图更改。

代码更改触发规则: -:**.cshtml+:**.cs

查看更改触发规则: +:**.cshtml

这不像我所希望的那样。 在同一分支上提交一个.cs文件和一个.cshtml文件会触发这两个版本。

我第二次尝试使用PowerShell构建步骤。 我想知道是否可以使用PowerShell读取teamcity.build.changedFiles.file代理生成属性,确定是否更改了cshtml文件,如果是这样,则将MvcBuildViews设置为true。

这失败了,因为我不知道读取代理属性。 我发现这个相关的SO问题,但它没有奏效。

我的PS构建步骤看起来像这样。 我主要在这里抓着吸管。

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']"

接下来是什么?

有没有人做过这个? 有谁知道我可以如何获得我以前的工作尝试或知道另一种方式来做到这一点?


您可以在此文档中看到teamcity.build.changedFiles.file没有环境变量:预定义的生成参数。

在这种情况下,您可以使用%system.teamcity.build.changedFiles.file%。 TeamCity将传递给PowerShell脚本文件的完整路径,其中包含构建中包含的已更改文件的相关信息。

该文件包含换行分隔的文件:每行对应于一个文件并具有以下格式:

<relative file path>:<change type>:<revision>

以giacomelli的答案为出发点,我创建了这个TeamCity PowerShell构建步骤,该步骤完全符合我的需求。 它读取已更改文件的列表,确定视图是否已更改,如果是,则在所有csproj文件中将MvcBuildViews设置为true。 请注意:

  • 我不是TeamCity或PowerShell的专家,你可能需要整理一下
  • 您不太可能想要在所有csproj文件上设置MvcBuildViews
  • 不太重要的是,当使用这个时,我注意到TeamCity认为构建是随着时间的推移。 不知道是否可以做任何事情。

    $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']"
    }
    

    2014年10月22日更新

    我在这里写了一个稍微更高级的脚本。

    链接地址: http://www.djcxy.com/p/23051.html

    上一篇: Turn on MvcBuildViews using TeamCity if a view is changed

    下一篇: CSS: pure CSS scroll animation