我成功地对一些客户端代码进行了逆向工程,这可能会对其他人有所帮助。它可能尚未完全投入生产,但请随意改进:
public class PipelineHttpClient : VssHttpClientBase
{
public PipelineHttpClient(Uri baseUrl, VssCredentials credentials)
: base(baseUrl, credentials)
{
}
public PipelineHttpClient(Uri baseUrl, VssCredentials credentials, VssHttpRequestSettings settings)
: base(baseUrl, credentials, settings)
{
}
public PipelineHttpClient(Uri baseUrl, VssCredentials credentials, params DelegatingHandler[] handlers)
: base(baseUrl, credentials, handlers)
{
}
public PipelineHttpClient(Uri baseUrl, VssCredentials credentials, VssHttpRequestSettings settings, params DelegatingHandler[] handlers)
: base(baseUrl, credentials, settings, handlers)
{
}
public PipelineHttpClient(Uri baseUrl, HttpMessageHandler pipeline, bool disposeHandler)
: base(baseUrl, pipeline, disposeHandler)
{
}
public async Task<PipelineRun> RunPipelineAsync(Guid project, int pipelineId, object parameters, string refName = "refs/heads/master")
{
var method = HttpMethod.Post;
var locationId = Guid.Parse("7859261e-d2e9-4a68-b820-a5d84cc5bb3d");
object routeValues = new
{
project,
pipelineId,
//pipelineVersion = ""
};
var version = new ApiResourceVersion("6.0");
// ensure that the refName is prefixed correctly.
refName = refName.StartsWith("refs/heads/", StringComparison.InvariantCultureIgnoreCase)
? refName
: $"refs/heads/{refName}";
var content = (HttpContent) new ObjectContent<object>(new
{
StagesToSkip = new object[0],
TemplateParameters = parameters,
Variables = new object(),
Resources = new
{
Repositories = new
{
Self = new
{
RefName = refName
}
}
}
},
new VssJsonMediaTypeFormatter(true));
var queryParameters = new Dictionary<string, string>();
return await SendAsync<PipelineRun>(method, locationId, routeValues, version, content, queryParameters, cancellationToken: CancellationToken.None);
}
}
public class Pipeline
{
[JsonProperty("url")]
public string Url { get; set; }
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("revision")]
public int Revision { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("folder")]
public string Folder { get; set; }
}
public class Repository
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
}
public class Self
{
[JsonProperty("repository")]
public Repository Repository { get; set; }
[JsonProperty("refName")]
public string RefName { get; set; }
[JsonProperty("version")]
public string Version { get; set; }
}
public class Repositories
{
[JsonProperty("self")]
public Self Self { get; set; }
}
public class Resources
{
[JsonProperty("repositories")]
public Repositories Repositories { get; set; }
}
public class PipelineRun
{
[JsonProperty("pipeline")]
public Pipeline Pipeline { get; set; }
[JsonProperty("state")]
public string State { get; set; }
[JsonProperty("createdDate")]
public DateTime CreatedDate { get; set; }
[JsonProperty("url")]
public string Url { get; set; }
[JsonProperty("resources")]
public Resources Resources { get; set; }
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
Usage:
PipelineHttpClient client = new PipelineHttpClient(...);
var project = Guid.Parse("TODO");
var pipelineId = 1234;
// pipeline parameters:
var parameters = new {meaningOfLife = 42};
var result = await client.RunPipelineAsync(project, pipelineId, parameters, "refs/heads/feature/my-branch");
if (result.State == "inProgress")
{
// TODO the pipeline is running!
}