Jenkins - Running instances of single build concurrently

Jenkins has a check box: "Execute concurrent builds if necessary"

If you check this, then it'll start multiple builds for a job.

This works with the "This build is parameterized" checkbox.

You would still trigger the builds, passing your A or B as parameters. You can use another job to trigger them or you could do it manually via a script.


You can select Build a Multi-configuration project (Matrix build) when you create the job. Then, under the job's configuration, you can define the Configuration Matrix which lets you specify one or more parameters (axes) for different builds. Regarding running simultaneously, you should be able to run as many simultaneous builds as you have executors (with the appropriate label).

Unfortunately, the Jenkins wiki lacks documentation about this setup. There are a couple previous SO questions, here and here, that might provide a little guidance. There was a "recent" blog post about setting up a multi-configuration job to perform builds on various platforms.


A newer (and better) solution is the Jenkins Job DSL Plugin.

We've been using it with great success. Our job configurations are now disposable... we can set up a huge stack of complicated jobs from some groovy files and a couple template jobs. It's great.

I'm liking it a lot more than the matrix builds, which were complicated and harder to understand.


Nothing stopping you doing this using the Jenkins pipeline DSL.

We have the same pipeline running in parallel in order to model combined loads for an application that exposes web services, provides a database to several external applications, receives data via several work queues and has a GUI front end. The business gives us non-functional requirements (NFRs) which our application must meet that guarantees its responsiveness even at busy times.

The different instances of the pipeline are run with different parameters. The first instance might be WS_Load, the second GUI_Load and the third Daily_Update_Load, modelling a large data queue that needs processing within a certain time-frame. More can be added depending on which combination of loads we're wanting to test.

Other answers have talked about the checkboxes for concurrent builds, but I wanted to mention another issue: resource contention.

If your pipeline uses temporary files or stashes files between pipeline stages, the instances can end up pulling the rug from under each others' feet. For example you can end up deleting a file in one concurrent instance while trying to read the same file in another. We use the following code to ensure stashes and temporary filenames are unique per concurrent instance:

def concurrentStash(stashName, String includes) {
    /* make a stash unique to this pipeline and build
       that can be unstashed using concurrentUnstash() */
    echo "Safe stashing $includes in ${concurrentSafeName(stashName)}..."
    stash name: concurrentSafeName(stashName), includes: includes
}

def concurrentSafeName(name) {
    /* make a name or name component unique to this pipeline and build
     * guards against contention caused by two or more builds from the same
     * Jenkinsfile trying to:
     *   - read/write/delete the same file
     *   - stash/unstash under the same name
     */
    "${name}-${BUILD_NUMBER}-${JOB_NAME}"
}

def concurrentUnstash(stashName) {
    echo "Safe unstashing ${concurrentSafeName(stashName)}..."
    unstash name: concurrentSafeName(stashName)
}

We can then use concurrentStash stashName and concurrentUnstash stashName and the concurrent instances will have no conflict.

If, say, the two pipelines both need to store stats, we can do something like this for filenames:

def statsDir = concurrentSafeName('stats')

and then the instances will each use a unique filename to store their output.