From 8776debfa52539801742680cfe98bd54f53c7f62 Mon Sep 17 00:00:00 2001 From: tsharma Date: Fri, 15 Nov 2024 15:33:10 +0530 Subject: [PATCH 1/5] test demo service messages --- .../com/mathworks/ci/MatlabCommandRunner.java | 14 ++++ .../mathworks/ci/RunMatlabCommandService.java | 2 + .../mathworks/ci/RunMatlabTestsService.java | 2 + .../+teamcity/TestVisualizationPlugin.m | 70 +++++++++++++++++++ .../+plugins/TestVisualizationPluginService.m | 9 +++ .../com/mathworks/ci/MatlabConstants.java | 5 ++ 6 files changed, 102 insertions(+) create mode 100644 matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m create mode 100644 matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java index 8b47908..6ad4069 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java @@ -121,6 +121,20 @@ public void unzipToTempDir(String zipName) throws IOException { zipFile.extractAll(tempDirectory.toString()); } + public void copyTestPluginsToTempDir(String pluginName) throws IOException{ + File pluginFileLocation = new File(this.tempDirectory, pluginName); + + // Ensure the directory structure exists + File parentDir = pluginFileLocation.getParentFile(); + if (!parentDir.exists()) { + if (!parentDir.mkdirs()) { + throw new IOException("Failed to create directories: " + parentDir); + } + } + + copyFileToWorkspace(pluginName, pluginFileLocation); + } + public void copyFileToWorkspace(String sourceFile, File targetFile) throws IOException { InputStream is = MatlabCommandRunner.class.getClassLoader().getResourceAsStream(sourceFile); java.nio.file.Files.copy(is, targetFile.toPath(), REPLACE_EXISTING); diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java index e72fdd8..898f233 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java @@ -35,6 +35,8 @@ public ProgramCommandLine makeProgramCommandLine() throws RunBuildException { ProgramCommandLine value; try { value = this.runner.createCommand(getContext(), getMatlabCommand()); + this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN); + this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN_SERVICE); } catch (Exception e) { throw new RunBuildException(e); } diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java index d5f1c10..f570561 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java @@ -51,6 +51,8 @@ public ProgramCommandLine makeProgramCommandLine() throws RunBuildException { ProgramCommandLine value; try { this.runner.unzipToTempDir(MatlabConstants.MATLAB_SCRIPT_GENERATOR); + this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN); + this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN_SERVICE); value = this.runner.createCommand(getContext(), runnerScript); } catch (Exception e) { throw new RunBuildException(e); diff --git a/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m new file mode 100644 index 0000000..5b87210 --- /dev/null +++ b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m @@ -0,0 +1,70 @@ +classdef TestVisualizationPlugin < matlab.unittest.plugins.TestRunnerPlugin + +% Copyright 2024 The MathWorks, Inc. + + methods (Access=protected) + + % Write about covered edgecases as well for function based tests instead of class based tests + + function runTest(plugin, pluginData) + classAndTestName = strrep(pluginData.Name,"/","."); + % fprintf("##teamcity[testStarted name='%s' captureStandardOutput='true']",pluginData.Name) + % fprintf("##teamcity[testStarted name='%s' captureStandardOutput='true']",pluginData.TestSuite.TestClass + "." + pluginData.TestSuite.ProcedureName) + % In the above method -> Test class becomes null for function based tests + fprintf("##teamcity[testStarted name='%s' captureStandardOutput='true']", classAndTestName) + + % Invoke super class method to run the test + runTest@matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData); + + result = pluginData.TestResult; + + if result.Failed + + % display(result.Details.DiagnosticRecord.Report); + + % Not using fprintf as it treats / as a backslash escape character, which we recieve in the error logs like In L:\Projects\matlab-teamcity-plugin. (errors out) + % fprintf(result.Details.DiagnosticRecord.Report); + + % fprintf("##teamcity[testFailed name='%s' errorDetails='%s' status='ERROR']", pluginData.Name, result.Details.DiagnosticRecord.Report); % possibly include error details here + % fprintf("##teamcity[testFailed name='%s' status='ERROR']", pluginData.Name); + fprintf("##teamcity[testFailed name='%s' status='ERROR']", classAndTestName); + elseif result.Incomplete + % fprintf("##teamcity[testIgnored name='%s']", pluginData.Name); + fprintf("##teamcity[testIgnored name='%s']", classAndTestName); + end + + % fprintf("##teamcity[testFinished name='%s' duration='%f']", pluginData.Name, result.Duration) + fprintf("##teamcity[testFinished name='%s' duration='%f']", classAndTestName, result.Duration) + end + + % pluginData.TestResult.Passed | pluginData.TestResult.Failed | pluginData.TestResult.Incomplete + + % function runTestSuite(plugin, pluginData) + % fprintf("##teamcity[testSuiteStarted name='%s']","suiteName") + + % groupNumber = pluginData.Group; + % totalGroups = pluginData.NumGroups; + % suiteSize = numel(pluginData.TestSuite); + % fprintf('### Running %d tests in Group %d of %d\n', suiteSize, groupNumber, totalGroups); + + % % Invoke the super class method + % runTestSuite@matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData) + + % fprintf("##teamcity[testSuiteFinished name='%s']","suiteName") + % % pluginData.TestSuite.TestClass + % end + + function runSession(plugin, pluginData) + % Introspect into pluginData to get TestSuite size + suiteSize = numel(pluginData.TestSuite); + fprintf('### Running a total of %d tests\n', suiteSize); + fprintf('test run session started\n'); + % fprintf("##teamcity[testRetrySupport enabled='true']"); + % Invoke the super class method + runSession@matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData) + fprintf("##teamcity[testRetrySupport enabled='true']"); + fprintf('test run session ended'); + end + + end +end \ No newline at end of file diff --git a/matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m b/matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m new file mode 100644 index 0000000..5a4155c --- /dev/null +++ b/matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m @@ -0,0 +1,9 @@ +classdef TestVisualizationPluginService < matlab.buildtool.internal.services.ciplugins.CITestRunnerPluginService + % Copyright 2024 The MathWorks, Inc. + + methods + function plugins = providePlugins(~, ~) + plugins = ciplugins.teamcity.TestVisualizationPlugin(); + end + end +end \ No newline at end of file diff --git a/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java b/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java index a9286e0..d9399cb 100644 --- a/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java +++ b/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java @@ -35,6 +35,11 @@ public interface MatlabConstants { static final String RUN_EXE_MACI = "maci64/run-matlab-command"; static final String RUN_EXE_LINUX = "glnxa64/run-matlab-command"; static final String MATLAB_SCRIPT_GENERATOR = "matlab-script-generator.zip"; + + // MATLAB default plugin paths + static final String TEST_VISUALIZATION_PLUGIN = "+ciplugins/+teamcity/TestVisualizationPlugin.m"; + static final String TEST_VISUALIZATION_PLUGIN_SERVICE = "+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m"; + //Test runner file prefix static final String MATLAB_TEST_RUNNER_FILE_PREFIX = "runner_"; From cb0488aa96ff53fe52eb8a006fbcaca1a407d67f Mon Sep 17 00:00:00 2001 From: tsharma Date: Thu, 26 Dec 2024 12:18:47 +0530 Subject: [PATCH 2/5] adds build visualization plugin --- .../com/mathworks/ci/MatlabCommandRunner.java | 32 +++++++- .../mathworks/ci/RunMatlabBuildService.java | 8 +- .../mathworks/ci/RunMatlabCommandService.java | 6 +- .../mathworks/ci/RunMatlabTestsService.java | 3 +- .../+teamcity/BuildVisualizationPlugin.m | 22 ++++++ .../+teamcity/TestVisualizationPlugin.m | 75 ++++--------------- .../+ciplugins/+teamcity/getDefaultPlugins.m | 13 ++++ .../+plugins/TestVisualizationPluginService.m | 2 +- .../com/mathworks/ci/MatlabConstants.java | 2 + 9 files changed, 96 insertions(+), 67 deletions(-) create mode 100644 matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m create mode 100644 matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/getDefaultPlugins.m diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java index 6ad4069..1b75ffd 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Arrays; +import java.util.HashMap; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -23,6 +24,11 @@ public class MatlabCommandRunner { private File tempDirectory; + private Map additionalEnvVars; + + public MatlabCommandRunner() { + this.additionalEnvVars = new HashMap(); + } public void setTempDirectory(File dir) { this.tempDirectory = dir; @@ -45,6 +51,14 @@ public ProgramCommandLine createCommand(BuildRunnerContext runnerContext, String //Add MATLAB to PATH Variable addToPath(runnerContext, matlabPath); + //Add custom environment variables + for (Map.Entry envVar : additionalEnvVars.entrySet()) { + String key = envVar.getKey(); + String value = envVar.getValue(); + + runnerContext.addEnvironmentVariable(key, value); + } + return new SimpleProgramCommandLine(runnerContext, executable, command); } @@ -120,8 +134,22 @@ public void unzipToTempDir(String zipName) throws IOException { ZipFile zipFile = new ZipFile(zipFileLocation); zipFile.extractAll(tempDirectory.toString()); } + + public void addEnvironmentVariable(String key, String value) { + additionalEnvVars.put(key, value); + } - public void copyTestPluginsToTempDir(String pluginName) throws IOException{ + public void copyBuildPluginsToTemp() throws IOException{ + copyPluginsToTempDir(MatlabConstants.DEFAULT_PLUGIN); + copyPluginsToTempDir(MatlabConstants.BUILD_VISUALIZATION_PLUGIN); + } + + public void copyTestPluginsToTemp() throws IOException{ + copyPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN); + copyPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN_SERVICE); + } + + public void copyPluginsToTempDir(String pluginName) throws IOException{ File pluginFileLocation = new File(this.tempDirectory, pluginName); // Ensure the directory structure exists @@ -131,7 +159,7 @@ public void copyTestPluginsToTempDir(String pluginName) throws IOException{ throw new IOException("Failed to create directories: " + parentDir); } } - + copyFileToWorkspace(pluginName, pluginFileLocation); } diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java index b0efa9d..4844081 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java @@ -40,13 +40,19 @@ public ProgramCommandLine makeProgramCommandLine() throws RunBuildException { ProgramCommandLine value; try { - String cmd = "buildtool"; + String cmd = "addpath('" + + runner.getTempDirectory() + + "'); buildtool"; if (!getTaskName().isEmpty()){ cmd += " " + getTaskName(); } if (!getBuildOptions().isEmpty()){ cmd += " " + getBuildOptions(); } + this.runner.copyBuildPluginsToTemp(); + this.runner.copyTestPluginsToTemp(); + // Set build environment variable + this.runner.addEnvironmentVariable("MW_MATLAB_BUILDTOOL_DEFAULT_PLUGINS_FCN_OVERRIDE","ciplugins.teamcity.getDefaultPlugins"); value = this.runner.createCommand(getContext(), cmd); } catch (Exception e) { throw new RunBuildException(e); diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java index 898f233..9ba14c5 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java @@ -35,8 +35,10 @@ public ProgramCommandLine makeProgramCommandLine() throws RunBuildException { ProgramCommandLine value; try { value = this.runner.createCommand(getContext(), getMatlabCommand()); - this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN); - this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN_SERVICE); + this.runner.copyBuildPluginsToTemp(); + this.runner.copyTestPluginsToTemp(); + // Set build environment variable + this.runner.addEnvironmentVariable("MW_MATLAB_BUILDTOOL_DEFAULT_PLUGINS_FCN_OVERRIDE","ciplugins.teamcity.getDefaultPlugins"); } catch (Exception e) { throw new RunBuildException(e); } diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java index f570561..41b9607 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabTestsService.java @@ -51,8 +51,7 @@ public ProgramCommandLine makeProgramCommandLine() throws RunBuildException { ProgramCommandLine value; try { this.runner.unzipToTempDir(MatlabConstants.MATLAB_SCRIPT_GENERATOR); - this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN); - this.runner.copyTestPluginsToTempDir(MatlabConstants.TEST_VISUALIZATION_PLUGIN_SERVICE); + this.runner.copyTestPluginsToTemp(); value = this.runner.createCommand(getContext(), runnerScript); } catch (Exception e) { throw new RunBuildException(e); diff --git a/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m new file mode 100644 index 0000000..45ee3fa --- /dev/null +++ b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m @@ -0,0 +1,22 @@ +classdef BuildVisualizationPlugin < matlab.buildtool.plugins.BuildRunnerPlugin + +% Copyright 2025 The MathWorks, Inc. + + methods (Access=protected) + + function runTaskGraph(plugin, pluginData) + runTaskGraph@matlab.buildtool.plugins.BuildRunnerPlugin(plugin, pluginData); + end + + function runTask(plugin, pluginData) + disp("##teamcity[blockOpened name ='" + pluginData.TaskResults.Name + "']"); + disp("##teamcity[progressStart 'Running " + pluginData.TaskResults.Name + " Task']"); + + runTask@matlab.buildtool.plugins.BuildRunnerPlugin(plugin, pluginData); + + disp("##teamcity[progressFinish 'Running " + pluginData.TaskResults.Name + " Task']"); + disp("##teamcity[blockClosed name ='" + pluginData.TaskResults.Name + "']"); + end + + end +end \ No newline at end of file diff --git a/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m index 5b87210..bbc5cf1 100644 --- a/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m +++ b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/TestVisualizationPlugin.m @@ -1,70 +1,27 @@ classdef TestVisualizationPlugin < matlab.unittest.plugins.TestRunnerPlugin -% Copyright 2024 The MathWorks, Inc. +% Copyright 2025 The MathWorks, Inc. methods (Access=protected) - % Write about covered edgecases as well for function based tests instead of class based tests - - function runTest(plugin, pluginData) - classAndTestName = strrep(pluginData.Name,"/","."); - % fprintf("##teamcity[testStarted name='%s' captureStandardOutput='true']",pluginData.Name) - % fprintf("##teamcity[testStarted name='%s' captureStandardOutput='true']",pluginData.TestSuite.TestClass + "." + pluginData.TestSuite.ProcedureName) - % In the above method -> Test class becomes null for function based tests - fprintf("##teamcity[testStarted name='%s' captureStandardOutput='true']", classAndTestName) - - % Invoke super class method to run the test - runTest@matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData); - - result = pluginData.TestResult; - - if result.Failed - - % display(result.Details.DiagnosticRecord.Report); - - % Not using fprintf as it treats / as a backslash escape character, which we recieve in the error logs like In L:\Projects\matlab-teamcity-plugin. (errors out) - % fprintf(result.Details.DiagnosticRecord.Report); - - % fprintf("##teamcity[testFailed name='%s' errorDetails='%s' status='ERROR']", pluginData.Name, result.Details.DiagnosticRecord.Report); % possibly include error details here - % fprintf("##teamcity[testFailed name='%s' status='ERROR']", pluginData.Name); - fprintf("##teamcity[testFailed name='%s' status='ERROR']", classAndTestName); - elseif result.Incomplete - % fprintf("##teamcity[testIgnored name='%s']", pluginData.Name); - fprintf("##teamcity[testIgnored name='%s']", classAndTestName); - end + function runTest(plugin, pluginData) + classAndTestName = strrep(pluginData.Name,"/","."); + + fprintf("##teamcity[testStarted name='%s' captureStandardOutput='true']", classAndTestName) - % fprintf("##teamcity[testFinished name='%s' duration='%f']", pluginData.Name, result.Duration) - fprintf("##teamcity[testFinished name='%s' duration='%f']", classAndTestName, result.Duration) - end + % Invoke super class method to run the test + runTest@matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData); - % pluginData.TestResult.Passed | pluginData.TestResult.Failed | pluginData.TestResult.Incomplete + result = pluginData.TestResult; - % function runTestSuite(plugin, pluginData) - % fprintf("##teamcity[testSuiteStarted name='%s']","suiteName") - - % groupNumber = pluginData.Group; - % totalGroups = pluginData.NumGroups; - % suiteSize = numel(pluginData.TestSuite); - % fprintf('### Running %d tests in Group %d of %d\n', suiteSize, groupNumber, totalGroups); - - % % Invoke the super class method - % runTestSuite@matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData) - - % fprintf("##teamcity[testSuiteFinished name='%s']","suiteName") - % % pluginData.TestSuite.TestClass - % end - - function runSession(plugin, pluginData) - % Introspect into pluginData to get TestSuite size - suiteSize = numel(pluginData.TestSuite); - fprintf('### Running a total of %d tests\n', suiteSize); - fprintf('test run session started\n'); - % fprintf("##teamcity[testRetrySupport enabled='true']"); - % Invoke the super class method - runSession@matlab.unittest.plugins.TestRunnerPlugin(plugin, pluginData) - fprintf("##teamcity[testRetrySupport enabled='true']"); - fprintf('test run session ended'); - end + if result.Failed + fprintf("##teamcity[testFailed name='%s' status='ERROR']", classAndTestName); + elseif result.Incomplete + fprintf("##teamcity[testIgnored name='%s']", classAndTestName); + end + fprintf("##teamcity[testFinished name='%s' duration='%f']", classAndTestName, result.Duration) end + + end end \ No newline at end of file diff --git a/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/getDefaultPlugins.m b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/getDefaultPlugins.m new file mode 100644 index 0000000..40f4088 --- /dev/null +++ b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/getDefaultPlugins.m @@ -0,0 +1,13 @@ +function plugins = getDefaultPlugins(pluginProviderData) + + % Copyright 2025 The MathWorks, Inc. + + arguments + pluginProviderData (1,1) struct = struct(); + end + + plugins = [ ... + matlab.buildtool.internal.getFactoryDefaultPlugins(pluginProviderData) ... + ciplugins.teamcity.BuildVisualizationPlugin() ... + ]; +end \ No newline at end of file diff --git a/matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m b/matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m index 5a4155c..9ee5f2c 100644 --- a/matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m +++ b/matlab-plugin-agent/src/main/resources/+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m @@ -1,5 +1,5 @@ classdef TestVisualizationPluginService < matlab.buildtool.internal.services.ciplugins.CITestRunnerPluginService - % Copyright 2024 The MathWorks, Inc. + % Copyright 2025 The MathWorks, Inc. methods function plugins = providePlugins(~, ~) diff --git a/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java b/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java index d9399cb..dbf5cca 100644 --- a/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java +++ b/matlab-plugin-common/src/main/java/com/mathworks/ci/MatlabConstants.java @@ -37,6 +37,8 @@ public interface MatlabConstants { static final String MATLAB_SCRIPT_GENERATOR = "matlab-script-generator.zip"; // MATLAB default plugin paths + static final String DEFAULT_PLUGIN = "+ciplugins/+teamcity/getDefaultPlugins.m"; + static final String BUILD_VISUALIZATION_PLUGIN = "+ciplugins/+teamcity/BuildVisualizationPlugin.m"; static final String TEST_VISUALIZATION_PLUGIN = "+ciplugins/+teamcity/TestVisualizationPlugin.m"; static final String TEST_VISUALIZATION_PLUGIN_SERVICE = "+matlab/+unittest/+internal/+services/+plugins/TestVisualizationPluginService.m"; From 599ddb125038108336cc601ada06faecac816aef Mon Sep 17 00:00:00 2001 From: tsharma Date: Thu, 26 Dec 2024 17:53:12 +0530 Subject: [PATCH 3/5] refactor code --- .../src/main/java/com/mathworks/ci/MatlabCommandRunner.java | 2 +- .../src/main/java/com/mathworks/ci/RunMatlabBuildService.java | 4 +--- .../main/java/com/mathworks/ci/RunMatlabCommandService.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java index 1b75ffd..34b5ae3 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/MatlabCommandRunner.java @@ -90,7 +90,7 @@ private void createMatlabScriptByName(BuildRunnerContext runnerContext, String c final File matlabCommandFile = new File(this.tempDirectory, uniqueScriptName + ".m"); final String matlabCommandFileContent = - "cd(getenv('MW_ORIG_WORKING_FOLDER'));\n" + command; + "cd(getenv('MW_ORIG_WORKING_FOLDER'));\n" + "addpath('" + this.tempDirectory + "');\n" + command; FileUtils.writeStringToFile(matlabCommandFile, matlabCommandFileContent); } diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java index 4844081..6c32267 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabBuildService.java @@ -40,9 +40,7 @@ public ProgramCommandLine makeProgramCommandLine() throws RunBuildException { ProgramCommandLine value; try { - String cmd = "addpath('" - + runner.getTempDirectory() - + "'); buildtool"; + String cmd = "buildtool"; if (!getTaskName().isEmpty()){ cmd += " " + getTaskName(); } diff --git a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java index 9ba14c5..ec7a64e 100644 --- a/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java +++ b/matlab-plugin-agent/src/main/java/com/mathworks/ci/RunMatlabCommandService.java @@ -34,11 +34,11 @@ public ProgramCommandLine makeProgramCommandLine() throws RunBuildException { ProgramCommandLine value; try { - value = this.runner.createCommand(getContext(), getMatlabCommand()); this.runner.copyBuildPluginsToTemp(); this.runner.copyTestPluginsToTemp(); // Set build environment variable this.runner.addEnvironmentVariable("MW_MATLAB_BUILDTOOL_DEFAULT_PLUGINS_FCN_OVERRIDE","ciplugins.teamcity.getDefaultPlugins"); + value = this.runner.createCommand(getContext(), getMatlabCommand()); } catch (Exception e) { throw new RunBuildException(e); } From 232a534fa7170018081b02e09fe9992da51f75ff Mon Sep 17 00:00:00 2001 From: tsharma Date: Thu, 26 Dec 2024 18:24:07 +0530 Subject: [PATCH 4/5] fix command runner test --- .../test/java/com/mathworks/ci/MatlabCommandRunnerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matlab-plugin-agent/src/test/java/com/mathworks/ci/MatlabCommandRunnerTest.java b/matlab-plugin-agent/src/test/java/com/mathworks/ci/MatlabCommandRunnerTest.java index 4b3eb0a..af2ddb6 100644 --- a/matlab-plugin-agent/src/test/java/com/mathworks/ci/MatlabCommandRunnerTest.java +++ b/matlab-plugin-agent/src/test/java/com/mathworks/ci/MatlabCommandRunnerTest.java @@ -152,7 +152,7 @@ public void verifyScriptCreated() throws IOException, NoSuchMethodException, Ill expectedCommand.add("setenv('MW_ORIG_WORKING_FOLDER', cd('" + currDir.getPath().replaceAll("'", ";;") + "'));" + "matlab_" + currDir.getName()); - + Method generateCommandArgs = getAccessibleMethod("generateCommandArgs", BuildRunnerContext.class, String.class); Object actualCommand = generateCommandArgs.invoke(runner, context, command); @@ -162,7 +162,7 @@ public void verifyScriptCreated() throws IOException, NoSuchMethodException, Ill Assert.assertTrue(expectedFile.exists()); String contents = FileUtils.readFileToString(expectedFile); - Assert.assertEquals(contents, "cd(getenv('MW_ORIG_WORKING_FOLDER'));\n" + command); + Assert.assertEquals(contents, "cd(getenv('MW_ORIG_WORKING_FOLDER'));\naddpath('" + currDir.getPath() + "');\n" + command); } // startup options test From fa20ad801c347bf7f3426d2405bc14b77ec4a275 Mon Sep 17 00:00:00 2001 From: tsharma Date: Mon, 20 Jan 2025 12:24:26 +0530 Subject: [PATCH 5/5] remove unused function from Build Plugin --- .../resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m | 4 ---- 1 file changed, 4 deletions(-) diff --git a/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m index 45ee3fa..128f92b 100644 --- a/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m +++ b/matlab-plugin-agent/src/main/resources/+ciplugins/+teamcity/BuildVisualizationPlugin.m @@ -4,10 +4,6 @@ methods (Access=protected) - function runTaskGraph(plugin, pluginData) - runTaskGraph@matlab.buildtool.plugins.BuildRunnerPlugin(plugin, pluginData); - end - function runTask(plugin, pluginData) disp("##teamcity[blockOpened name ='" + pluginData.TaskResults.Name + "']"); disp("##teamcity[progressStart 'Running " + pluginData.TaskResults.Name + " Task']");