Skip to content

Commit d7a4ed2

Browse files
committed
AGDIGGER-60 - Fetching artifacts
1 parent 7d6fb33 commit d7a4ed2

File tree

7 files changed

+248
-54
lines changed

7 files changed

+248
-54
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ Build a default client:
1212
Build a customized client:
1313
```
1414
DiggerClient client = DiggerClient.builder()
15-
.createJobService(new CreateJobService())
16-
.triggerBuildService(new TriggerBuildService(10000, 100))
15+
.jobService(new JobService())
16+
.triggerBuildService(new BuildService(10000, 100))
17+
.artifactsService(artifactsService)
1718
.withAuth("https://digger.com", "admin", "password")
1819
.build();
1920
```

pom.xml

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,21 @@
44
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
55
<modelVersion>4.0.0</modelVersion>
66

7-
<groupId>groupId</groupId>
7+
<groupId>org.jboss.aerogear</groupId>
88
<artifactId>jenkins-client</artifactId>
99
<version>1.0.0</version>
1010
<packaging>jar</packaging>
1111

12+
<properties>
13+
<junit.version>4.11</junit.version>
14+
<mockito-core.version>1.9.5</mockito-core.version>
15+
<jenkins.client.version>0.3.7-SNAPSHOT</jenkins.client.version>
16+
<jtwig.templates.version>5.65</jtwig.templates.version>
17+
<slf4j.api.version>1.7.21</slf4j.api.version>
18+
<slf4j-log4j12.version>1.7.21</slf4j-log4j12.version>
19+
<assertj-core.version>3.6.1</assertj-core.version>
20+
</properties>
21+
1222
<licenses>
1323
<license>
1424
<name>Apache License, Version 2.0</name>
@@ -22,42 +32,41 @@
2232
<dependency>
2333
<groupId>com.offbytwo.jenkins</groupId>
2434
<artifactId>jenkins-client</artifactId>
25-
<version>0.3.7-SNAPSHOT</version>
35+
<version>${jenkins.client.version}</version>
2636
</dependency>
2737
<dependency>
2838
<groupId>org.jtwig</groupId>
2939
<artifactId>jtwig-core</artifactId>
30-
<version>5.65</version>
40+
<version>${jtwig.templates.version}</version>
3141
</dependency>
3242
<dependency>
3343
<groupId>org.slf4j</groupId>
3444
<artifactId>slf4j-api</artifactId>
35-
<version>1.7.21</version>
45+
<version>${slf4j.api.version}</version>
3646
</dependency>
3747
<dependency>
3848
<groupId>org.slf4j</groupId>
3949
<artifactId>slf4j-log4j12</artifactId>
40-
<version>1.7.21</version>
50+
<version>${slf4j-log4j12.version}</version>
4151
</dependency>
4252

4353
<!--Testing-->
4454
<dependency>
4555
<groupId>junit</groupId>
4656
<artifactId>junit</artifactId>
47-
<version>4.12</version>
57+
<version>${junit.version}</version>
4858
<scope>test</scope>
4959
</dependency>
50-
5160
<dependency>
5261
<groupId>org.mockito</groupId>
5362
<artifactId>mockito-core</artifactId>
54-
<version>1.10.19</version>
63+
<version>${mockito-core.version}</version>
5564
<scope>test</scope>
5665
</dependency>
5766
<dependency>
5867
<groupId>org.assertj</groupId>
5968
<artifactId>assertj-core</artifactId>
60-
<version>3.6.1</version>
69+
<version>${assertj-core.version}</version>
6170
<scope>test</scope>
6271
</dependency>
6372
</dependencies>

src/main/java/com/redhat/digkins/DiggerClient.java

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22

33
import com.offbytwo.jenkins.JenkinsServer;
44
import com.redhat.digkins.model.BuildStatus;
5-
import com.redhat.digkins.services.CreateJobService;
5+
import com.redhat.digkins.services.ArtifactsService;
6+
import com.redhat.digkins.services.JobService;
67
import com.redhat.digkins.services.TriggerBuildService;
78
import com.redhat.digkins.util.DiggerClientException;
89
import com.redhat.digkins.util.JenkinsAuth;
910
import org.slf4j.Logger;
1011
import org.slf4j.LoggerFactory;
1112

13+
import java.io.File;
1214
import java.io.IOException;
15+
import java.io.InputStream;
1316
import java.net.URI;
1417
import java.net.URISyntaxException;
1518

@@ -24,8 +27,9 @@ public class DiggerClient {
2427

2528
private JenkinsServer jenkinsServer;
2629

27-
private CreateJobService createJobService;
30+
private JobService jobService;
2831
private TriggerBuildService triggerBuildService;
32+
private ArtifactsService artifactsService;
2933

3034
private DiggerClient() {
3135
}
@@ -42,29 +46,33 @@ private DiggerClient() {
4246
* @throws DiggerClientException if something goes wrong
4347
*/
4448
public static DiggerClient createDefaultWithAuth(String url, String user, String password) throws DiggerClientException {
49+
TriggerBuildService triggerBuildService = new TriggerBuildService(TriggerBuildService.DEFAULT_FIRST_CHECK_DELAY, TriggerBuildService.DEFAULT_POLL_PERIOD);
50+
JobService jobService = new JobService();
51+
ArtifactsService artifactsService = new ArtifactsService();
4552
return DiggerClient.builder()
46-
.createJobService(new CreateJobService())
47-
.triggerBuildService(new TriggerBuildService(TriggerBuildService.DEFAULT_FIRST_CHECK_DELAY, TriggerBuildService.DEFAULT_POLL_PERIOD))
53+
.createJobService(jobService)
54+
.triggerBuildService(triggerBuildService)
55+
.artifactsService(artifactsService)
4856
.withAuth(url, user, password)
4957
.build();
5058
}
5159

5260
public static DiggerClientBuilder builder() {
5361
return new DiggerClientBuilder();
5462
}
55-
5663
public static class DiggerClientBuilder {
5764
private JenkinsAuth auth;
58-
private CreateJobService createJobService;
65+
private JobService jobService;
5966
private TriggerBuildService triggerBuildService;
67+
private ArtifactsService artifactsService;
6068

6169
public DiggerClientBuilder withAuth(String url, String user, String password) {
6270
this.auth = new JenkinsAuth(url, user, password);
6371
return this;
6472
}
6573

66-
public DiggerClientBuilder createJobService(CreateJobService createJobService) {
67-
this.createJobService = createJobService;
74+
public DiggerClientBuilder createJobService(JobService jobService) {
75+
this.jobService = jobService;
6876
return this;
6977
}
7078

@@ -73,12 +81,18 @@ public DiggerClientBuilder triggerBuildService(TriggerBuildService triggerBuildS
7381
return this;
7482
}
7583

84+
public DiggerClientBuilder artifactsService(ArtifactsService artifactsService) {
85+
this.artifactsService = artifactsService;
86+
return this;
87+
}
88+
7689
public DiggerClient build() throws DiggerClientException {
7790
final DiggerClient client = new DiggerClient();
7891
try {
7992
client.jenkinsServer = new JenkinsServer(new URI(auth.getUrl()), auth.getUser(), auth.getPassword());
80-
client.createJobService = this.createJobService;
93+
client.jobService = this.jobService;
8194
client.triggerBuildService = this.triggerBuildService;
95+
client.artifactsService = this.artifactsService;
8296
return client;
8397
} catch (URISyntaxException e) {
8498
throw new DiggerClientException("Invalid jenkins url format.");
@@ -97,7 +111,7 @@ public DiggerClient build() throws DiggerClientException {
97111
*/
98112
public void createJob(String name, String gitRepo, String gitBranch) throws DiggerClientException {
99113
try {
100-
createJobService.create(this.jenkinsServer, name, gitRepo, gitBranch);
114+
jobService.create(this.jenkinsServer, name, gitRepo, gitBranch);
101115
} catch (Throwable e) {
102116
throw new DiggerClientException(e);
103117
}
@@ -160,9 +174,25 @@ public BuildStatus build(String jobName) throws DiggerClientException {
160174
* @param buildNumber job build number
161175
* @param artifactName - name of the artifact to fetch - can be regexp
162176
* @return InputStream with file contents
177+
* @throws DiggerClientException - when problem with fetching artifacts from jenkins
178+
*/
179+
public InputStream fetchArtifact(String jobName, int buildNumber, String artifactName) throws DiggerClientException {
180+
return artifactsService.streamArtifact(jenkinsServer,jobName, buildNumber, artifactName);
181+
}
182+
183+
/**
184+
* Save artifact for specified location for specific job, build number and artifact name.
185+
* If name would be an regular expression method would return stream for the first match.
186+
*
187+
* @param jobName name of the job
188+
* @param buildNumber job build number
189+
* @param artifactName name of the artifact to fetch - can be regexp for example *.apk
190+
* @param outputFile file (location) used to save artifact
191+
*
192+
* @throws DiggerClientException when problem with fetching artifacts from jenkins
193+
* @throws IOException when one of the files cannot be saved
163194
*/
164-
public InputStream fetchArtifact(String jobName, long buildNumber, String artifactName) {
165-
ArtifactsService artifactsService = new ArtifactsService(jenkins);
166-
return artifactsService.fetchArtifact(jobName,buildNumber,artifactName);
195+
public void saveArtifact(String jobName, int buildNumber, String artifactName, File outputFile) throws DiggerClientException, IOException {
196+
artifactsService.saveArtifact(jenkinsServer,jobName, buildNumber, artifactName,outputFile);
167197
}
168198
}

src/main/java/com/redhat/digkins/services/ArtifactsService.java

Lines changed: 58 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44
import com.offbytwo.jenkins.model.Artifact;
55
import com.offbytwo.jenkins.model.Build;
66
import com.offbytwo.jenkins.model.BuildWithDetails;
7-
import org.jtwig.JtwigModel;
8-
import org.jtwig.JtwigTemplate;
7+
import com.offbytwo.jenkins.model.JobWithDetails;
8+
import com.redhat.digkins.util.DiggerClientException;
9+
import org.apache.commons.io.IOUtils;
910
import org.slf4j.Logger;
1011
import org.slf4j.LoggerFactory;
1112

12-
import java.io.IOException;
13-
import java.io.InputStream;
14-
import java.net.URI;
13+
import java.io.*;
1514
import java.net.URISyntaxException;
1615
import java.util.List;
1716

@@ -20,41 +19,73 @@
2019
*/
2120
public class ArtifactsService {
2221

23-
private JenkinsServer jenkins;
24-
2522
/**
26-
* @param jenkins jenkins api instance
2723
*/
28-
public ArtifactsService(JenkinsServer jenkins) {
29-
this.jenkins = jenkins;
24+
public ArtifactsService() {
3025
}
3126

3227
private static final Logger LOG = LoggerFactory.getLogger(ArtifactsService.class);
28+
private static int DEFAULT_BUFFER = 8 * 1024;
29+
30+
/**
31+
* Save artifact for specified location for specific job, build number and artifact name.
32+
* If name would be an regular expression method would return stream for the first match.
33+
*
34+
* @param jobName name of the job
35+
* @param buildNumber job build number
36+
* @param artifactName name of the artifact to fetch - can be regexp for example *.apk
37+
* @param outputFile file (location) used to save artifact
38+
* @throws DiggerClientException when problem with fetching artifacts from jenkins
39+
* @throws IOException when one of the files cannot be saved
40+
*/
41+
public void saveArtifact(JenkinsServer jenkins, String jobName, int buildNumber, String artifactName, File outputFile) throws DiggerClientException, IOException {
42+
InputStream inputStream = streamArtifact(jenkins, jobName, buildNumber, artifactName);
43+
if (inputStream != null) {
44+
OutputStream outStream = new FileOutputStream(outputFile);
45+
byte[] buffer = new byte[DEFAULT_BUFFER];
46+
int bytesRead;
47+
while ((bytesRead = inputStream.read(buffer)) != -1) {
48+
outStream.write(buffer, 0, bytesRead);
49+
}
50+
IOUtils.closeQuietly(inputStream);
51+
IOUtils.closeQuietly(outStream);
52+
} else {
53+
throw new DiggerClientException("Cannot fetch artifacts from jenkins");
54+
}
55+
}
3356

3457
/**
35-
* Fetch artifacts urls for specific job and build number
58+
* Get artifact inputstream for specific job, build number and artifact name.
59+
* If name would be an regular expression method would return stream for the first match.
3660
*
37-
* @param jobName name of the job
38-
* @param buildNumber job build number
39-
* @param artifactName - name of the artifact to fetch - can be regexp
40-
* @return InputStream with file contents
61+
* @param jobName name of the job
62+
* @param buildNumber job build number
63+
* @param artifactName name of the artifact to fetch - can be regexp for example *.apk
64+
* @return InputStream with file contents that can be saved or piped to socket
65+
* @throws DiggerClientException when problem with fetching artifacts from jenkins
4166
*/
42-
public InputStream fetchArtifact(String jobName, long buildNumber, String artifactName) {
67+
public InputStream streamArtifact(JenkinsServer jenkins, String jobName, int buildNumber, String artifactName) throws DiggerClientException {
4368
try {
44-
Build build = jenkins.getBuild(jobName, buildNumber);
45-
if (build instanceof BuildWithDetails) {
46-
BuildWithDetails buildWithDetails = ((BuildWithDetails) build);
47-
List<Artifact> artifacts = buildWithDetails.getArtifacts();
48-
for (Artifact artifact : artifacts) {
49-
if (artifact.getFileName().matches(artifactName)) {
50-
LOG.debug("Streaming artifact {0}", artifactName);
51-
return buildWithDetails.downloadArtifact(artifact);
52-
}
69+
JobWithDetails job = jenkins.getJob(jobName);
70+
if (job == null) {
71+
LOG.error("Cannot fetch job from jenkins {0}", jobName);
72+
throw new DiggerClientException("Cannot fetch job from jenkins");
73+
}
74+
Build build = job.getBuildByNumber(buildNumber);
75+
BuildWithDetails buildWithDetails = build.details();
76+
List<Artifact> artifacts = buildWithDetails.getArtifacts();
77+
for (Artifact artifact : artifacts) {
78+
if (artifact.getFileName().matches(artifactName)) {
79+
LOG.debug("Streaming artifact {0}", artifactName);
80+
return buildWithDetails.downloadArtifact(artifact);
5381
}
54-
5582
}
56-
} catch (Exception e) {
83+
} catch (URISyntaxException e) {
84+
LOG.error("Invalid job name {0}", jobName, e);
85+
throw new DiggerClientException(e);
86+
} catch (IOException e) {
5787
LOG.error("Problem when fetching artifacts for {0} {1} {2}", jobName, buildNumber, artifactName, e);
88+
throw new DiggerClientException(e);
5889
}
5990
LOG.debug("Cannot find build for ", jobName, buildNumber, artifactName);
6091
return null;

src/main/java/com/redhat/digkins/services/CreateJobService.java renamed to src/main/java/com/redhat/digkins/services/JobService.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
/**
1010
* Create digger job on jenkins platform
1111
*/
12-
public class CreateJobService {
12+
public class JobService {
1313

1414
private final static String GIT_REPO_URL = "GIT_REPO_URL";
1515
private final static String GIT_REPO_BRANCH = "GIT_REPO_BRANCH";
16-
1716
private static final String JOB_TEMPLATE_PATH = "templates/job.xml";
1817

1918
/**
@@ -29,5 +28,4 @@ public void create(JenkinsServer jenkinsServer, String name, String gitRepo, Str
2928
JtwigModel model = JtwigModel.newModel().with(GIT_REPO_URL, gitRepo).with(GIT_REPO_BRANCH, gitBranch);
3029
jenkinsServer.createJob(name, template.render(model));
3130
}
32-
3331
}

0 commit comments

Comments
 (0)