특정 사용자 지정 인수가있는 빌드 정의 목록을 반환하는 SQL 쿼리에 대한 도움이 필요합니다.
이 쿼리를 살펴 보았지만 더 드릴 다운하는 방법을 파악하는 데 약간의 어려움이 있습니다.
;WITH XMLNAMESPACES('clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow' AS mtbwa,
DEFAULT 'clr-namespace:System.Collections.Generic;assembly=mscorlib'),
q AS (
SELECT CAST(bd.ProcessParameters AS XML) p
FROM dbo.tbl_BuildDefinition bd
)
SELECT
X.Doc.query('mtbwa:BuildSettings') AS 'Node',
X.Doc.value('(mtbwa:BuildSettings/@ProjectsToBuild)[1]', 'VARCHAR(100)') AS 'ProjectsToBuild'
FROM q
CROSS APPLY p.nodes('/Dictionary') AS X(Doc)
다음은이 쿼리에서 반환 된 XML의 예입니다.
<Dictionary x:TypeArguments="x:String, x:Object" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<mtbwa:BuildSettings x:Key="BuildSettings" ProjectsToBuild="$/ACME/Dev/v1.0.0/Source/ACME/ACME.sln">
<mtbwa:BuildSettings.PlatformConfigurations>
<mtbwa:PlatformConfigurationList Capacity="1">
<mtbwa:PlatformConfiguration Configuration="ACMS Website" Platform="Any CPU" />
</mtbwa:PlatformConfigurationList>
</mtbwa:BuildSettings.PlatformConfigurations>
</mtbwa:BuildSettings>
<mtbwa:TestSpecList x:Key="TestSpecs" Capacity="1">
<mtbwa:TestAssemblySpec MSTestCommandLineArgs="{x:Null}" TestSettingsFileName="{x:Null}" AssemblyFileSpec="**\*test*.dll" CategoryFilter="!CodedUITest" />
</mtbwa:TestSpecList>
<mtbwa:SourceAndSymbolServerSettings x:Key="SourceAndSymbolServerSettings" SymbolStorePath="\\ACME.com\dfs\USA\AppDev\TeamBuild\Symbols" />
<mtbwa:AgentSettings x:Key="AgentSettings" MaxWaitTime="04:00:00" Name="*" Tags="" />
<x:Boolean x:Key="SCA">False</x:Boolean>
<x:String x:Key="SSCProjectVersion">ACME v1.0.0</x:String>
</Dictionary>
<x:Boolean x:Key="SCA">False</x:Boolean>
반환 된 XML 의 일부로 이동 하려고합니다 . 이를 수행하는 방법에 대한 아이디어는 항상 감사합니다.
해결책
크레딧은 제안에 대한 jessehouwing에게갑니다.
TfsTeamProjectCollection server = new TfsTeamProjectCollection(new Uri("http://acmetfs:8080/tfs"));
server.EnsureAuthenticated();
IBuildServer build = (IBuildServer)server.GetService(typeof(IBuildServer));
IBuildDefinition buildDefinition = build.GetBuildDefinition("ACME", "ACME_v1.0.0");
object argumentValue;
if (WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters).TryGetValue("SCA", out argumentValue))
{
Console.WriteLine(argumentValue);
}
경고
TFS 운영 데이터 저장소를 직접 쿼리하는 것은 권장되지 않으며 이러한 필드의 내용은 공지없이 릴리스와 핫픽스간에 변경 될 수 있습니다. 이를위한 공식적인 방법은 클라이언트 개체 모델을 사용하는 것입니다. 실수로 데이터를 변경하면 서버가 지원되지 않는 상태가됩니다.
TFS 클라이언트 개체 모델은 빌드 정의를 쿼리 하는 비교적 쉬운 API를 제공합니다 . 여기에서 표준 .NET XML 클래스 (Linq-2-XML 또는 표준 XPathNavigator)를 사용하여 원하는 정보를 빠르게 얻을 수 있습니다. 찾고있는 매개 변수 는 빌드 메타 데이터에 저장 될 수도 있습니다 .
이로 인해 다음 코드가 생성됩니다 (OP에서 제공).
TfsTeamProjectCollection server = new TfsTeamProjectCollection(new Uri("http://acmetfs:8080/tfs"));
server.EnsureAuthenticated();
IBuildServer build = (IBuildServer)server.GetService(typeof(IBuildServer));
IBuildDefinition buildDefinition = build.GetBuildDefinition("ACME", "ACME_v1.0.0");
object argumentValue;
if (WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters).TryGetValue("SCA", out argumentValue))
{
Console.WriteLine(argumentValue);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다