Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions AzureDevOps/DistributeTests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<#
.SYNOPSIS
Distribute tests across multiple agents in VSTS pipeline
.DESCRIPTION
This script divides test files among multiple agents for faster execution. It searches for files matching a specific pattern (for example, `test*`) and assigns them based on the agent number.
For example, if there are multiple files [test1..test10] and 2 agents:
- Agent 1 runs tests from odd-numbered files.
- Agent 2 runs tests from even-numbered files.
For detailed slicing information, see https://docs.microsoft.com/en-us/vsts/pipelines/test/parallel-testing-any-test-runner
#>

$tests = Get-ChildItem .\tests\ -Filter *.m -File # Search for test files matching the specified pattern
$totalAgents = [int]$Env:SYSTEM_TOTALJOBSINPHASE # Standard VSTS variable containing the number of parallel jobs
$agentNumber = [int]$Env:SYSTEM_JOBPOSITIONINPHASE # Current job position
$testCount = $tests.Count

# Handle cases where the pipeline runs without parallel configuration (single agent)
if ($totalAgents -eq 0) {
$totalAgents = 1
}
if (!$agentNumber -or $agentNumber -eq 0) {
$agentNumber = 1
}

Write-Host "Total agents: $totalAgents"
Write-Host "Agent number: $agentNumber"
Write-Host "Total tests: $testCount"

$testsToRun= @()
# Slice test files so each agent gets a unique set of files to execute
For ($i=$agentNumber; $i -le $testCount;) {
$file = $tests[$i-1]

$fileName = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
$testsToRun += "$fileName/*"
$i = $i + $totalAgents
}

# Join all test files into a space-separated string
$testFiles = $testsToRun -Join " "
Write-Host "Tests to run $testFiles"
# Write files into a variable for execution in a subsequent task
Write-Host "##vso[task.setvariable variable=MATLABTestFiles;]$testFiles"
52 changes: 52 additions & 0 deletions AzureDevOps/DistributeTests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/bin/bash
#===============================================================================
#
# FILE: distribute_tests.sh
#
# USAGE: ./distribute_tests.sh
#
# DESCRIPTION: This script divides test files among multiple agents for faster execution. It searches for files matching a specific pattern (for example, `test*`) and assigns them based on the agent number.
# For example, if there are multiple files [test1..test10] and 2 agents:
# - Agent 1 runs tests from odd-numbered files.
# - Agent 2 runs tests from even-numbered files.
# For detailed slicing information, see https://docs.microsoft.com/en-us/vsts/pipelines/test/parallel-testing-any-test-runner
#
#===============================================================================

tests=()
# Search for test files matching the specified pattern
while IFS= read -r file; do
tests+=("$file")
done < <(find ./tests -type f -name "*.m" | sort)

totalAgents=${SYSTEM_TOTALJOBSINPHASE} # Standard VSTS variable containing the number of parallel jobs
agentNumber=${SYSTEM_JOBPOSITIONINPHASE} # Current job positioN
testCount=${#tests[@]}

# Handle cases where the pipeline runs without parallel configuration (single agent)
if [ $totalAgents -eq 0 ]; then
totalAgents=1
fi
if [ -z $agentNumber ]; then
agentNumber=1
fi

echo "Total agents: $totalAgents"
echo "Agent number: $agentNumber"
echo "Total tests: $testCount"

testsToRun=()
# Slice test files so each agent gets a unique set of files
for (( i=agentNumber; i<=testCount; i+=totalAgents )); do
file="${tests[i-1]}"

fileName=$(basename "$file" .m)
testsToRun+=("${fileName}/*")
done

# Join all test files into a space-separated string
testFiles="${testsToRun[*]}"
echo "Tests to run $testFiles"

# Write files into a variable for execution in a subsequent task
echo "##vso[task.setvariable variable=MATLABTestFiles;]$testFiles"
84 changes: 84 additions & 0 deletions AzureDevOps/ParallelStrategy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
jobs:
- job: ParallelWindows
# Specify 'parallel' strategy to run tests in parallel
strategy:
parallel: 2
pool:
vmImage: windows-latest
steps:
# Install MATLAB and required products
- task: InstallMATLAB@1
inputs:
products: MATLAB_Compiler_SDK MATLAB_Test

- task: RunMATLABBuild@1
inputs:
tasks: equivalenceTest
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)
Comment on lines 14 to 18
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aren't these tests being split and run again below?

Copy link
Member Author

@Vahila Vahila Nov 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tests needs some artifacts which are generated by a task in buildfile. I updated the task to 'buildPythonPackage' which generates the artifact.


- powershell: .\AzureDevOps\DistributeTests.ps1
displayName: 'PowerShell script to distribute tests'

- task: RunMATLABTests@1
inputs:
selectByName: $(MATLABTestFiles)
sourceFolder: src
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- job: ParallelLinux
# Specify 'parallel' strategy to run tests in parallel
strategy:
parallel: 2
pool:
vmImage: ubuntu-latest
steps:
# Install MATLAB and required products
- task: InstallMATLAB@1
inputs:
products: MATLAB_Compiler_SDK MATLAB_Test

- task: RunMATLABBuild@1
inputs:
tasks: equivalenceTest
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- bash: chmod +x ./AzureDevOps/DistributeTests.sh && ./AzureDevOps/DistributeTests.sh
displayName: 'Bash script to distribute tests'

- task: RunMATLABTests@1
inputs:
selectByName: $(MATLABTestFiles)
sourceFolder: src
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- job: ParallelMac
# Specify 'parallel' strategy to run tests in parallel
strategy:
parallel: 2
pool:
vmImage: macOS-latest
steps:
# Install MATLAB and required products
- task: InstallMATLAB@1
inputs:
products: MATLAB_Compiler_SDK MATLAB_Test

- task: RunMATLABBuild@1
inputs:
tasks: equivalenceTest
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)

- bash: chmod +x ./AzureDevOps/DistributeTests.sh && ./AzureDevOps/DistributeTests.sh
displayName: 'Bash script to distribute tests'

- task: RunMATLABTests@1
inputs:
selectByName: $(MATLABTestFiles)
sourceFolder: src
env:
MLM_LICENSE_TOKEN: $(MLM_LICENSE_TOKEN)