If you're using Stash as your git server you can use Groovy to test the path of your commit to run specific modules.
in your job select "Prepare an environment for the run" and paste the script below to "Evaluated Groovy script".
When the script will finish you could use the environment Boolean values to test if there was a change in each module:
${project_1_CHANGED} == true --> Run logic
${project_2_CHANGED} == true --> Run logic
${project_3_CHANGED} == true --> Run logic
I would also suggest using Multijob plugin if projects are unrelated.
import groovy.json.JsonSlurper
import hudson.model.*
println "="*90
println "="*35 + " Script Started " + "="*35
println "="*90
def project_1_PATH = """project_1/"""
def project_2_PATH = """project_2/"""
def project_3_PATH = """project_3/"""
def project_1_CHANGED = false
def project_2_CHANGED = false
def project_3_CHANGED = false
def slurper = new JsonSlurper()
// get current thread / Executor and current build
def thr = Thread.currentThread()
def build = thr?.executable
//Get from Env
def stashServer= build.parent.builds[0].properties.get("envVars").find {key, value -> key == 'Stash_Server_HTTP'}
//Get from Job Params
def branch= "Branch"
def resolver = build.buildVariableResolver
def latest_branch = resolver.resolve(branch)
println "param ${branch} value : ${latest_branch}"
println "Stash Server : ${stashServer.value}"
// get latest push user's email address
new_command = """curl -u User:Password -X GET -H "Content-Type: application/json" ${stashServer.value}/rest/api/1.0/projects/${repository}/compare/changes?from=${latest_branch}&to=master&limit=5000"""
proc = new_command.execute()
println "Sleeping for 10 seconds..."
sleep(10000)
// proc.waitFor()
println "Finished getting changes"
def result_changes = proc.in.text
def parse_changes_string = result_changes.substring(result_changes.indexOf("{"))
def latest_changes_json = slurper.parseText(parse_changes_string)
def change_list = latest_changes_json.values
def changed_files_list = []
println "\nThese are the files that were changed: \n"
for (changedFile in change_list)
{
changed_files_list.add(changedFile.path.toString)
println changedFile.path.toString
}
for(oneFilePath in changed_files_list){
if(oneFilePath.contains(project_1_PATH)){
project_1_CHANGED = true }
else if(oneFilePath.contains(project_2_PATH )){
project_2= true }
else if(oneFilePath.contains(project_3_PATH)){
project_3_CHANGED = true}
}
def result_map = [:]
result_map.put('project_1_CHANGED',project_1_CHANGED)
result_map.put('project_2_CHANGED',project_2_CHANGED)
result_map.put('project_3_CHANGED',project_3_CHANGED)
println "="*90
println "="*35 + " Script Ends " + "="*35
println "="*90
return result_map