// Example envs, could be one of the following def defaultEnvs = [ [env: "stage", region: "us-east-1"], [env: "prod", region: "us-east-1"] ] // Or def defaultEnvs = [ [env: "stage", region: "us-east-1"] ] // Or def defaultEnvs = [ [env: "stage", region: "us-east-1"], [env: "prod", region: "us-east-1"], [env: "stage", region: "eu-central-1"], [env: "prod", region: "eu-central-1"] ] // Etc... stage("Plan") { def planJobs = [:] for(int i = 0; i < envs.size(); i++) { def details = envs.get(i) planJobs["${details-env}-${details.region}"] = { node() { checkout scm // run things, etc } } } parallel(planJobs) } stage("Apply") { def applyJobs = [:] for(int i = 0; i < envs.size(); i++) { def details = envs.get(i) applyJobs["${details-env}-${details.region}"] = { def apply = false try { confirmedUser = input message: 'Apply Plan?', ok: 'Apply', submitterParameter: 'confirmedUser' apply = true } catch (err) { apply = false currentBuild.result = 'ABORTED' } if(apply) { node() { checkout scm // run things, etc } } } } parallel(applyJobs) }