Skip to content

Commit 56f95cf

Browse files
authored
Merge pull request #3 from matlab-actions/parallelizable-plugin-fix
Update ParallelizableBuildSummaryPlugin.m to fix Windows filepath issue.
2 parents aebe6ad + 588a9e1 commit 56f95cf

3 files changed

Lines changed: 150 additions & 9 deletions

File tree

.github/workflows/bat.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@ permissions:
44
contents: read
55

66
jobs:
7+
plugin-tests:
8+
runs-on: ${{ matrix.os }}
9+
strategy:
10+
fail-fast: false
11+
matrix:
12+
include:
13+
- os: ubuntu-latest
14+
- os: windows-latest
15+
- os: macos-latest
16+
steps:
17+
- uses: actions/checkout@v5
18+
- uses: matlab-actions/setup-matlab@v2
19+
with:
20+
release: latest-including-prerelease
21+
- uses: matlab-actions/run-tests@v2
22+
723
bat:
824
name: Build and Test
925
runs-on: ubuntu-22.04
@@ -14,3 +30,4 @@ jobs:
1430
node-version: 20
1531
- name: Perform npm tasks
1632
run: npm run ci
33+

plugins/+buildframework/ParallelizableBuildSummaryPlugin.m

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
classdef ParallelizableBuildSummaryPlugin < matlab.buildtool.plugins.BuildRunnerPlugin
22

3-
% Copyright 2025 The MathWorks, Inc.
3+
% Copyright 2025-2026 The MathWorks, Inc.
44

55
properties
66
TempFolder
77
end
88

99
methods
10-
function plugin = ParallelizableBuildSummaryPlugin()
11-
tempRoot = getenv("RUNNER_TEMP");
12-
plugin.TempFolder = fullfile(tempRoot, "taskDetails");
10+
function plugin = ParallelizableBuildSummaryPlugin(options)
11+
arguments
12+
options.TempFolder (1,:) string = getenv("RUNNER_TEMP")
13+
end
14+
15+
plugin.TempFolder = fullfile(options.TempFolder, "taskDetails");
1316
end
1417
end
1518

@@ -31,7 +34,8 @@ function runBuild(plugin, pluginData)
3134
end
3235

3336
% Write to file
34-
[fID, msg] = fopen(fullfile(getenv("RUNNER_TEMP"), "buildSummary" + getenv("GITHUB_RUN_ID") + ".json"), "w");
37+
folder = fileparts(plugin.TempFolder);
38+
[fID, msg] = fopen(fullfile(folder, "buildSummary" + getenv("GITHUB_RUN_ID") + ".json"), "w");
3539
if fID == -1
3640
warning("buildframework:BuildSummaryPlugin:UnableToOpenFile","Unable to open a file required to create the MATLAB build summary table: %s", msg);
3741
else
@@ -44,18 +48,28 @@ function runBuild(plugin, pluginData)
4448
function runTask(plugin, pluginData)
4549
runTask@matlab.buildtool.plugins.BuildRunnerPlugin(plugin, pluginData);
4650

47-
name = fullfile(plugin.TempFolder, pluginData.Name + ".mat");
51+
name = fullfile(plugin.TempFolder, matlab.lang.makeValidName(pluginData.Name) + ".mat");
4852
taskDetail = getCommonTaskDetail(pluginData);
49-
save(name, "taskDetail");
53+
54+
try
55+
save(name, "taskDetail");
56+
catch e
57+
warning("buildframework:BuildSummaryPlugin:UnableToSaveTrace", "Unable to save an artifact needed for the build summary.");
58+
end
5059
end
5160

5261
function skipTask(plugin, pluginData)
5362
skipTask@matlab.buildtool.plugins.BuildRunnerPlugin(plugin, pluginData);
5463

55-
name = fullfile(plugin.TempFolder, pluginData.Name + ".mat");
64+
name = fullfile(plugin.TempFolder, matlab.lang.makeValidName(pluginData.Name) + ".mat");
5665
taskDetail = getCommonTaskDetail(pluginData);
5766
taskDetail.skipReason = pluginData.SkipReason;
58-
save(name, "taskDetail");
67+
68+
try
69+
save(name, "taskDetail");
70+
catch e
71+
warning("buildframework:BuildSummaryPlugin:UnableToSaveTrace", "Unable to save an artifact needed for the build summary.");
72+
end
5973
end
6074
end
6175
end
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
classdef tParallelizableBuildSummaryPlugin < matlab.unittest.TestCase
2+
3+
% Copyright 2026 The MathWorks, Inc.
4+
5+
properties
6+
TempFolder
7+
Plugin
8+
Runner
9+
end
10+
11+
methods (TestClassSetup)
12+
function setupPath(testCase)
13+
import matlab.unittest.fixtures.PathFixture;
14+
15+
testCase.applyFixture(PathFixture(fileparts(fileparts(mfilename("fullpath")))));
16+
end
17+
end
18+
19+
methods (TestMethodSetup)
20+
function createPlugin(testCase)
21+
import matlab.unittest.fixtures.WorkingFolderFixture;
22+
23+
testCase.applyFixture(WorkingFolderFixture);
24+
testCase.TempFolder = pwd();
25+
26+
testCase.Plugin = ParallelizableBuildSummaryPlugin(TempFolder=testCase.TempFolder);
27+
testCase.Runner = matlab.buildtool.BuildRunner.withNoPlugins();
28+
testCase.Runner.addPlugin(testCase.Plugin);
29+
end
30+
end
31+
32+
methods (Test)
33+
function runningBuildCreatesSummaryArtifact(testCase)
34+
plan = buildplan();
35+
plan("t1") = Task();
36+
plan("t2") = Task();
37+
38+
testCase.Runner.run(plan, ["t1", "t2"]);
39+
40+
name = "buildSummary" + getenv("GITHUB_RUN_ID") + ".json";
41+
testCase.verifyTrue(isfile(fullfile(testCase.TempFolder, name)));
42+
end
43+
44+
function runningBuildCreatesSummaryArtifactWithExpectedTasks(testCase)
45+
plan = buildplan();
46+
plan("t1") = Task();
47+
plan("t2") = Task();
48+
49+
testCase.Runner.run(plan, ["t1", "t2"]);
50+
51+
name = "buildSummary" + getenv("GITHUB_RUN_ID") + ".json";
52+
f = fullfile(testCase.TempFolder, name);
53+
testCase.assertTrue(isfile(f));
54+
55+
s = readstruct(f);
56+
57+
testCase.verifySize(s, [1 2]);
58+
testCase.verifyEqual(s(1).name, "t1");
59+
testCase.verifyEqual(s(2).name, "t2");
60+
end
61+
62+
function summaryArtifactStatusesAreCorrect(testCase)
63+
plan = buildplan();
64+
plan("t1") = Task();
65+
plan("t2") = Task(Actions=@()error("bam"));
66+
67+
testCase.Runner.run(plan, ["t1", "t2"]);
68+
69+
name = "buildSummary" + getenv("GITHUB_RUN_ID") + ".json";
70+
f = fullfile(testCase.TempFolder, name);
71+
testCase.assertTrue(isfile(f));
72+
73+
s = readstruct(f);
74+
75+
testCase.verifySize(s, [1 2]);
76+
77+
testCase.verifyFalse(s(1).failed);
78+
testCase.verifyFalse(s(1).skipped);
79+
80+
testCase.verifyTrue(s(2).failed);
81+
testCase.verifyFalse(s(2).skipped);
82+
end
83+
84+
function runningBuildCreatesSummaryForTaskGroups(testCase)
85+
plan = buildplan();
86+
plan("g:t") = Task();
87+
88+
testCase.Runner.run(plan, "g:t");
89+
90+
name = "buildSummary" + getenv("GITHUB_RUN_ID") + ".json";
91+
f = fullfile(testCase.TempFolder, name);
92+
93+
testCase.assertTrue(isfile(f));
94+
95+
s = readstruct(f);
96+
97+
testCase.verifySize(s, [1 1]);
98+
testCase.verifyEqual(s(1).name, "g:t");
99+
end
100+
end
101+
102+
end
103+
104+
function plugin = ParallelizableBuildSummaryPlugin(varargin)
105+
plugin = buildframework.ParallelizableBuildSummaryPlugin(varargin{:});
106+
end
107+
108+
function task = Task(varargin)
109+
task = matlab.buildtool.Task(varargin{:});
110+
end

0 commit comments

Comments
 (0)