From c3320af3458bc6181cee9fa48c23ba6e9534ef9f Mon Sep 17 00:00:00 2001 From: "nicolas.rafalowski" Date: Wed, 28 Dec 2016 09:25:23 +0200 Subject: [PATCH] Added the option to build with parameters - currently only supporting default values --- .../Managers/JenkinsDataLoader.cs | 5 ++-- .../Managers/JenkinsJobManager.cs | 26 ++++++++++++++++++ .../Devkoes.JenkinsManager.Model.csproj | 3 ++ .../Schema/JenkinsDefaultParameterValue.cs | 10 +++++++ .../Schema/JenkinsJob.cs | 22 +++++++++++++++ .../Schema/JenkinsParameterDefinition.cs | 14 ++++++++++ .../Schema/JenkinsProperty.cs | 12 ++++++++ .../Devkoes.JenkinsManager.UI.csproj | 3 ++ .../Resources/BuildWithParameters.png | Bin 0 -> 505 bytes .../ViewModels/JenkinsManagerViewModel.cs | 16 +++++++++++ .../Views/JenkinsManager.xaml | 9 ++++++ 11 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsDefaultParameterValue.cs create mode 100644 Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsParameterDefinition.cs create mode 100644 Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsProperty.cs create mode 100644 Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.UI/Resources/BuildWithParameters.png diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsDataLoader.cs b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsDataLoader.cs index 641b4ab..e66a72c 100644 --- a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsDataLoader.cs +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsDataLoader.cs @@ -14,8 +14,9 @@ public static class JenkinsDataLoader private const short MAX_JOB_BUILDS = 5; private const string VIEW_QUERY = "api/json?pretty=true&tree=views[name,url]"; - private const string JOBS_QUERY_WITH_RANGE = "api/json?pretty=true&tree=jobs[name,url,inQueue,buildable,builds[number,result,building,estimatedDuration,timestamp]{0,5},queueItem[why,id]]"; - private const string JOBS_QUERY = "api/json?pretty=true&tree=jobs[name,url,inQueue,buildable,builds[number,result,building,estimatedDuration,timestamp],queueItem[why,id]]"; + private const string JOBS_QUERY_BASE = "api/json?pretty=true&tree=jobs[name,url,inQueue,buildable,queueItem[why,id],property[parameterDefinitions[name,defaultParameterValue[value]]],builds[number,result,building,estimatedDuration,timestamp]"; + private const string JOBS_QUERY_WITH_RANGE = JOBS_QUERY_BASE + "{0,5}]"; + private const string JOBS_QUERY = JOBS_QUERY_BASE + "]"; public static async Task> GetViews(JenkinsServer server) { diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsJobManager.cs b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsJobManager.cs index eb3b4f6..db8cf69 100644 --- a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsJobManager.cs +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.APIHandler/Managers/JenkinsJobManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Specialized; using System.IO; +using System.Linq; using System.Net; using System.Threading.Tasks; @@ -50,6 +51,25 @@ public async static Task ScheduleJob(string jobUrl, string jenkinsServerUrl) } } + public static async Task BuildJobWithDefaultParameters(JenkinsJob job, string jenkinsServerUrl) + { + using (var client = JenkinsDataLoader.CreateJenkinsWebClient(jenkinsServerUrl)) + { + Uri buildUri = CreateBuildWithParametersUri(job.Url); + var parametersNameValueCollection = new NameValueCollection(); + job.Property.Aggregate(parametersNameValueCollection, (collection, property) => + { + if (property.ParameterDefinitions != null && property.ParameterDefinitions.Any()) + { + property.ParameterDefinitions.ToList().ForEach(pd => collection.Add(pd.Name, pd.DefaultParameterValue.Value)); + } + return collection; + }); + parametersNameValueCollection.Add("delay", "0sec"); + byte[] response = await client.UploadValuesTaskAsync(buildUri, parametersNameValueCollection); + } + } + public async static Task DequeueJob(JenkinsQueueItem queueItem, string jenkinsServerUrl) { if (queueItem == null) @@ -110,5 +130,11 @@ private static Uri CreateLatestLogUri(string jobUrl) var jobUri = new Uri(jobUrl); return new Uri(jobUri, "lastBuild/consoleText"); } + + private static Uri CreateBuildWithParametersUri(string jobUrl) + { + var joubUri = new Uri(jobUrl); + return new Uri(joubUri, "buildWithParameters"); + } } } diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Devkoes.JenkinsManager.Model.csproj b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Devkoes.JenkinsManager.Model.csproj index 84824c8..69df983 100644 --- a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Devkoes.JenkinsManager.Model.csproj +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Devkoes.JenkinsManager.Model.csproj @@ -60,7 +60,10 @@ + + + diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsDefaultParameterValue.cs b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsDefaultParameterValue.cs new file mode 100644 index 0000000..ee63394 --- /dev/null +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsDefaultParameterValue.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; + +namespace Devkoes.JenkinsManager.Model.Schema +{ + public class JenkinsDefaultParameterValue + { + [JsonProperty("Value")] + public string Value { get; set; } + } +} diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsJob.cs b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsJob.cs index 2aabab8..041df10 100644 --- a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsJob.cs +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsJob.cs @@ -13,6 +13,7 @@ public class JenkinsJob : ObservableObject private bool _isQueued; private JenkinsQueueItem _queueItem; private string _name; + private IEnumerable _property; [JsonProperty("InQueue")] public bool IsQueued @@ -94,6 +95,21 @@ public string Name [JsonProperty("Url")] public string Url { get; set; } + [JsonProperty("Property")] + public IEnumerable Property + { + get { return _property; } + set + { + if (value != _property) + { + _property = value; + RaisePropertyChanged(() => Property); + RaisePropertyChanged(() => HasParameters); + } + } + } + [JsonIgnore] public JenkinsBuild LatestBuild { @@ -162,6 +178,12 @@ public short BuildProgress } } + [JsonIgnore] + public bool HasParameters + { + get { return Property != null && Property.Any(p => p?.ParameterDefinitions != null && p.ParameterDefinitions.Any()); } + } + public override bool Equals(object obj) { // diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsParameterDefinition.cs b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsParameterDefinition.cs new file mode 100644 index 0000000..1ccbbcd --- /dev/null +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsParameterDefinition.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; + +namespace Devkoes.JenkinsManager.Model.Schema +{ + public class JenkinsParameterDefinition + { + [JsonProperty("Name")] + public string Name { get; set; } + + [JsonProperty("DefaultParameterValue")] + public JenkinsDefaultParameterValue DefaultParameterValue { get; set; } + + } +} \ No newline at end of file diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsProperty.cs b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsProperty.cs new file mode 100644 index 0000000..6edd431 --- /dev/null +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.Model/Schema/JenkinsProperty.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Devkoes.JenkinsManager.Model.Schema +{ + public class JenkinsProperty + { + [JsonProperty("ParameterDefinitions")] + public IEnumerable ParameterDefinitions { get; set; } + + } +} \ No newline at end of file diff --git a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.UI/Devkoes.JenkinsManager.UI.csproj b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.UI/Devkoes.JenkinsManager.UI.csproj index 2835e7c..b2f7d5e 100644 --- a/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.UI/Devkoes.JenkinsManager.UI.csproj +++ b/Devkoes.VSJenkinsManager/Devkoes.JenkinsManager.UI/Devkoes.JenkinsManager.UI.csproj @@ -181,6 +181,9 @@ + + +