在 Gradle for Jenkins 中使用条件依赖的最佳方式

Chr*_*ast 0 java dependencies gradle jenkins

信息:在 Windows 7 上使用 Gradle 2.14 构建 JAVA 多项目。

当我在我的机器上构建时,我想在我的机器上使用库/子项目。当 Jenkins 构建项目时,他将使用我的 repo 中的库/子项目。

所以我做了一个“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"
Run Code Online (Sandbox Code Playgroud)

在我的机器上,我只是运行 gradle build -PProjectB_Version=0.5

在詹金斯我跑 gradle :build jenkinstask -x :ProjectB:build -PProjectB_Version=0.5

现在的问题是是否有一种“gradle”方式来做到这一点?所以我不需要 if/else 语句,甚至可以放弃“-x”参数 Jenkins 命令行。特别是“Jenkinstask”感觉就像一个黑客。

先感谢您。

And*_*LED 5

我不确定它是否被视为一种 gr​​adle 方式,但我认为您应该以相同的方式声明依赖项,无论谁构建项目以及在哪里构建。相反,我认为你应该:

  1. 根据构建环境定义工件存储库,
  2. 基于命令行参数的决策,而不是检查任务执行图中的任务。

通过这种方式,您也可以在本地为您的项目自动生成 pom,因为该 gradle 需要知道工件组和名称。在我看来,构建脚本看起来更干净。

只需在所有任务之前放置这样的东西:

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}"],
    }
}
Run Code Online (Sandbox Code Playgroud)

并在gradle clean build -PProjectB_Version=0.5本地和gradle clean build -Pjenkins -PProjectB_Version=0.5 -PjenkinsRepoUrl=https://nexuscn.my-company.com/content/repositories/mainJenkins 上运行构建。

PS:我会ProjectB_Version在项目 gradle.properties 中声明该属性,因为您的代码可能取决于实际版本的 API。