Add finish build triggers along with snapshot dependencies when updating TeamCity dependencies

This commit is contained in:
Pranav K 2014-03-26 17:12:34 -07:00
parent ccaaaeb392
commit 8b2137189e
4 changed files with 103 additions and 18 deletions

View File

@ -0,0 +1,18 @@
using System.Collections.Generic;
namespace TCDependencyManager
{
public class Triggers
{
public List<Trigger> Trigger { get; set; }
}
public class Trigger
{
public string Id { get; set; }
public string Type { get; set; }
public Properties Properties { get; set; }
}
}

View File

@ -8,7 +8,7 @@ namespace TCDependencyManager
{
class Program
{
private static readonly string[] _excludedRepos = new[] { "xunit", "kruntime", "coreclr", "universe" };
private static readonly string[] _excludedRepos = new[] { "xunit", "kruntime", "coreclr", "universe", "rolsyn" };
static int Main(string[] args)
{
@ -39,7 +39,10 @@ namespace TCDependencyManager
Console.WriteLine("Ensuring dependencies are consistent on TeamCity");
foreach (var repo in repos.Where(p => p.Dependencies.Any()))
{
teamCity.EnsureDependencies(repo.Name, repo.Dependencies.Select(r => r.Name));
var dependencies = repo.Dependencies
.Select(r => r.Name)
.Concat(new[] { "CoreCLR" });
teamCity.EnsureDependencies(repo.Name, dependencies);
}
return 0;
}

View File

@ -50,6 +50,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Models\Triggers.cs" />
<Compile Include="TeamCityAPI.cs" />
<Compile Include="GitHubAPI.cs" />
<Compile Include="Program.cs" />

View File

@ -11,6 +11,7 @@ namespace TCDependencyManager
{
public class TeamCityAPI
{
private const string TriggersEndPoint = "httpAuth/app/rest/buildTypes/{0}/triggers";
private readonly string _teamCityUrl;
private readonly ICredentials _creds;
@ -20,7 +21,7 @@ namespace TCDependencyManager
_creds = creds;
}
public bool TryGetDependencies(string configId, out List<string> dependencies)
public bool TryGetSnapshotDependencies(string configId, out List<string> dependencies)
{
string url = String.Format("httpAuth/app/rest/buildTypes/{0}/snapshot-dependencies", configId);
var client = GetClient();
@ -39,6 +40,50 @@ namespace TCDependencyManager
return true;
}
public List<Trigger> GetTriggers(string configId)
{
string url = String.Format(TriggersEndPoint, configId);
var client = GetClient();
var response = client.GetAsync(url).Result;
if (response.StatusCode == HttpStatusCode.NotFound)
{
// We don't have the config setup on the CI. That is ok.
return null;
}
var triggers = response.EnsureSuccessStatusCode()
.Content.ReadAsAsync<Triggers>()
.Result;
return triggers.Trigger;
}
public void AddFinishTriggers(string configId, IEnumerable<string> finishConfigIds)
{
foreach (var finishConfigId in finishConfigIds)
{
var props = new Properties
{
Property = new List<NameValuePair>
{
new NameValuePair("afterSuccessfulBuildOnly", "true"),
new NameValuePair("dependsOn", finishConfigId)
}
};
var trigger = new Trigger
{
Id = "Trigger_" + finishConfigId,
Properties = props,
Type = "buildDependencyTrigger"
};
string url = String.Format(TriggersEndPoint, configId);
var client = GetClient();
var response = client.PostAsync(url, GetJsonContent(trigger)).Result;
response.EnsureSuccessStatusCode();
}
}
public void SetDependencies(string configId, IEnumerable<string> dependencies)
{
foreach (var dependencyId in dependencies)
@ -70,31 +115,49 @@ namespace TCDependencyManager
ProjectName = "AspNet"
}
};
var serialized = JsonConvert.SerializeObject(snapshotDependency, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
var content = new StringContent(serialized);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var content = GetJsonContent(snapshotDependency);
var response = client.PostAsync(url, content).Result;
response.EnsureSuccessStatusCode();
}
}
public void EnsureDependencies(string configId, IEnumerable<string> dependencies)
{
List<string> currentDependencies;
if (TryGetSnapshotDependencies(configId, out currentDependencies))
{
dependencies = dependencies.Select(NormalizeId);
var dependenciesToAdd = dependencies.Except(currentDependencies, StringComparer.OrdinalIgnoreCase);
SetDependencies(configId, dependenciesToAdd);
var currentTriggers = GetTriggers(configId)
.Where(t => t.Type.Equals("buildDependencyTrigger", StringComparison.OrdinalIgnoreCase))
.Select(t => t.Properties.Property.First(f => f.Name.Equals("dependsOn", StringComparison.OrdinalIgnoreCase)).Value);
var triggersToAdd = dependencies.Except(currentTriggers);
AddFinishTriggers(configId, triggersToAdd);
}
}
private static StringContent GetJsonContent<TVal>(TVal value)
{
var serialized = JsonConvert.SerializeObject(value,
new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
var content = new StringContent(serialized);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return content;
}
private static string NormalizeId(string dependencyId)
{
return dependencyId.Replace(".", "");
}
public void EnsureDependencies(string configId, IEnumerable<string> dependencies)
{
List<string> currentDepenencies;
if (TryGetDependencies(configId, out currentDepenencies))
{
var dependenciesToAdd = dependencies.Select(NormalizeId)
.Except(currentDepenencies, StringComparer.OrdinalIgnoreCase);
SetDependencies(configId, dependenciesToAdd);
}
}
private HttpClient GetClient()
{
var handler = new HttpClientHandler