Email notifications in pipelines in Jenkins - Time & Space Complexity
We want to understand how the time to send email notifications changes as the number of pipeline stages or recipients grows.
How does adding more emails or stages affect the total time spent sending notifications?
Analyze the time complexity of the following Jenkins pipeline snippet that sends emails after each stage.
pipeline {
agent any
stages {
stage('Build') {
steps {
// build steps
emailext to: 'team@example.com', subject: 'Build Complete', body: 'Build finished'
}
}
stage('Test') {
steps {
// test steps
emailext to: 'team@example.com', subject: 'Test Complete', body: 'Tests finished'
}
}
}
}
This pipeline sends an email notification after each stage completes.
Look for repeated actions that take time.
- Primary operation: Sending an email notification after each stage.
- How many times: Once per stage, so the number of emails equals the number of stages.
As the number of stages increases, the total email sends increase linearly.
| Input Size (number of stages) | Approx. Email Sends |
|---|---|
| 10 | 10 emails |
| 100 | 100 emails |
| 1000 | 1000 emails |
Pattern observation: Doubling the number of stages doubles the number of emails sent.
Time Complexity: O(n)
This means the time to send notifications grows directly in proportion to the number of stages.
[X] Wrong: "Sending multiple emails at once takes the same time as sending one email."
[OK] Correct: Each email requires its own sending process, so more emails mean more total time.
Understanding how notification steps scale helps you design efficient pipelines that keep teams informed without slowing down the process too much.
"What if we send one email after all stages instead of after each stage? How would the time complexity change?"
Practice
Solution
Step 1: Understand the role of email notifications
Email notifications are used to keep team members informed about the status of the pipeline automatically.Step 2: Identify the correct purpose
Speeding up execution, increasing stages, or reducing script size are unrelated to email notifications.Final Answer:
To automatically inform team members about pipeline success or failure -> Option CQuick Check:
Email notifications = Inform team automatically [OK]
- Thinking email notifications speed up pipelines
- Confusing notifications with pipeline structure changes
- Assuming notifications reduce script size
post section?Solution
Step 1: Identify correct post condition for failure
Thefailureblock runs only when the pipeline fails, which is correct here.Step 2: Check the email sending syntax
emailextis the correct step for sending emails with extended options;mailis less common and may lack features.Final Answer:
post { failure { emailext to: 'team@example.com', subject: 'Build Failed', body: 'Check the logs.' } } -> Option AQuick Check:
Failure + emailext = Correct syntax [OK]
- Using 'always' instead of 'failure' for failure-only emails
- Using 'success' block for failure notifications
- Using 'mail' instead of 'emailext' without plugin support
post {
success {
emailext to: 'dev@example.com', subject: 'Build Success', body: 'Good job!'
}
failure {
emailext to: 'dev@example.com', subject: 'Build Failed', body: 'Please check.'
}
}Solution
Step 1: Understand post conditions for success
Thesuccessblock triggers only when the build finishes successfully.Step 2: Identify which email is sent on success
The email with subject 'Build Success' is sent to 'dev@example.com' in the success block.Final Answer:
An email with subject 'Build Success' is sent to dev@example.com -> Option DQuick Check:
Success block sends success email [OK]
- Confusing failure email with success email
- Thinking no email is sent on success
- Assuming both emails send regardless of build result
post {
failure {
mail to: 'team@example.com', subject: 'Build Failed', body: 'Fix it!'
}
}What is the likely problem?
Solution
Step 1: Check the email step used
Themailstep is basic and may not work without proper setup;emailextfrom the Email Extension plugin is recommended for reliable emails.Step 2: Confirm correct step for failure emails
Usingemailextensures emails are sent with more options and better support in pipelines.Final Answer:
The 'mail' step requires proper configuration; use 'emailext' instead -> Option BQuick Check:
Use emailext for failure emails [OK]
- Using 'mail' without proper configuration
- Confusing 'failure' with 'always' block
- Incorrect quoting of parameters
Solution
Step 1: Understand the requirement for conditional email on test failure
The email should send only if the build fails and the failure is due to test failures, so a condition checking the build log is needed.Step 2: Analyze the options for conditional logic
post { failure { script { if (currentBuild.rawBuild.getLog(100).any { it.contains('TEST-FAILURE') }) { emailext to: 'qa@example.com', subject: 'Test Failure', body: 'Tests failed!' } } } } uses a script block to check the build log for 'TEST-FAILURE' text before sending the email, matching the requirement exactly.Step 3: Exclude other options
post { always { emailext to: 'qa@example.com', subject: 'Test Failure', body: 'Tests failed!' } } sends email always, ignoring failure condition. post { failure { emailext to: 'qa@example.com', subject: 'Test Failure', body: 'Tests failed!' } } sends email on any failure, not just test failures. post { success { emailext to: 'qa@example.com', subject: 'Test Failure', body: 'Tests failed!' } } sends email on success, which is incorrect.Final Answer:
post { failure { script { if (currentBuild.rawBuild.getLog(100).any { it.contains('TEST-FAILURE') }) { emailext to: 'qa@example.com', subject: 'Test Failure', body: 'Tests failed!' } } } } -> Option AQuick Check:
Conditional script in failure block = post { failure { script { if (currentBuild.rawBuild.getLog(100).any { it.contains('TEST-FAILURE') }) { emailext to: 'qa@example.com', subject: 'Test Failure', body: 'Tests failed!' } } } } [OK]
- Sending emails on all failures without checking cause
- Using 'always' or 'success' blocks incorrectly
- Not using script block for conditional logic
Ready to prove it?
Pass the test and this pattern moves unknown
