Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 23 additions & 21 deletions BuildClient/BuildClient.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -43,54 +43,55 @@
<Reference Include="Autofac.Integration.Wcf">
<HintPath>..\packages\Autofac.Wcf.3.0.0\lib\net40\Autofac.Integration.Wcf.dll</HintPath>
</Reference>
<Reference Include="Microsoft.TeamFoundation.Build.Client, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Reference Include="Microsoft.TeamFoundation.Build.Client, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Build.Client.dll</HintPath>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.TeamFoundation.Build.Client.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.Build.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Reference Include="Microsoft.TeamFoundation.Build.Common, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Build.Common.dll</HintPath>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.TeamFoundation.Build.Common.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.Client, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Reference Include="Microsoft.TeamFoundation.Client, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Client.dll</HintPath>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.TeamFoundation.Client.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Reference Include="Microsoft.TeamFoundation.Common, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Common.dll</HintPath>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.TeamFoundation.Common.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.VersionControl.Client, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Reference Include="Microsoft.TeamFoundation.VersionControl.Client, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Client.dll</HintPath>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.TeamFoundation.VersionControl.Client.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.VersionControl.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Reference Include="Microsoft.TeamFoundation.VersionControl.Common, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Common.dll</HintPath>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.TeamFoundation.VersionControl.Common.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.VersionControl.Common.Integration, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Reference Include="Microsoft.TeamFoundation.VersionControl.Common.Integration, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Common.Integration.dll</HintPath>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.TeamFoundation.VersionControl.Common.Integration.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.Services.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v4.5\Microsoft.VisualStudio.Services.Client.dll</HintPath>
<Private>True</Private>
<Reference Include="Microsoft.VisualStudio.Services.Client">
<HintPath>..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.VisualStudio.Services.Client.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualStudio.Services.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v4.5\Microsoft.VisualStudio.Services.Common.dll</HintPath>
<Reference Include="Microsoft.VisualStudio.Services.Common">
<HintPath>..\..\..\..\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\hwshzicg.nz2\Microsoft.VisualStudio.Services.Common.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Net.Http" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceProcess" />
<Reference Include="System.Xml.Linq" />
Expand Down Expand Up @@ -129,6 +130,7 @@
<Compile Include="BuildManager.cs" />
<Compile Include="TfsBridge.cs" />
<Compile Include="TfsServiceProvider.cs" />
<Compile Include="VsoBridge.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config">
Expand Down
7 changes: 4 additions & 3 deletions BuildClient/BuildManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ public void StartProcessing(object stateInfo)
Tracing.Server.TraceInformation("Server: StartProcessing (loop)");

_lockExpiryTimer =
new Timer(PollBuildServer, null, Timeout.Infinite, Timeout.Infinite);
_lockExpiryTimer.Change(0, Timeout.Infinite);
new Timer(PollBuildServer, null, Timeout.Infinite, GetPollingPeriod());
_lockExpiryTimer.Change(0, GetPollingPeriod());
}

private int GetPollingPeriod()
Expand All @@ -55,7 +55,8 @@ private void PollBuildServer(object state)
() =>
Tracing.Client.TraceInformation(
"Getting list of build store events"),
() => _lockExpiryTimer.Change(DueTime, GetPollingPeriod())
() => { }
//() => _lockExpiryTimer.Change(DueTime, GetPollingPeriod())
);
}
catch (Exception exception)
Expand Down
2 changes: 1 addition & 1 deletion BuildClient/ClientApplication.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ private static IContainer LoadContainer()
var builder = new ContainerBuilder();
builder.RegisterType<BuildConfigurationManager>().As<IBuildConfigurationManager>();
builder.RegisterType<Notifier>().As<INotifier>();
builder.RegisterType<TfsBridge>().As<IBuildEventSystem>();
builder.RegisterType<VsoBridge>().As<IBuildEventSystem>();
builder.RegisterType<BuildStoreEventSource>().As<IBuildStoreEventSource>().SingleInstance();
builder.Register(c => new TfsServiceProvider(c.Resolve<IBuildConfigurationManager>().TeamFoundationUrl,c.Resolve<IBuildConfigurationManager>()))
.As<IServiceProvider>().SingleInstance();
Expand Down
145 changes: 145 additions & 0 deletions BuildClient/VsoBridge.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using BuildClient.Configuration;
using Newtonsoft.Json;

namespace BuildClient
{
public class VsoBridge: IBuildEventSystem, IDisposable
{
private readonly IBuildConfigurationManager _buildConfigurationManager;
private static readonly string Version = "2.0";
private readonly HttpClient _client;
private readonly ResponseList<ProjectDto> _projects;
private readonly List<Tuple<Guid,int, BuildData>> _builds;

public VsoBridge(IBuildConfigurationManager buildConfigurationManager)
{
_buildConfigurationManager = buildConfigurationManager;


var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{_buildConfigurationManager.TfsAccountPassword}"));
var projectsToMonitor = _buildConfigurationManager
.BuildMappers.ToArray();

_client = new HttpClient
{
BaseAddress = new Uri(_buildConfigurationManager.TeamFoundationUrl)
};
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

//connect to the REST endpoint
var response = _client.GetAsync("_apis/projects?stateFilter=All&api-version=1.0").Result;


_builds = new List<Tuple<Guid,int, BuildData>>();
//check to see if we have a succesfull respond
if (!response.IsSuccessStatusCode) return;

//set the viewmodel from the content in the response
var value = response.Content.ReadAsStringAsync().Result;
_projects = JsonConvert.DeserializeObject<ResponseList<ProjectDto>>(value);

var query = from element in projectsToMonitor
from proj in _projects.Value.Where(p => p.Name == element.TfsProjectToMonitor)
select new
{
proj.Id,
BuildName = element.TfsBuildToMonitor
};

foreach (var source in query)
{
var defnUrl =
$"{_buildConfigurationManager.TeamFoundationUrl}/DefaultCollection/{source.Id}/_apis/build/definitions?api-version={Version}&query=Name eq '{source.BuildName}'&statusFilter=completed&$top=1";

var defnResponse = _client.GetAsync(defnUrl).Result;
if (!defnResponse.IsSuccessStatusCode) return;

var buildDefn = defnResponse.Content.ReadAsStringAsync().Result;
var viewModel = JsonConvert.DeserializeObject<ResponseList<BuildDefnDto>>(buildDefn);

_builds.AddRange(
viewModel.Value.Select(buildDefnDto => new Tuple<Guid,int, BuildData>(source.Id, buildDefnDto.Id, new BuildData
{
BuildName = source.BuildName
})));
}
}

public IEnumerable<BuildStoreEventArgs> GetBuildStoreEvents()
{
return from b in _builds
let url =
$"{_buildConfigurationManager.TeamFoundationUrl}/DefaultCollection/{b.Item1}/_apis/build/builds?api-version={Version}&definitions={b.Item2}&$top=1"
let buildResponse = _client.GetAsync(url).Result
let buildValue = buildResponse.Content.ReadAsStringAsync().Result
let dto = JsonConvert.DeserializeObject<ResponseList< BuildDto>>(buildValue)
let first = dto.Value.FirstOrDefault()
select new BuildStoreEventArgs
{
Data = new BuildData
{
BuildName = b.Item3.BuildName,
BuildRequestedFor = first.RequestedFor.DisplayName,
EventType = BuildStoreEventType.Build,
Quality = "",
Status = (BuildExecutionStatus)Enum.Parse(typeof(BuildExecutionStatus), first.Result ?? first.Status ?? "Unknown", true)
},
Type = BuildStoreEventType.Build
};
}

public void Dispose()
{
_client?.Dispose();
}
}

public class ProjectDto
{
public Guid Id { get; set; }
public string Name { get; set; }

public string State { get; set; }

public string Url { get; set; }

public int Revision { get; set; }
}

public class ResponseList<T>
{
public int Count { get; set; }

public T[] Value { get; set; }
}

public class BuildDto
{
public string BuildNumber { get; set; }
public string Result { get; set; }

public string Status { get; set; }

public Person RequestedFor { get; set; }
}

public class Person
{
public string DisplayName { get; set; }
}

public class BuildDefnDto
{
public int Id { get; set; }
}
}
1 change: 1 addition & 0 deletions BuildClient/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
<packages>
<package id="Autofac" version="3.0.2" targetFramework="net45" />
<package id="Autofac.Wcf" version="3.0.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="OctoPack" version="2.0.26" targetFramework="net45" />
</packages>