Skip to content

Commit c1e5aab

Browse files
author
TechsCode
committed
Separated Deployment into its own Thread to fix deployment issues
1 parent 432b7b0 commit c1e5aab

4 files changed

Lines changed: 100 additions & 70 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
.idea/
44
.gradle/
55
out/
6-
build/
6+
build/
7+
/config.json

src/main/java/me/TechsCode/ReleaseServer/DeploymentManager.java

Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ public abstract class DeploymentManager extends Thread {
1616

1717
private static final int DELAY = 1000 * 10;
1818

19-
public static JSch jsch = new JSch();
20-
2119
private List<Integer> previousReleases;
2220

2321
public DeploymentManager() {
@@ -34,28 +32,7 @@ public void run() {
3432
List<Artifact> artifacts = getArtifacts();
3533

3634
if(!previousReleases.isEmpty()){
37-
artifacts.stream().filter(artifact -> !previousReleases.contains(artifact.getRelease().getId()))
38-
.forEach(artifact -> {
39-
Project project = artifact.getRelease().getProject();
40-
41-
if(artifact.getAssets().length == 0){
42-
System.out.println("["+project.getName()+"] The Release ["+artifact.getReleaseTag()+"] does not contain any assets, skipping deployment");
43-
return;
44-
}
45-
46-
if(project.getDeployments().isEmpty()){
47-
System.out.println("["+project.getName()+"] No deployments configured for this project");
48-
return;
49-
}
50-
51-
System.out.println("["+project.getName()+"] Deploying releases to remotes:");
52-
53-
for (Deployment deployment : project.getDeployments()) {
54-
if (deployment.isEnabled()){
55-
deploy(project, artifact, deployment);
56-
}
57-
}
58-
});
35+
artifacts.stream().filter(artifact -> !previousReleases.contains(artifact.getRelease().getId())).forEach(DeploymentThread::new);
5936
}
6037

6138
this.previousReleases = artifacts.stream().map(a -> a.getRelease().getId()).collect(Collectors.toList());
@@ -67,48 +44,4 @@ public void run() {
6744
}
6845
}
6946
}
70-
71-
private void deploy(Project project, Artifact artifact, Deployment deployment){
72-
Remote remote = deployment.getRemote();
73-
74-
try {
75-
Properties config = new Properties();
76-
config.put("StrictHostKeyChecking", "no");
77-
78-
Session session = jsch.getSession(remote.getUsername(), remote.getHostname(), remote.getPort());
79-
session.setPassword(remote.getPassword());
80-
session.setConfig(config);
81-
session.connect();
82-
83-
ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
84-
sftp.connect();
85-
sftp.cd(deployment.getPath());
86-
87-
for (File asset : artifact.getAssets()) {
88-
sftp.put(new FileInputStream(asset), asset.getName(), ChannelSftp.OVERWRITE);
89-
}
90-
91-
sftp.exit();
92-
93-
for (String command : deployment.getCommands()) {
94-
ChannelExec channel = (ChannelExec) session.openChannel("exec");
95-
channel.setCommand(command);
96-
channel.connect();
97-
98-
StringWriter writer = new StringWriter();
99-
IOUtils.copy(channel.getInputStream(), writer, StandardCharsets.UTF_8);
100-
String output = writer.toString();
101-
102-
System.out.println(output);
103-
104-
channel.disconnect();
105-
}
106-
107-
session.disconnect();
108-
System.out.println("[" + project.getName() + "] Deployment of release [" + artifact.getReleaseTag() + "] to remote [" + remote.getHostname() + "] was successful");
109-
} catch (JSchException | SftpException | IOException e) {
110-
System.out.println("[" + project.getName() + "] Error while deploying release [" + artifact.getReleaseTag() + "] to [" + remote.getHostname() + "]");
111-
System.out.println(e.getMessage());
112-
}
113-
}
11447
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package me.TechsCode.ReleaseServer;
2+
3+
import com.jcraft.jsch.ChannelExec;
4+
import com.jcraft.jsch.ChannelSftp;
5+
import com.jcraft.jsch.JSch;
6+
import com.jcraft.jsch.Session;
7+
import me.TechsCode.ReleaseServer.objects.Deployment;
8+
import me.TechsCode.ReleaseServer.objects.Project;
9+
import me.TechsCode.ReleaseServer.objects.Remote;
10+
import org.apache.commons.io.IOUtils;
11+
12+
import java.io.File;
13+
import java.io.FileInputStream;
14+
import java.io.StringWriter;
15+
import java.nio.charset.StandardCharsets;
16+
import java.util.Properties;
17+
18+
public class DeploymentThread implements Runnable {
19+
20+
public static JSch jsch = new JSch();
21+
22+
private final Artifact artifact;
23+
24+
public DeploymentThread(Artifact artifact) {
25+
this.artifact = artifact;
26+
27+
new Thread(this).start();
28+
}
29+
30+
@Override
31+
public void run() {
32+
Project project = artifact.getRelease().getProject();
33+
34+
if(artifact.getAssets().length == 0){
35+
System.out.println("["+project.getName()+"] The Release ["+artifact.getReleaseTag()+"] does not contain any assets, skipping deployment");
36+
return;
37+
}
38+
39+
if(project.getDeployments().isEmpty()){
40+
System.out.println("["+project.getName()+"] No deployments configured for this project");
41+
return;
42+
}
43+
44+
System.out.println("["+project.getName()+"] Deploying to remotes... awaiting completion..");
45+
46+
for (Deployment deployment : project.getDeployments()) {
47+
if (deployment.isEnabled()){
48+
try {
49+
deploy(deployment);
50+
System.out.println("[" + project.getName() + "] Successfully completed deployment of release [" + artifact.getReleaseTag() + "] to remote [" + deployment.getRemote().getHostname() + "]!");
51+
} catch (Exception e){
52+
System.out.println("[" + project.getName() + "] Error while deploying release [" + artifact.getReleaseTag() + "] to [" + deployment.getRemote().getHostname() + "]");
53+
System.out.println(e.getMessage());
54+
}
55+
}
56+
}
57+
}
58+
59+
private void deploy(Deployment deployment) throws Exception {
60+
Remote remote = deployment.getRemote();
61+
62+
Properties config = new Properties();
63+
config.put("StrictHostKeyChecking", "no");
64+
65+
Session session = jsch.getSession(remote.getUsername(), remote.getHostname(), remote.getPort());
66+
session.setPassword(remote.getPassword());
67+
session.setConfig(config);
68+
session.connect();
69+
70+
ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
71+
sftp.connect();
72+
sftp.cd(deployment.getPath());
73+
74+
for (File asset : artifact.getAssets()) {
75+
sftp.put(new FileInputStream(asset), asset.getName(), ChannelSftp.OVERWRITE);
76+
}
77+
78+
sftp.exit();
79+
80+
for (String command : deployment.getCommands()) {
81+
ChannelExec channel = (ChannelExec) session.openChannel("exec");
82+
channel.setCommand(command);
83+
channel.connect();
84+
85+
StringWriter writer = new StringWriter();
86+
IOUtils.copy(channel.getInputStream(), writer, StandardCharsets.UTF_8);
87+
String output = writer.toString();
88+
89+
System.out.println(output);
90+
91+
channel.disconnect();
92+
}
93+
94+
session.disconnect();
95+
}
96+
}

src/main/java/me/TechsCode/ReleaseServer/ReleaseServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public List<Artifact> getArtifacts() {
5151
}
5252
};
5353

54-
System.out.println("Listening to new releases for "+config.getProjects().size()+" projects...");
54+
System.out.println("Listening to new releases for "+config.getProjects().size()+" projects....");
5555
}
5656

5757
public static List<Artifact> getArtifacts() {

0 commit comments

Comments
 (0)