【问题标题】:Pass dynamic parameters to Gradle Jenkins plugin将动态参数传递给 Gradle Jenkins 插件
【发布时间】:2016-04-11 14:28:56
【问题描述】:

我正在使用 Gradle Jenkins 插件创建一个执行 Gradle 构建的 Jenkins 作业。 我有几个始终需要的参数,这些参数被传递给 Jenkins“参数化构建”。这些参数正确地传递给 gradlew.bat,格式如下:

-DParam1=value1 

现在有一些额外的参数本质上是动态的,我更喜欢使用单个 Jenkins 参数,例如“AdditionalParamters”并像这样传递这些值:

 "-DoptionalParam1=value1 -DOptionalParam2=value2". 

如果我使用这样的参数,那么传递给 Gradle 的值是“-DAdditionalParamters=-DoptionalParam1=value1 -DOptionalParam2=value2”,这不是我想要传递的。

那么有没有办法通过使用单个 Jenkins 参数将多个系统参数传递给 gradle?

【问题讨论】:

  • 为什么要一键传递多个系统属性?有什么优势?
  • @BenGreen,我们有超过 50 个不同的配置属性,其中大部分都有默认值。但是,我们可能需要通过设置系统属性来更改这些默认值。因此,如果我们必须更改第 48 和第 49 属性,我可以将其设置为 -DoptionalParam48=value48 -DOptionalParam49=value49
  • 那么,如果您在 gradle 中检查这些参数,为什么不能在 jenkins 作业中只使用 -DoptionalParam48=value48 呢?拥有 -DAdditionalParameters=-DoptionalParam48=value48 有什么好处
  • 为了让我从 jenkins 获得一个 -DoptionalParam48=value48 传递给 gradle,我必须在 Jenkins“参数化构建”中添加一个新参数“optionalParam48”。同样,1-50 个参数中的每一个都需要相同的方法,这使得 Jenkins 参数页面变得丑陋。这就是我考虑使用通用“OptionalParamters”方法的原因。使用 OptionalParamters,我可以将尽可能多的 name=value 对传递给 Gradle

标签: jenkins gradle


【解决方案1】:

当 Jenkins 将参数传递给 Gradle 时,它​​们被设置为系统属性。现在的任务是解析作为“附加参数”传递的“-DoptionalParam1=value1 -DOptionalParam2=value2”,然后将这些作为 JVM 参数进一步传递给 Java 应用程序。下面是执行此操作的 Gralde 代码 sn-p。为了简化“附加参数”作为“可选参数1=值1 可选参数2=值2”传递,即没有-D 语法。

    task runJavaApp(type: JavaExec, dependsOn: build) {

        def jvmParams = []
        project.gradle.startParameter.systemPropertiesArgs.entrySet().each{
        if (it.key!="Additional Parameters") {
            jvmParams <<  "-D${it.key}=${it.value}"
        } else {
            def tokens = (it.value).split(/\s{1,}/)
            tokens.each {
                def key, value
                if (it.split('=').length == 2)
                    (key, value )= it.split('=')
                else
                    throw new Exception("'${it}' should be of type key=value");
                jvmParams <<  "-D${key}=${value}"
                }
            }//if
        }
        jvmArgs jvmParams
        workingDir = project.executeDir
        classpath = sourceSets.main.runtimeClasspath + files(project.executeDir)
        main = 'myApplicaionMainClass'
    }

【讨论】:

    猜你喜欢
    • 2016-09-24
    • 2016-02-10
    • 2015-02-27
    • 2021-09-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    相关资源
    最近更新 更多