【问题标题】:Jenkins - Passing parameter to groovy functionJenkins - 将参数传递给 groovy 函数
【发布时间】:2020-08-21 06:51:58
【问题描述】:

我一直试图在我的管道中调用另一个带有参数的 groovy 函数,但没有任何运气。
我将参数传递给的 groovy 函数由一个 bash 脚本组成,但是这个 bash 脚本无法识别我传递给它的参数。但是,如果我传递的参数在管道中定义为parameters {},那么它可以工作,但我不想要这个。

问题:
shell 脚本无法识别/理解参数,变量为空,没有值。

管道Jenkins.groovy

def call {
  pipeline {
    parameters { 
      string (name: VAR1, defaultValue: "Peace", description: '' }  <--- This works, but not beneficial
      string (name: VAR2, defaultValue: "Space", description: '' }  <--- This works, but not beneficial
    stages {
      stage ('Run script') {
        steps {
          groovyFunction("${VAR1}", "${VAR2}")
          groovyFunction("Peace", "Space") <--- WHAT I WANT
        }
      }
    }
  }
}

groovyFunction.groovy

def call(var1, var2) {
  sh 'echo MY values ${var1} and ${var2}'
  sh "echo MY values ${var1} and ${var2}" <-- Works using double quotes, this messes up sed and for-loops...
}

带有参数的管道输出:

MY values Peace and Space

不带参数的管道输出:

MY values and

我已尝试按照我上一个问题中的建议使用 environment{} 关键字,但没有任何运气。 Jenkins - environment

我知道存在类似的问题:

注意: 这接近于我提出的问题Shell parameter Jenkins

谢谢。

【问题讨论】:

    标签: bash shell jenkins groovy jenkins-pipeline


    【解决方案1】:

    更新

    我已经更新了使用环境变量的答案,没有environment {}

    使用我在这里使用的环境变量(我稍微重构了你的代码):

    def callfunc() {
      sh 'echo MY values $VARENV1 and $VARENV2'
    }
    
    pipeline {
        agent { label 'agent_1' }
        stages {
          stage ('Run script') {
            steps {
                script {
                    env.VARENV1 = "Peace"
                    env.VARENV2 = "Space"
                }
                callfunc()
            }
          }
        }
    }
    

    env.VARENV1env.VARENV2 是我在script{} 中使用的环境变量。你可以给它们赋值。

    这是我的新输出:

    我真的希望它有所帮助。

    使用 FOR 循环的更新

    对循环的shell脚本使用三重单引号并向其添加grrovy变量:

    def callfunc() {
      sh '''
      export s="key"
      echo $s
      for i in $VARENV1 
        do
          echo "Looping ... i is set to $i"
        done
        '''
    }
    
    pipeline {
        agent { label 'agent_1' }
        stages {
          stage ('Run script') {
            steps {
                script {
                    env.VARENV1 = "Peace"
                }
                callfunc()
            }
          }
        }
    }
    

    输出:

    【讨论】:

    • 您好 Aditya Nair,谢谢您的回答。我遇到的主要问题是将变量传递给一个 bash 脚本的 groovy 函数。我使用的脚本是 groovy 变量和 bash 变量的混合体。我设法使用三双引号 """ 并转义每个 bash 变量 \$ 来解决这个问题。
    • 我明白了...我不了解你,但这听起来像是一个更忙碌的解决方法。上述解决方案可帮助您使用带有 env 前缀的 groovy 变量,该变量可在整个管道中全局使用,更不用说在脚本中带有单引号的 bash 函数 callfunc 内部。如果您觉得上述解决方案是一个更可行的解决方案,请尝试并接受或支持相同的答案。谢谢
    • 我可以看到您可以使用单引号 ',但是如果您也有 shell 变量,例如 for in,这将如何。 groovy 能区分这些吗?
    • 请查看答案...我已根据您的要求对其进行了更新,您可以使用三个单引号,并且仍然可以使用环境变量。
    • 对不起,我遗漏了使用 shell 变量部分...我已经更新了它...似乎在变量之前使用 export 前缀有助于将其与常规变量区分开来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多