Skip to content

Commit 6368d6a

Browse files
authored
Support downloading a single artifact file (#539)
1 parent 09cdaae commit 6368d6a

File tree

5 files changed

+44
-0
lines changed

5 files changed

+44
-0
lines changed

NGitLab.Mock/Clients/JobClient.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ public byte[] GetJobArtifacts(int jobId)
4545
throw new NotImplementedException();
4646
}
4747

48+
public byte[] GetJobArtifact(int jobId, string path)
49+
{
50+
throw new NotImplementedException();
51+
}
52+
4853
public IEnumerable<Models.Job> GetJobs(JobScopeMask scope)
4954
{
5055
return GetJobs(new JobQuery { Scope = scope });

NGitLab.Tests/JobTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Globalization;
33
using System.Linq;
4+
using System.Text;
45
using System.Threading.Tasks;
56
using NGitLab.Models;
67
using NGitLab.Tests.Docker;
@@ -203,5 +204,27 @@ public async Task Test_get_job_artifacts()
203204
Assert.IsNotEmpty(artifacts);
204205
}
205206
}
207+
208+
[Test]
209+
[NGitLabRetry]
210+
public async Task Test_get_job_artifact()
211+
{
212+
using var context = await GitLabTestContext.CreateAsync();
213+
var project = context.CreateProject();
214+
var jobsClient = context.Client.GetJobs(project.Id);
215+
using (await context.StartRunnerForOneJobAsync(project.Id))
216+
{
217+
AddGitLabCiFile(context.Client, project);
218+
var jobs = await GitLabTestContext.RetryUntilAsync(() => jobsClient.GetJobs(JobScopeMask.Success), jobs => jobs.Any(), TimeSpan.FromMinutes(2));
219+
var job = jobs.Single();
220+
Assert.AreEqual(JobStatus.Success, job.Status);
221+
222+
var artifact = jobsClient.GetJobArtifact(job.Id, "file0.txt");
223+
Assert.IsNotEmpty(artifact);
224+
225+
var content = Encoding.ASCII.GetString(artifact).Trim();
226+
Assert.AreEqual("test", content);
227+
}
228+
}
206229
}
207230
}

NGitLab/IJobClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public interface IJobClient
2323

2424
byte[] GetJobArtifacts(int jobId);
2525

26+
byte[] GetJobArtifact(int jobId, string path);
27+
2628
string GetTrace(int jobId);
2729

2830
Task<string> GetTraceAsync(int jobId, CancellationToken cancellationToken = default);

NGitLab/Impl/JobClient.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@ public byte[] GetJobArtifacts(int jobId)
8282
return result;
8383
}
8484

85+
public byte[] GetJobArtifact(int jobId, string path)
86+
{
87+
byte[] result = null;
88+
_api.Get().Stream($"{_jobsPath}/{jobId.ToStringInvariant()}/artifacts/{path}", s =>
89+
{
90+
using var ms = new MemoryStream();
91+
s.CopyTo(ms);
92+
result = ms.ToArray();
93+
});
94+
return result;
95+
}
96+
8597
public string GetTrace(int jobId)
8698
{
8799
var result = string.Empty;

NGitLab/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ NGitLab.IIssueClient.TimeStatsAsync(int projectId, int issueIid, System.Threadin
282282
NGitLab.IJobClient
283283
NGitLab.IJobClient.Get(int jobId) -> NGitLab.Models.Job
284284
NGitLab.IJobClient.GetAsync(int jobId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.Job>
285+
NGitLab.IJobClient.GetJobArtifact(int jobId, string path) -> byte[]
285286
NGitLab.IJobClient.GetJobArtifacts(int jobId) -> byte[]
286287
NGitLab.IJobClient.GetJobs(NGitLab.Models.JobQuery query) -> System.Collections.Generic.IEnumerable<NGitLab.Models.Job>
287288
NGitLab.IJobClient.GetJobs(NGitLab.Models.JobScopeMask scope) -> System.Collections.Generic.IEnumerable<NGitLab.Models.Job>
@@ -537,6 +538,7 @@ NGitLab.Impl.IssueClient.TimeStatsAsync(int projectId, int issueIid, System.Thre
537538
NGitLab.Impl.JobClient
538539
NGitLab.Impl.JobClient.Get(int jobId) -> NGitLab.Models.Job
539540
NGitLab.Impl.JobClient.GetAsync(int jobId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<NGitLab.Models.Job>
541+
NGitLab.Impl.JobClient.GetJobArtifact(int jobId, string path) -> byte[]
540542
NGitLab.Impl.JobClient.GetJobArtifacts(int jobId) -> byte[]
541543
NGitLab.Impl.JobClient.GetJobs(NGitLab.Models.JobQuery query) -> System.Collections.Generic.IEnumerable<NGitLab.Models.Job>
542544
NGitLab.Impl.JobClient.GetJobs(NGitLab.Models.JobScopeMask scope) -> System.Collections.Generic.IEnumerable<NGitLab.Models.Job>

0 commit comments

Comments
 (0)