【问题标题】:How to pass variables from Jenkinsfile to shell command如何将变量从 Jenkinsfile 传递到 shell 命令
【发布时间】:2017-05-23 04:28:15
【问题描述】:

我想使用我在 Jenkinsfile 脚本中使用的变量,然后将其值传递给 shell 脚本执行(作为环境变量或命令行参数)。

但是下面Jenkinsfile:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh 'echo "from shell i=$i"'
}

给出输出:

a
from shell i=
b
from shell i=
c
from shell i=

所需的输出类似于:

a
from shell i=a
b
from shell i=b
c
from shell i=c

知道如何将 i 的值传递给 shell scipt 吗?

编辑:基于Matt's 的回答,我现在使用这个解决方案:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh "i=${i}; " + 'echo "from shell i=$i"'
}

优点是,我不需要在 shell 脚本中转义 "。

【问题讨论】:

    标签: shell jenkins groovy jenkins-pipeline jenkinsfile


    【解决方案1】:

    您的代码使用的是文字字符串,因此您的 Jenkins 变量不会插入到 shell 命令中。您需要使用" 在sh 内的字符串中插入变量。 ' 只会传递一个文字字符串。所以我们需要在这里做一些改变。

    首先是将'改为":

    for (i in [ 'a', 'b', 'c' ]) {
      echo i
      sh "echo "from shell i=$i""
    }
    

    但是,现在我们需要转义内部的":

    for (i in [ 'a', 'b', 'c' ]) {
      echo i
      sh "echo \"from shell i=$i\""
    }
    

    此外,如果像您在上面所做的那样将变量直接附加到字符串($i 到 i=),我们需要用一些花括号将其关闭:

    for (i in [ 'a', 'b', 'c' ]) {
      echo i
      sh "echo \"from shell i=${i}\""
    }
    

    这会让你得到你想要的行为。

    【讨论】:

    • 谢谢!我希望我能投票 1000 次!单引号与双引号是我的问题!
    【解决方案2】:

    对 Matts 答案的扩展: 对于多行 sh 脚本,使用

    sh """
      echo ${paramName}
    """
    

    而不是

    sh '''
      echo ${paramName}
    '''
    

    【讨论】:

      【解决方案3】:

      试试这个:

      for (i in [ 'a', 'b', 'c' ]) {
          echo i
          sh '''
          echo "from shell i=$i"
          '''
      }
      

      【讨论】:

      • 我无法检查,但也尝试像这样包围 var ${i}
      • 两者都不起作用。检查 groovy 语法,' 和 ''' 之间的区别只是单行字符串与多行字符串。
      • 我相信sh """ 会起作用。即三重双引号而不是三重单引号
      猜你喜欢
      • 2014-01-05
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 2015-08-05
      • 2021-11-30
      • 1970-01-01
      相关资源
      最近更新 更多