Bird
Raised Fist0
Jenkinsdevops~10 mins

Milestone step for concurrency in Jenkins - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Milestone step for concurrency
Start Pipeline
↓
Run Stage 1
↓
Reach Milestone
↓
Check for Previous Milestone
↓
Wait
↓
Run Stage 2
↓
End Pipeline
The pipeline runs stages until it reaches a milestone. If a previous build reached the same milestone, the current build waits or skips to avoid concurrency conflicts.
Execution Sample
Jenkins
pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        milestone 1
      }
    }
  }
}
This Jenkins pipeline uses a milestone step to prevent concurrent builds from passing the same point simultaneously.
Process Table
StepBuild NumberMilestone ReachedPrevious Build MilestoneActionPipeline State
1Build #1Milestone 1NoneProceedBuild #1 at Milestone 1
2Build #2Milestone 1Build #1 reached Milestone 1Wait or SkipBuild #2 waiting at Milestone 1
3Build #1Passed Milestone 1N/AContinueBuild #1 proceeds past Milestone 1
4Build #2Milestone 1Build #1 passed Milestone 1ProceedBuild #2 proceeds past Milestone 1
5Build #2EndN/ACompleteBuild #2 finished
💡 Build #2 waits at Milestone 1 until Build #1 passes it, then proceeds and finishes.
Status Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
Build #1 StateNot startedAt Milestone 1Passed Milestone 1Passed Milestone 1CompletedCompleted
Build #2 StateNot startedWaiting at Milestone 1Waiting at Milestone 1At Milestone 1ProceededCompleted
Key Moments - 2 Insights
Why does Build #2 wait at the milestone instead of proceeding immediately?
Because Build #1 has already reached the same milestone and not passed it yet, Build #2 must wait to avoid concurrency conflicts, as shown in execution_table row 2.
What happens when Build #1 passes the milestone?
Once Build #1 passes the milestone (row 3), Build #2 is allowed to proceed past the milestone (row 4), ensuring only one build passes at a time.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the state of Build #2 at Step 2?
ABuild #2 is proceeding past Milestone 1
BBuild #2 has finished
CBuild #2 is waiting at Milestone 1
DBuild #2 has not started
💡 Hint
Check the 'Action' and 'Pipeline State' columns at Step 2 in the execution_table.
At which step does Build #2 proceed past Milestone 1?
AStep 4
BStep 2
CStep 1
DStep 5
💡 Hint
Look for when Build #1 has passed the milestone and Build #2 moves forward in the execution_table.
If Build #1 never passed Milestone 1, what would happen to Build #2?
ABuild #2 would proceed immediately
BBuild #2 would wait indefinitely at Milestone 1
CBuild #2 would skip the milestone
DBuild #2 would fail
💡 Hint
Refer to the waiting behavior shown in execution_table rows 2 and 3.
Concept Snapshot
milestone <number> step in Jenkins pipeline
- Prevents concurrent builds passing the same point
- Later builds wait if earlier builds haven't passed milestone
- Ensures orderly pipeline execution
- Use milestone to avoid race conditions in concurrency
Full Transcript
This visual execution trace shows how the Jenkins milestone step controls concurrency in pipelines. The pipeline starts with Build #1 reaching milestone 1 and proceeding. When Build #2 reaches the same milestone, it detects Build #1 has not passed it yet and waits. After Build #1 passes milestone 1, Build #2 proceeds and finishes. Variables track each build's state at each step. Key moments clarify why builds wait and when they proceed. The quiz tests understanding of build states and milestone behavior. The snapshot summarizes the milestone step's purpose and usage.

Practice

(1/5)
1. What is the main purpose of the milestone step in a Jenkins pipeline?
easy
A. To allow only the latest pipeline run to continue past a certain point
B. To trigger a new pipeline run automatically
C. To send notifications when a build fails
D. To archive build artifacts for later use

Solution

  1. Step 1: Understand the role of the milestone step

    The milestone step is designed to control concurrency by ensuring only the newest pipeline run proceeds beyond the milestone point.
  2. Step 2: Compare with other pipeline steps

    Other steps like triggering builds or sending notifications do not control concurrency like milestone does.
  3. Final Answer:

    To allow only the latest pipeline run to continue past a certain point -> Option A
  4. Quick Check:

    Milestone controls concurrency = B [OK]
Hint: Milestone lets only the newest run pass a checkpoint [OK]
Common Mistakes:
  • Confusing milestone with notification steps
  • Thinking milestone triggers builds
  • Assuming milestone archives artifacts
2. Which of the following is the correct syntax to add a milestone step with label "BuildCheckpoint" in a Jenkins declarative pipeline?
easy
A. milestone label: 'BuildCheckpoint'
B. milestone('BuildCheckpoint')
C. milestone label = 'BuildCheckpoint'
D. milestone: 'BuildCheckpoint'

Solution

  1. Step 1: Recall the correct milestone syntax

    The milestone step uses named parameters with the syntax: milestone label: 'LabelName'.
  2. Step 2: Identify syntax errors in other options

    Options B, C, and D have incorrect syntax such as missing named parameter format or wrong punctuation.
  3. Final Answer:

    milestone label: 'BuildCheckpoint' -> Option A
  4. Quick Check:

    Correct milestone syntax uses label: 'name' [OK]
Hint: Use named parameter syntax: milestone label: 'Name' [OK]
Common Mistakes:
  • Using parentheses instead of named parameters
  • Using equal sign instead of colon
  • Omitting the label keyword
3. Given this Jenkins pipeline snippet:
stage('Test') {
  steps {
    milestone label: 'TestStart'
    echo 'Running tests'
  }
}

// Two pipeline runs start quickly one after another
What happens to the first pipeline run when the second run reaches the same milestone?
medium
A. The first run continues normally alongside the second
B. The second run waits until the first run finishes
C. The first run is aborted and only the second run continues past the milestone
D. Both runs are aborted at the milestone

Solution

  1. Step 1: Understand milestone concurrency behavior

    When multiple runs reach the same milestone label, Jenkins allows only the latest run to proceed and aborts older runs at that point.
  2. Step 2: Apply this to the scenario

    The second run reaching 'TestStart' milestone causes the first run to abort at that milestone, so only the second run continues.
  3. Final Answer:

    The first run is aborted and only the second run continues past the milestone -> Option C
  4. Quick Check:

    Milestone aborts older runs = D [OK]
Hint: Milestone aborts older runs, keeps newest only [OK]
Common Mistakes:
  • Thinking both runs continue
  • Assuming second run waits
  • Believing both runs abort
4. You added a milestone step in your Jenkins pipeline but it does not seem to abort older runs as expected. Which of the following is the most likely cause?
medium
A. The pipeline is missing the agent block
B. The milestone step is placed after all stages have completed
C. The milestone label is not unique and is reused in multiple places
D. The Jenkins server is offline

Solution

  1. Step 1: Check milestone placement

    The milestone step is most likely placed after all stages have completed. This makes it ineffective because older runs finish before a newer run can reach the milestone to trigger aborts.
  2. Step 2: Evaluate other options

    Label reuse affects log clarity but not concurrency control (ordinals matter). Missing agent prevents runs entirely. Server offline stops everything.
  3. Final Answer:

    The milestone step is placed after all stages have completed -> Option B
  4. Quick Check:

    Milestone placement before completion critical = A [OK]
Hint: Place milestone before critical/protected sections [OK]
Common Mistakes:
  • Placing milestone after all stages
  • Blaming unrelated pipeline syntax
  • Assuming server offline causes milestone issues
5. You want to ensure that only the latest run of your Jenkins pipeline proceeds past the "Deploy" stage, aborting any previous runs stuck at that point. How should you use the milestone step to achieve this?
hard
A. Use milestone label: 'Deploy' only in the first stage
B. Place milestone label: 'Deploy' at the end of the Deploy stage
C. Place milestone label: 'Deploy' in every stage before Deploy
D. Place milestone label: 'Deploy' at the start of the Deploy stage

Solution

  1. Step 1: Identify where to place milestone for concurrency control

    To abort older runs before deploying, place the milestone step at the start of the Deploy stage so only the newest run proceeds.
  2. Step 2: Understand why other placements fail

    Placing milestone at the end or in other stages won't stop older runs before deployment. Using it only in the first stage doesn't control concurrency at Deploy.
  3. Final Answer:

    Place milestone label: 'Deploy' at the start of the Deploy stage -> Option D
  4. Quick Check:

    Milestone at stage start controls concurrency there [OK]
Hint: Put milestone at stage start to block old runs [OK]
Common Mistakes:
  • Placing milestone too late in the stage
  • Using milestone in unrelated stages
  • Not placing milestone at all
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard