Как я могу использовать PowerShell для обновления качества сборки в предыдущих сборках TFS? - PullRequest
3 голосов
/ 23 февраля 2009

Мы используем TFSDeployer для прослушивания изменений качества сборки и развертывания в нашей промежуточной среде при переходе к «промежуточной».

Я бы хотел, чтобы он продолжал и обновлял все другие сборки, которые в настоящее время имеют качество сборки "Staging", чтобы он был "отклонен".

Похоже, это должно происходить внутри скрипта PowerShell, который выглядит следующим образом:

$droplocation = $TfsDeployerBuildData.DropLocation
ECHO $droplocation

$websourcepath = $droplocation + "\Release\_PublishedWebsites\CS.Public.WebApplication\"
$webdestinationpath = "\\vmwebstg\WebRoot\CreditSolutions\"

new-item -force -path $webdestinationpath -itemtype "directory"
get-childitem $webdestinationpath | remove-item -force -recurse
get-childitem $websourcepath | copy-item -force -recurse -destination $webdestinationpath

$configFile = $webdestinationpath + "web.development.config"
remove-item $configFile -force

$configFile = $webdestinationpath + "web.staging.config"
$configFileDest = $webdestinationpath + "web.config"
move-item $configFile $configFileDest -force

Итак, как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 03 марта 2009

Сначала добавьте функцию Get-tfs в ваш скрипт:

function get-tfs (
    [string] $serverName = $(Throw 'serverName is required')
)
{
    # load the required dll
    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")

    $propertiesToAdd = (
        ('VCS', 'Microsoft.TeamFoundation.VersionControl.Client', 'Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer'),
        ('WIT', 'Microsoft.TeamFoundation.WorkItemTracking.Client', 'Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore'),
        ('BS', 'Microsoft.TeamFoundation.Build.Common', 'Microsoft.TeamFoundation.Build.Proxy.BuildStore'),
        ('CSS', 'Microsoft.TeamFoundation', 'Microsoft.TeamFoundation.Server.ICommonStructureService'),
        ('GSS', 'Microsoft.TeamFoundation', 'Microsoft.TeamFoundation.Server.IGroupSecurityService')
    )

    # fetch the TFS instance, but add some useful properties to make life easier
    # Make sure to "promote" it to a psobject now to make later modification easier
    [psobject] $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($serverName)
    foreach ($entry in $propertiesToAdd) {
        $scriptBlock = '
            [System.Reflection.Assembly]::LoadWithPartialName("{0}") > $null
            $this.GetService([{1}])
        ' -f $entry[1],$entry[2]
        $tfs | add-member scriptproperty $entry[0] $ExecutionContext.InvokeCommand.NewScriptBlock($scriptBlock)
    }
    return $tfs
}

Далее создайте экземпляр объекта TFS

$tfs = get-tfs http://YourTfsServer:8080

Тогда найдите сборки с качеством сборки "Постановка"

$builds = $tfs.BS.GetListOfBuilds("Test Project", "TestBuild") | 
where {$_.BuildQuality -eq "Staging"}

Наконец, обновите качество этих сборок

 foreach ($build in $builds) { $tfs.BS.UpdateBuildQuality($build.BuildUri, "Rejected") }

(я еще не запустил этот скрипт, но вы сможете его запустить без проблем)

Больше информации в моем блоге: Использование объектной модели Team Foundation с PowerShell

Последний совет: если вы обновите качество сборки из скрипта, запущенного из TfsDeployer, вы можете получить 2 скрипта, запущенных одновременно, если у вас есть отображение для перехода Staging -> Rejected! 1019 *

1 голос
/ 24 февраля 2009

Это не полный ответ, так как я не очень разбираюсь в TFSDeployer или в самом деле в PowerScript. Однако .NET API для Team Build может это сделать. Вы хотите получить IBuildDetail для сборки. Самый простой способ получить это, если у вас есть BuildUri (что звучит так, как вы могли бы), и в этом случае вызов IBuildServer.GetBuild должен получить интересующую вас сборку.

IBuildServer также имеет методы QueryBuilds , которые вы сможете вызывать для нахождения интересующих вас сборок, затем вы устанавливаете свойство Quality в IBuildDetails, которое хотите изменить, помня вызвать метод Save () для каждого из них.

Надеюсь, это даст вам начало - извините, это не более полный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...