Skip to content
This repository was archived by the owner on Mar 27, 2025. It is now read-only.

Commit 8472f5c

Browse files
authored
Merge pull request #173 from mathworks/global_tool_fs
Add support for MATLAB tool installation in Freestyle Projects
2 parents f2a7e2f + 7b7c42b commit 8472f5c

17 files changed

+613
-84
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.mathworks.ci;
2+
3+
/**
4+
* Copyright 2020 The MathWorks, Inc.
5+
*
6+
* Class to parse Stapler request for Use MATLAB Version build wrapper.
7+
*
8+
*/
9+
10+
import org.kohsuke.stapler.DataBoundConstructor;
11+
12+
public class MatlabBuildWrapperContent {
13+
14+
private final String matlabInstallationName;
15+
private final String matlabRootFolder;
16+
17+
@DataBoundConstructor
18+
public MatlabBuildWrapperContent(String matlabInstallationName, String matlabRootFolder){
19+
this.matlabInstallationName = matlabInstallationName;
20+
this.matlabRootFolder = matlabRootFolder;
21+
}
22+
23+
public String getMatlabInstallationName() {
24+
return matlabInstallationName;
25+
}
26+
27+
public String getMatlabRootFolder() {
28+
return matlabRootFolder;
29+
}
30+
}

src/main/java/com/mathworks/ci/MatlabInstallation.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package com.mathworks.ci;
22

3+
/**
4+
* Copyright 2020 The MathWorks, Inc.
5+
*
6+
* Describable class for adding MATLAB installations in Jenkins Global Tool configuration.
7+
*
8+
*/
9+
310
import hudson.CopyOnWrite;
411
import hudson.EnvVars;
512
import hudson.Extension;
@@ -15,6 +22,9 @@
1522
import java.util.Arrays;
1623
import java.util.List;
1724
import javax.annotation.CheckForNull;
25+
import javax.annotation.Nonnull;
26+
27+
import jenkins.model.Jenkins;
1828
import net.sf.json.JSONObject;
1929
import org.jenkinsci.Symbol;
2030
import org.kohsuke.stapler.DataBoundConstructor;
@@ -28,12 +38,20 @@ public MatlabInstallation(String name, @CheckForNull String home, List<? extends
2838
super(Util.fixEmptyAndTrim(name), Util.fixEmptyAndTrim(home), properties);
2939
}
3040

41+
/*
42+
* Constructor for Custom object
43+
* */
44+
45+
public MatlabInstallation(String name){
46+
super(name, null, null);
47+
}
48+
3149
@Override public MatlabInstallation forEnvironment(EnvVars envVars) {
3250
return new MatlabInstallation(getName(), envVars.expand(getHome()), getProperties().toList());
3351
}
3452

3553
@Override
36-
public MatlabInstallation forNode(Node node, TaskListener log) throws IOException, InterruptedException {
54+
public MatlabInstallation forNode(@Nonnull Node node, TaskListener log) throws IOException, InterruptedException {
3755
return new MatlabInstallation(getName(), translateFor(node, log), getProperties().toList());
3856
}
3957

@@ -43,6 +61,23 @@ public void buildEnvVars(EnvVars env) {
4361
env.put("PATH+matlabroot", pathToExecutable);
4462
}
4563

64+
public static MatlabInstallation[] getAll () {
65+
return Jenkins.get().getDescriptorByType(DescriptorImpl.class).getInstallations();
66+
}
67+
68+
public static boolean isEmpty() {
69+
return getAll().length == 0;
70+
}
71+
72+
public static MatlabInstallation getInstallation(String name) {
73+
for (MatlabInstallation inst : getAll()) {
74+
if (name.equals(inst.getName())) {
75+
return inst;
76+
}
77+
}
78+
return null;
79+
}
80+
4681
@Extension @Symbol("matlab")
4782
public static class DescriptorImpl extends ToolDescriptor<MatlabInstallation> {
4883
@CopyOnWrite
@@ -71,7 +106,5 @@ public void setInstallations(MatlabInstallation... matlabInstallations) {
71106
this.installations = matlabInstallations;
72107
save();
73108
}
74-
75109
}
76-
77110
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.mathworks.ci;
2+
3+
/**
4+
* Copyright 2020 The MathWorks, Inc.
5+
*
6+
* Describable class for MATLAB Axis that provides a list of configured MATLAB installation for
7+
* generating matrix configurations.
8+
*
9+
*/
10+
11+
import hudson.Extension;
12+
import hudson.matrix.Axis;
13+
import hudson.matrix.AxisDescriptor;
14+
import hudson.matrix.MatrixProject;
15+
import org.kohsuke.stapler.DataBoundConstructor;
16+
17+
import java.util.ArrayList;
18+
import java.util.Arrays;
19+
import java.util.List;
20+
21+
public class MatlabInstallationAxis extends Axis {
22+
23+
@DataBoundConstructor
24+
public MatlabInstallationAxis(List<String> values) {
25+
super(Message.getValue("Axis.matlab.key"), evaluateValues(values));
26+
}
27+
28+
static private List<String> evaluateValues(List<String> values) {
29+
// Add default configuration is values are null or not selected.
30+
if (values == null || values.isEmpty()) {
31+
values = new ArrayList<>(Arrays.asList("default"));
32+
}
33+
return values;
34+
}
35+
36+
@Extension
37+
public static class DescriptorImpl extends AxisDescriptor{
38+
39+
@Override
40+
public String getDisplayName() {
41+
return Message.getValue("Axis.matlab.key");
42+
}
43+
44+
@Override
45+
public boolean isInstantiable() {
46+
return !isMatlabInstallationEmpty();
47+
}
48+
49+
public boolean checkUseMatlabVersion(Object it) {
50+
return MatlabItemListener.getMatlabBuildWrapperCheckForPrj(((MatrixProject) it).getFullName()) && !isMatlabInstallationEmpty();
51+
}
52+
53+
public MatlabInstallation[] getInstallations () {
54+
return MatlabInstallation.getAll();
55+
}
56+
57+
public String getUseMatlabWarning() {
58+
return Message.getValue("Axis.use.matlab.warning");
59+
}
60+
61+
public boolean isMatlabInstallationEmpty() {
62+
return MatlabInstallation.isEmpty();
63+
}
64+
65+
public String getNoInstallationError() {
66+
return Message.getValue("Axis.no.installed.matlab.error");
67+
}
68+
}
69+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.mathworks.ci;
2+
3+
/**
4+
* Copyright 2020 The MathWorks, Inc.
5+
*
6+
* Item listener class to provide functionality to check UI element states for a
7+
* Multi-configuration project.
8+
*
9+
*/
10+
11+
import hudson.Extension;
12+
import hudson.matrix.MatrixConfiguration;
13+
import hudson.matrix.MatrixProject;
14+
import hudson.model.Item;
15+
import hudson.model.TopLevelItem;
16+
import hudson.model.listeners.ItemListener;
17+
import jenkins.model.Jenkins;
18+
19+
import java.util.Collection;
20+
import java.util.HashMap;
21+
import java.util.List;
22+
import java.util.Map;
23+
24+
@Extension
25+
public final class MatlabItemListener extends ItemListener {
26+
private static final Map<String, Boolean> prjCheckMatlabAxis = new HashMap<>();
27+
private static final Map<String, Boolean> prjCheckMatlabBuildWrapper = new HashMap<>();
28+
29+
@Override
30+
public void onLoaded(){
31+
checkItems(Jenkins.get().getItems());
32+
}
33+
34+
@Override
35+
public void onUpdated(Item item) {
36+
if(!(item instanceof MatrixProject)){
37+
return;
38+
}
39+
checkSingleItem(item);
40+
}
41+
42+
43+
private void checkItems(List<TopLevelItem> items) {
44+
for(TopLevelItem item : items){
45+
if(item instanceof MatrixProject){
46+
check((MatrixProject) item);
47+
}
48+
}
49+
}
50+
51+
private void checkSingleItem(Item item){
52+
check((MatrixProject) item);
53+
}
54+
55+
private void check(MatrixProject prj) {
56+
checkForAxis(prj);
57+
checkForBuildWrapper(prj);
58+
}
59+
60+
private void checkForAxis(MatrixProject prj) {
61+
boolean checkForAxis = false;
62+
Collection<MatrixConfiguration> configurations = prj.getActiveConfigurations();
63+
for(MatrixConfiguration conf : configurations){
64+
String matlabAxisValue = conf.getCombination().get(Message.getValue("Axis.matlab.key"));
65+
if (matlabAxisValue != null) {
66+
checkForAxis = true;
67+
break;
68+
}
69+
}
70+
prjCheckMatlabAxis.put(prj.getFullName(), checkForAxis);
71+
}
72+
73+
private void checkForBuildWrapper(MatrixProject prj) {
74+
boolean checkForBuildWrapper = false;
75+
for(Object bWrapper : prj.getBuildWrappersList().toArray()) {
76+
if(bWrapper instanceof UseMatlabVersionBuildWrapper){
77+
checkForBuildWrapper = ((UseMatlabVersionBuildWrapper) bWrapper).getMatlabInstallationName() != null;
78+
break;
79+
}
80+
}
81+
prjCheckMatlabBuildWrapper.put(prj.getFullName(), checkForBuildWrapper);
82+
}
83+
84+
public static boolean getMatlabAxisCheckForPrj(String prjName) {
85+
return prjCheckMatlabAxis.get(prjName) != null && prjCheckMatlabAxis.get(prjName);
86+
}
87+
88+
public static boolean getMatlabBuildWrapperCheckForPrj(String prjName) {
89+
return prjCheckMatlabBuildWrapper.get(prjName) != null && prjCheckMatlabBuildWrapper.get(prjName);
90+
}
91+
}

src/main/java/com/mathworks/ci/RunMatlabCommandBuilder.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import java.io.IOException;
1010
import javax.annotation.Nonnull;
11-
import org.jenkinsci.Symbol;
1211
import org.kohsuke.stapler.DataBoundConstructor;
1312
import org.kohsuke.stapler.DataBoundSetter;
1413
import org.kohsuke.stapler.StaplerRequest;
@@ -21,6 +20,7 @@
2120
import hudson.model.Result;
2221
import hudson.model.Run;
2322
import hudson.model.TaskListener;
23+
import hudson.model.Computer;
2424
import hudson.tasks.BuildStepDescriptor;
2525
import hudson.tasks.Builder;
2626
import jenkins.tasks.SimpleBuildStep;
@@ -101,7 +101,7 @@ public void perform(@Nonnull Run<?, ?> build, @Nonnull FilePath workspace,
101101

102102
// Invoke MATLAB command and transfer output to standard
103103
// Output Console
104-
104+
105105

106106
buildResult = execMatlabCommand(workspace, launcher, listener, getEnv());
107107

@@ -112,6 +112,13 @@ public void perform(@Nonnull Run<?, ?> build, @Nonnull FilePath workspace,
112112

113113
private synchronized int execMatlabCommand(FilePath workspace, Launcher launcher,
114114
TaskListener listener, EnvVars envVars) throws IOException, InterruptedException {
115+
116+
/*
117+
* Handle the case for using MATLAB Axis for multi conf projects by adding appropriate
118+
* matlabroot to env PATH
119+
* */
120+
Utilities.addMatlabToEnvPathFrmAxis(Computer.currentComputer(), listener, envVars);
121+
115122
final String uniqueTmpFldrName = getUniqueNameForRunnerFile();
116123
final String uniqueCommandFile =
117124
"command_" + getUniqueNameForRunnerFile().replaceAll("-", "_");

src/main/java/com/mathworks/ci/RunMatlabTestsBuilder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import hudson.model.Result;
2929
import hudson.model.Run;
3030
import hudson.model.TaskListener;
31+
import hudson.model.Computer;
3132
import org.kohsuke.stapler.DataBoundConstructor;
3233
import org.kohsuke.stapler.DataBoundSetter;
3334
import org.kohsuke.stapler.StaplerRequest;
@@ -271,6 +272,13 @@ public void perform(@Nonnull Run<?, ?> build, @Nonnull FilePath workspace,
271272

272273
private synchronized int execMatlabCommand(FilePath workspace, Launcher launcher,
273274
TaskListener listener, EnvVars envVars) throws IOException, InterruptedException {
275+
276+
/*
277+
* Handle the case for using MATLAB Axis for multi conf projects by adding appropriate
278+
* matlabroot to env PATH
279+
* */
280+
Utilities.addMatlabToEnvPathFrmAxis(Computer.currentComputer(), listener, envVars);
281+
274282
final String uniqueTmpFldrName = getUniqueNameForRunnerFile();
275283
ProcStarter matlabLauncher;
276284
try {

0 commit comments

Comments
 (0)