Add finish build triggers along with snapshot dependencies when updating TeamCity dependencies
This commit is contained in:
parent
ccaaaeb392
commit
8b2137189e
|
|
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,7 +8,7 @@ namespace TCDependencyManager
|
||||||
{
|
{
|
||||||
class Program
|
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)
|
static int Main(string[] args)
|
||||||
{
|
{
|
||||||
|
|
@ -39,7 +39,10 @@ namespace TCDependencyManager
|
||||||
Console.WriteLine("Ensuring dependencies are consistent on TeamCity");
|
Console.WriteLine("Ensuring dependencies are consistent on TeamCity");
|
||||||
foreach (var repo in repos.Where(p => p.Dependencies.Any()))
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="Models\Triggers.cs" />
|
||||||
<Compile Include="TeamCityAPI.cs" />
|
<Compile Include="TeamCityAPI.cs" />
|
||||||
<Compile Include="GitHubAPI.cs" />
|
<Compile Include="GitHubAPI.cs" />
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ namespace TCDependencyManager
|
||||||
{
|
{
|
||||||
public class TeamCityAPI
|
public class TeamCityAPI
|
||||||
{
|
{
|
||||||
|
private const string TriggersEndPoint = "httpAuth/app/rest/buildTypes/{0}/triggers";
|
||||||
private readonly string _teamCityUrl;
|
private readonly string _teamCityUrl;
|
||||||
private readonly ICredentials _creds;
|
private readonly ICredentials _creds;
|
||||||
|
|
||||||
|
|
@ -20,7 +21,7 @@ namespace TCDependencyManager
|
||||||
_creds = creds;
|
_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);
|
string url = String.Format("httpAuth/app/rest/buildTypes/{0}/snapshot-dependencies", configId);
|
||||||
var client = GetClient();
|
var client = GetClient();
|
||||||
|
|
@ -39,6 +40,50 @@ namespace TCDependencyManager
|
||||||
return true;
|
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)
|
public void SetDependencies(string configId, IEnumerable<string> dependencies)
|
||||||
{
|
{
|
||||||
foreach (var dependencyId in dependencies)
|
foreach (var dependencyId in dependencies)
|
||||||
|
|
@ -70,31 +115,49 @@ namespace TCDependencyManager
|
||||||
ProjectName = "AspNet"
|
ProjectName = "AspNet"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var serialized = JsonConvert.SerializeObject(snapshotDependency, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
|
var content = GetJsonContent(snapshotDependency);
|
||||||
var content = new StringContent(serialized);
|
|
||||||
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
|
||||||
var response = client.PostAsync(url, content).Result;
|
var response = client.PostAsync(url, content).Result;
|
||||||
response.EnsureSuccessStatusCode();
|
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)
|
private static string NormalizeId(string dependencyId)
|
||||||
{
|
{
|
||||||
return dependencyId.Replace(".", "");
|
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()
|
private HttpClient GetClient()
|
||||||
{
|
{
|
||||||
var handler = new HttpClientHandler
|
var handler = new HttpClientHandler
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue