-
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathNodeVersionExtension.java
More file actions
133 lines (114 loc) · 5.48 KB
/
NodeVersionExtension.java
File metadata and controls
133 lines (114 loc) · 5.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package org.nodejs.jenkinsplugins.nodeversion;
import hudson.Extension;
import hudson.FilePath;
import hudson.FilePath.FileCallable;
import hudson.model.Action;
import hudson.model.ParametersAction;
import hudson.model.ParameterValue;
import hudson.model.StringParameterValue;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.git.GitException;
import hudson.plugins.git.GitSCM;
import hudson.plugins.git.extensions.GitSCMExtension;
import hudson.plugins.git.extensions.GitSCMExtensionDescriptor;
import hudson.remoting.VirtualChannel;
import jenkins.MasterToSlaveFileCallable;
import org.jenkinsci.plugins.gitclient.GitClient;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Collection;
import java.util.List;
import java.util.Iterator;
import java.util.Vector;
import java.util.logging.Logger;
import static org.nodejs.jenkinsplugins.nodeversion.NodeVersionAction.ENV_VAR_NODEJS_VERSION;
import static org.nodejs.jenkinsplugins.nodeversion.NodeVersionAction.ENV_VAR_NODEJS_MAJOR_VERSION;
public class NodeVersionExtension extends GitSCMExtension {
private static final Logger LOGGER = Logger.getLogger(NodeVersionExtension.class.getName());
private boolean exportNodejsVersion;
@DataBoundConstructor
public NodeVersionExtension() {
}
@DataBoundSetter
public void setExportNodejsVersion(boolean exportNodejsVersion) {
this.exportNodejsVersion = exportNodejsVersion;
}
public boolean isExportNodejsVersion() {
return exportNodejsVersion;
}
@Override
public void onCheckoutCompleted(GitSCM scm, Run<?, ?> build, GitClient git, TaskListener listener)
throws IOException, InterruptedException, GitException {
if (exportNodejsVersion) {
String nodejsVersion = parseNodejsVersion(git.getWorkTree(), listener.getLogger());
if (nodejsVersion != null) {
String nodejsMajorVersion = nodejsVersion.split("\\.")[0];
listener.getLogger().println("Exporting environment variable " + ENV_VAR_NODEJS_VERSION + " with Node.js version '" + nodejsVersion + "'");
listener.getLogger().println("Exporting environment variable " + ENV_VAR_NODEJS_MAJOR_VERSION + " with Node.js major version '" + nodejsMajorVersion + "'");
build.addAction(new NodeVersionAction(nodejsVersion, nodejsMajorVersion));
List<ParametersAction> actions = build.getActions(ParametersAction.class);
List<ParameterValue> values = new Vector<ParameterValue>();
values.add(new StringParameterValue(ENV_VAR_NODEJS_VERSION, nodejsVersion));
values.add(new StringParameterValue(ENV_VAR_NODEJS_MAJOR_VERSION, nodejsMajorVersion));
if (actions.size() == 0) {
build.addAction(new ParametersAction(values.get(0), values.get(1)));
} else {
ParametersAction newAction = actions.get(0).createUpdated(values);
build.getActions().remove(actions.get(0));
build.getActions().add(newAction);
}
listener.getLogger().println("Exporting parameter " + ENV_VAR_NODEJS_VERSION + " with Node.js version '" + nodejsVersion + "'");
listener.getLogger().println("Exporting parameter " + ENV_VAR_NODEJS_MAJOR_VERSION + " with Node.js major version '" + nodejsMajorVersion + "'");
} else {
listener.getLogger().println("Could not find Node.js version in this workspace");
}
}
}
private String parseNodejsVersion(FilePath workspace, final PrintStream logger) {
try {
return workspace.act(new NodeVersionParserCallable());
} catch (Exception e) {
logger.println("Got error attempting to parse Node.js version from remote:");
e.printStackTrace(logger);
}
return null;
}
private final static class NodeVersionParserCallable extends MasterToSlaveFileCallable<String> {
@Override
public String invoke(File f, VirtualChannel channel) {
String major = null, minor = null, patch = null;
try {
BufferedReader in = new BufferedReader(new FileReader(new File(f, "src/node_version.h")));
String line;
while ((line = in.readLine()) != null) {
if (line.indexOf("define NODE_MAJOR_VERSION ") > -1) {
major = line.split(" NODE_MAJOR_VERSION ")[1].trim();
} else if (line.indexOf("define NODE_MINOR_VERSION ") > -1) {
minor = line.split(" NODE_MINOR_VERSION ")[1].trim();
} else if (line.indexOf("define NODE_PATCH_VERSION ") > -1) {
patch = line.split(" NODE_PATCH_VERSION ")[1].trim();
}
}
in.close();
} catch (Exception e) {
}
if (major != null && minor != null && patch != null) {
return major + "." + minor + "." + patch;
}
return null;
}
}
@Extension
public static class DescriptorImpl extends GitSCMExtensionDescriptor {
@Override
public String getDisplayName() {
return "Extract Node.js versions as parameters";
}
}
}