2016-07-13 2 views
0

Информация: Использование Gradle 2.14 в Windows 7 для создания многопроектных проектов JAVA.Лучший способ использования условных зависимостей в Gradle для Jenkins

Когда я строю на своей машине, я хочу использовать библиотеки/подпроекты на своей машине. Когда Дженкинс строит проект, он должен использовать библиотеки/подпроекты из моего репо.

Итак, я создал «JenkinsTask», который существует только для моего оператора IF. Это уже почти работает так, как я этого хочу. Вот код из моего корня проекта Gradle сценария:

task JenkinsTask() { 
//doing nothing 
} 

def ProjectB_Version //defined on command line 

gradle.taskGraph.whenReady {taskGraph -> 
if (taskGraph.hasTask(JenkinsTask)) { 
    println "Archiva dependency" 
      dependencies { 
      compile group: 'Lib_ProjectB', name: 'ProjectB', version: ProjectB_Version 
    } 
} 
else { 
    println "Filesystem dependency" 
      dependencies { 
      compile fileTree(dir: 'ProjectB\\build\\libs', includes: ['*.jar']) 
    }  
} 
} 
compileJava.dependsOn ":ProjectB:build" 

На моей машине я просто запустить gradle build -PProjectB_Version=0.5

На Дженкинс я бегу gradle :build jenkinstask -x :ProjectB:build -PProjectB_Version=0.5

Теперь вопрос, если есть «Gradle» способ сделай это? Поэтому мне не нужен оператор if/else и, возможно, даже может отказаться от командной строки «-x» paramater Jenkins. Особенно «Jenkinstask» чувствует себя взломанным.

Заранее спасибо.

ответ

2

Я не уверен, что это рассматривается как способ градиента, но я думаю, что вы должны объявлять зависимости одинаково независимо от того, кто строит проект и где. Вместо этого я думаю, вы должны:

  1. определяет артефакты хранилищ в зависимости от среды сборки,
  2. базового решения о качестве аргумента командной строки, вместо проверки для задачи в выполнении задачи графа.

Таким образом, вы сможете автоматически генерировать pom для своего проекта локально, потому что для этого градиента необходимо знать группу артефактов и имя. И сценарий сборки будет выглядеть более чистым, на мой взгляд.

Просто поместите что-то вроде этого где-то, прежде чем все ваши задачи:

if (project.hasProperty('jenkins')) { 
    repositories { 
     maven { 
      url "${jenkinsRepoUrl}" 
     } 
    } 
} else { 
    repositories { 
     mavenLocal() 
     mavenCentral() 
    } 
} 

dependencies { 
    compile (
     ['commons-lang:commons-lang:2.4'], 
     ["Lib_ProjectB:ProjectB:${ProjectB_Version}"], 
    } 
} 

и запустить сборку как gradle clean build -PProjectB_Version=0.5 локально и, как gradle clean build -Pjenkins -PProjectB_Version=0.5 -PjenkinsRepoUrl=https://nexuscn.my-company.com/content/repositories/main на Дженкинс.

P.S .: Я бы объявил свойство ProjectB_Version в проекте gradle.properties, так как ваш код может зависеть от фактического API версии.

Смежные вопросы