📖 Scenario: You are working in a software team that needs to build and test an application on multiple operating systems. To save time, you want Jenkins to run builds on Windows, Linux, and macOS automatically in parallel.
🎯 Goal: Create a Jenkins pipeline using a matrix build to run the same build steps on three platforms: windows, linux, and mac.
📋 What You'll Learn
Create a Jenkins pipeline with a matrix block
Define an axis called os with values windows, linux, and mac
Inside the matrix, run a simple shell or batch command to print the current OS
Print the build result for each platform
💡 Why This Matters
🌍 Real World
Matrix builds help teams test software on many platforms automatically, saving time and catching platform-specific bugs early.
💼 Career
Understanding matrix builds is important for DevOps engineers and build managers to optimize CI/CD pipelines for multi-platform projects.
Progress0 / 4 steps
1
Create the Jenkins pipeline skeleton
Write a Jenkins pipeline script starting with pipeline { and agent any to allow builds on any available agent.
Jenkins
Hint
Start with pipeline { and specify agent any to run on any agent.
2
Add a matrix block with an axis for OS
Inside the pipeline, add a stages block with one stage named Build. Inside this stage, add a matrix block with an axis called os having values windows, linux, and mac.
Jenkins
Hint
Use matrix { axes { axis { name 'os' values 'windows', 'linux', 'mac' } } inside the Build stage.
3
Add build steps inside the matrix to print the OS
Inside the matrix block, add a stages block with a stage named Run. Inside this stage, add a steps block that runs a shell command echo Building on ${os} for Linux and macOS, and a batch command echo Building on %os% for Windows. Use when condition to run the correct command based on the os value.
Jenkins
Hint
Use script block with if (os == 'windows') to run bat command, else run sh command.
4
Print the build result for each platform
Add a post block inside the matrix block to print Build finished on ${os} after the build steps complete.
Jenkins
Hint
Use post { always { echo "Build finished on ${os}" } } inside the matrix block.
Practice
(1/5)
1. What is the main purpose of using a matrix build in Jenkins for multi-platform projects?
easy
A. To run the same build steps on multiple platform combinations automatically
B. To run only one build on a single platform
C. To manually select which platform to build on
D. To speed up builds by skipping tests
Solution
Step 1: Understand matrix build concept
A matrix build runs the same steps on different combinations of variables like OS and architecture.
Step 2: Identify the purpose for multi-platform
This allows testing and building on all required platforms automatically without manual intervention.
Final Answer:
To run the same build steps on multiple platform combinations automatically -> Option A
Quick Check:
Matrix build = multi-platform automatic runs [OK]
Hint: Matrix builds run all platform combos automatically [OK]
Common Mistakes:
Thinking matrix builds run only on one platform
Confusing matrix with manual selection
Assuming matrix skips tests
2. Which syntax correctly defines two axes named os and arch in a Jenkins matrix build?
easy
A. matrix { axis name='os' values='linux,windows'; axis name='arch' values='x86,arm' }
B. matrix { os: ['linux', 'windows'], arch: ['x86', 'arm'] }
C. axes { axis('os', ['linux', 'windows']); axis('arch', ['x86', 'arm']) }
D. axes { axis { name 'os'; values 'linux', 'windows' } axis { name 'arch'; values 'x86', 'arm' } }
Solution
Step 1: Recall Jenkins matrix axes syntax
Jenkins uses axes { axis { name '...' ; values '...' } } blocks to define axes.
Step 2: Match syntax with options
axes { axis { name 'os'; values 'linux', 'windows' } axis { name 'arch'; values 'x86', 'arm' } } matches the correct syntax with two axis blocks inside axes.
Final Answer:
axes { axis { name 'os'; values 'linux', 'windows' } axis { name 'arch'; values 'x86', 'arm' } } -> Option D
Hint: Use axes { axis { name; values } } for matrix axes [OK]
Common Mistakes:
Using incorrect matrix or axis syntax
Mixing JSON-like syntax instead of Groovy
Missing semicolons or braces
3. Given this Jenkins matrix snippet:
axes {
axis {
name 'os'
values 'linux', 'windows'
}
axis {
name 'arch'
values 'x86', 'arm'
}
}
stages {
stage('Build') {
steps {
echo "Building on ${os} for ${arch}"
}
}
}
How many total build combinations will Jenkins run?
medium
A. 6
B. 2
C. 4
D. 8
Solution
Step 1: Count values in each axis
Axis 'os' has 2 values: linux, windows. Axis 'arch' has 2 values: x86, arm.
Step 2: Calculate total combinations
Total combinations = 2 (os) * 2 (arch) = 4.
Final Answer:
4 -> Option C
Quick Check:
2 OS * 2 arch = 4 builds [OK]
Hint: Multiply axis values count for total combinations [OK]
Common Mistakes:
Adding instead of multiplying axis values
Counting only one axis
Misreading axis values count
4. You wrote this matrix build snippet but Jenkins fails with an error:
axes {
axis {
name 'os'
values 'linux', 'windows'
}
axis {
name 'arch'
value 'x86', 'arm'
}
}
What is the error and how to fix it?
medium
A. Typo: use 'values' instead of 'value' in second axis
B. Missing quotes around 'x86' and 'arm'
C. Axes block should be named 'matrix' not 'axes'
D. Use commas instead of spaces between values
Solution
Step 1: Identify syntax error in axis definition
The second axis uses 'value' instead of the correct 'values' keyword.
Step 2: Correct the keyword
Change 'value' to 'values' to fix the syntax error and allow multiple values.
Final Answer:
Typo: use 'values' instead of 'value' in second axis -> Option A
Quick Check:
Axis keyword must be 'values' [OK]
Hint: Check for 'values' keyword spelling in axes [OK]
Common Mistakes:
Using 'value' instead of 'values'
Forgetting commas between values
Misnaming axes block
5. You want to run a matrix build on OS (linux, windows) and arch (x86, arm), but only run the 'arm' builds on agents labeled 'arm-node'. How do you configure the matrix to achieve this?
hard
A. Set agent { label 'arm-node' } globally for all builds
B. Use agent { label "${arch == 'arm' ? 'arm-node' : ''}" } inside the matrix
C. Add when { expression { arch == 'arm' } } to skip arm builds
D. Use exclude { axis { name 'arch'; value 'arm' } } to remove arm builds
Solution
Step 1: Understand agent labeling per axis value
You want 'arm' builds to run only on 'arm-node' labeled agents, others on default.
Step 2: Use conditional label assignment in agent block
Using agent { label "${arch == 'arm' ? 'arm-node' : ''}" } assigns 'arm-node' label only for arm builds.
Final Answer:
Use agent { label "${arch == 'arm' ? 'arm-node' : ''}" } inside the matrix -> Option B
Quick Check:
Conditional agent label = Use agent { label "${arch == 'arm' ? 'arm-node' : ''}" } inside the matrix [OK]
Hint: Use conditional label in agent block for selective platforms [OK]
Common Mistakes:
Setting global agent label affecting all builds
Skipping arm builds instead of assigning correct agent
Excluding arm builds instead of targeting agent
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.