2016-01-12 3 views
0

У меня есть один репозиторий с п каталогами:Построить в Дженкинс, когда подкаталог мерзавца репо был изменен

. 
├── .git 
├── project_1 
├── project_2 
└── project_3 

В Jenkins Я хотел бы иметь 3 сборку для каждого проекта (так я использовал редкие извлечения). Но, если я изменил только project_1 Я хотел был бы построить толькоproject_1. Как настроить jenkins для этого?

+0

Могу ли я спросить, почему вы не создаете 3 отдельных репозитория? – hfm

+0

См. Также http://stackoverflow.com/q/17310959/32453 – rogerdpack

ответ

0

Если его работы на компьютере GUN/Linux, можно запустить сценарий, похожий на это в Дженкинс:

PROJECTX=$(git diff-tree --no-commit-id --name-only -r HEAD | cut -d"/" -f1 | sort | uniq) && \ 
if [ "$PROJECTX" == "project_1" ]; then 
    # build project_1 
elif [ "$PROJECTX" == "project_2" ]; then 
    # build project_2 
elif [ "$PROJECTX" == "project_3" ]; then 
    # build project_3 
fi 
0

Если вы используете Stash в качестве мерзавца сервера вы можете использовать Groovy, чтобы проверить путь вашей фиксации для запуска определенных модулей.

в вашей задании выберите «Подготовьте среду для запуска» и вставьте скрипт ниже «Оцененный скрипт Groovy». Когда скрипт закончит вы можете использовать логические значения окружения, чтобы проверить, есть ли изменения в каждом модуле:

$ {project_1_CHANGED} == TRUE -> Run логика

$ {project_2_CHANGED} == истинные -> Run логика

$ {project_3_CHANGED} == TRUE -> Run логика

Я также хотел бы предложить использовать Multijob плагин, если проекты не связаны между собой.

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 
Смежные вопросы