【问题标题】:Jenkins pipeline shell stepJenkins 管道外壳步骤
【发布时间】:2017-06-05 10:41:29
【问题描述】:

试图让这个管道正常工作.. 我需要在 groovy 中准备一些变量(列表或字符串),并在 bash 中对其进行迭代。据我了解,groovy 脚本在 jenkins master 上运行,但我需要将一些文件下载到构建工作区中,这就是我尝试在 SH 步骤中下载它们的原因。

import groovy.json.JsonSlurper
import hudson.FilePath
pipeline {
    agent { label 'xxx' }
    parameters {
 ...
    }
    stages {
        stage ('Get rendered images') {
            steps {
                script {
                    //select grafana API url based on environment
                    if ( params.grafana_env == "111" ) {
                        grafana_url = "http://xxx:3001"
                    } else if ( params.grafana_env == "222" ) {
                        grafana_url = "http://yyy:3001"
                    }

                    //get available grafana dashboards
                    def grafana_url = "${grafana_url}/api/search"
                    URL apiUrl = grafana_url.toURL()
                    List json = new JsonSlurper().parse(apiUrl.newReader())
                    def workspace = pwd()
                    List dash_names = []
                    // save png for each available dashboard
                    for ( dash in json ) { 
                        def dash_name = dash['uri'].split('/')
                        dash_names.add(dash_name[1])
                    }
                    dash_names_string = dash_names.join(" ")
                }
                sh "echo $dash_names_string"
                sh """
                    for dash in $dash_names_string;
                    do
                        echo $dash
                    done
                    """
            }
        }
    }
}

运行时出现此错误..

[Pipeline] End of Pipeline
groovy.lang.MissingPropertyException: No such property: dash for class: WorkflowScript
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:458)
    at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getProperty(DefaultInvoker.java:33)
    at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
    at WorkflowScript.run(WorkflowScript:42)

看起来我遗漏了一些明显的东西......

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    用反斜杠转义 shell 变量的 $,这应该会有所帮助:

        for dash in $dash_names_string;
        do
            echo \$dash
        done
    

    【讨论】:

      【解决方案2】:

      问题出在第三行:

      for dash in $dash_names_string;
      do
        echo $dash
      done
      

      它试图在 groovy-land 中找到 $dash 属性,但没有找到。我实际上无法考虑如何通过内联sh 步骤来完成这项工作(可能睡眠不足),但是如果您将 json 响应的相关内容保存到文件中,然后用 shell 脚本替换这四行读取文件并从 Jenkinsfile 中调用它,例如 sh './hotScript.sh',它不会尝试将美元价值评估为 groovy,并且至少应该以不同的方式失败。 :)

      【讨论】: