【问题标题】:Groovy parameters are not visible in shell part of a JenkinsfileGroovy 参数在 Jenkinsfile 的 shell 部分中不可见
【发布时间】:2017-05-26 11:49:47
【问题描述】:

我在 Groovy 脚本中遇到问题,其中变量在 shell 脚本部分中不可访问。

脚本-1:

 def a=20;
 println ("a is: $a");

输出-1:

a is: 20

脚本-2:

def a=20;
println ("a is: $a");
sh '''echo a is $a''';

输出 2:

groovy.lang.MissingMethodException:没有方法签名:Script1.sh() 适用于参数类型:(java.lang.String) 值:[echo a is $a] 可能的解决方案:use([Ljava.lang.Object;), is(java.lang.Object), run(), run(), any(), with(groovy.lang.Closure) 在 Script1.run(Script1.groovy:3)

我怎样才能在外壳部分sh 中获得$a = 20。换句话说,在shell脚本部分传递变量$a需要什么操作。

我正在 Jenkins 管道的上下文中编写此脚本,我遇到了一个问题,即常规变量在 shell 部分中不可见。

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline jenkins-2


    【解决方案1】:

    这行得通:

    pipeline {
        agent any
        stages {
            stage('Example') {
                steps {
                    script {
                        // a is accessible globally in the Jenkinsfile
                        a = 20
                        // b is only accessible inside this script block
                        def b = 22
                        sh "echo a is $a"
                        sh "echo b is $b"
                    }
                }
            }
        }
        post { 
            always { 
                sh "echo a is $a"
            }
        }
    }
    

    您应该在 shell 语句中使用双引号,而不是三重单引号。

    【讨论】:

    • 谢谢,我学到了一两点,但你确定第二点吗?在一个常见的 Groovy 脚本中,情况并非如此(如 OP 所示),但在 Jenkins Pipeline 脚本中是否有所不同? (我知道他们是……特别的)。或者你的意思是我们应该使用大括号? (我理解)
    • @qlown 你是对的,第二点不正确。调整了我的答案。
    • @haschibaschi,请参考此链接groovyconsole.appspot.com/script/5088905221111808 我仍然遇到同样的问题
    • @Yash 您无法在 groovy 控制台中执行此代码块。 sh 是 jenkins 实现的 dsl word。这仅在詹金斯上运行。我在 jenkins 管道作业中测试了该脚本并且它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多