With Jenkins script security many of the solutions here become difficult since they are using non-whitelisted methods.
With these milestone steps at the start of the Jenkinsfile, this is working for me:
def buildNumber = env.BUILD_NUMBER as int
if (buildNumber > 1) milestone(buildNumber - 1)
milestone(buildNumber)
The result here would be:
- Build 1 runs and creates milestone 1
- While build 1 is running, build 2 fires. It has milestone 1 and milestone 2. It passes milestone 1, which causes build #1 to abort.