【问题标题】:Jenkins Pipeline - Bad Substitution ErrorJenkins Pipeline - 错误替换错误
【发布时间】:2021-10-03 21:08:46
【问题描述】:

我正在开发一个 Jenkins 流水线,以使用 Kubernetes 通过动态从属执行 JMeter 脚本。在Get Slave Pods IP Addresses 阶段下的管道中,我尝试使用kubectl 命令使用jsonpath 检索Pod IP。但在执行期间它显示script.sh: line 1: syntax error: bad substitution。请帮助我找出我的脚本出了什么问题。下面是我的管道脚本。

pipeline{
    agent{
        kubernetes {
            yamlFile 'JMeter-master-pod.yaml'
        }
    }

    environment {
        JOBNAME = "jmeter-perf"
    }

    parameters {
        //Project onboarding - Set JMeter Parameters
        string(name: 'jmxFile', description: 'scriptName', defaultValue: "https")
        string(name: 'protocol', description: 'protocol', defaultValue: "testDemoScript")
        string(name: 'host', description: 'host', defaultValue: "catfact.ninja")
        string(name: 'basePath', description: 'basePath', defaultValue: "/breeds?limit=")
        string(name: 'testDataFile', description: 'testDataFile', defaultValue: "testData.csv")
    }

    stages{
        stage('Deploy JMeter Master-Slave Slaves'){
            steps{
                container ('kubehelm') {
                    sh 'echo ==================================== Start deploying JMeter [Slave] Pods ===================================='                   
                    sh 'helm repo update'
                    sh 'helm install --wait jmeter-${JOBNAME}-${BUILD_NUMBER} --set dep.name=jmeter-distributed-slave-${JOBNAME}-${BUILD_NUMBER} custom/10-distributed-jmeter -f JMeter-slave-pods.yaml'                  
                    sh 'kubectl wait --for=condition=ready pods -l app.kubernetes.io/name=jmeter-distributed-slave-${JOBNAME}-${BUILD_NUMBER} --timeout=90s -n perf-platform'
                    sh 'echo ==================================== Completed deploying JMeter [Master - Slave] Nodes ===================================='
                }
            }
        }

        stage('Get Slave Pods IP Addresses') {
            steps {
                container ('kubehelm') {
                    sh 'echo ==================================== Start searching JMeter [Slave] IP Addresses ===================================='
                    script {
                        env.jenkinsSlaveNodes = sh(returnStdout: true, script:'kubectl get pods -l app.kubernetes.io/instance=distributed-jmeter-slave-${JOBNAME}-${BUILD_NUMBER} -n perf-platform -o jsonpath=\'{.items[*].status.podIP}\' | tr \' \' \',\'')
                    }
                    sh 'echo Slave IP Details : ${env.jenkinsSlaveNodes}'
                    sh '==================================== Finish searching JMeter [Slave] IP Addresses ===================================='
                }
            }
        }

        stage('Erase JMeter Slave Nodes') {
            steps {
                container ('kubehelm') {
                        sh 'echo ==================================== Start erasing JMeter [Slave] Pods ===================================='
                        sh 'helm uninstall jmeter-${JOBNAME}-${BUILD_NUMBER}'
                        sh 'kubectl wait --for=condition=delete pods -l app.kubernetes.io/name=jmeter-distributed-slave-${JOBNAME}-${BUILD_NUMBER} --timeout=90s -n perf-platform'
                        sh 'echo ==================================== Finish erasing JMeter [Master - Slave] Nodes ===================================='
                }
            }
        }
    }

    post{
        unsuccessful {
            sh 'echo ==================================== Starting Post Failure ===================================='
            container ('kubehelm') {
                sh 'helm uninstall jmeter-${JOBNAME}-${BUILD_NUMBER}'
                sh 'kubectl wait --for=condition=delete pods -l app.kubernetes.io/name=jmeter-distributed-slave-${JOBNAME}-${BUILD_NUMBER} --timeout=90s -n perf-platform'
            }
            sh 'echo ==================================== Finishing Post Failure ===================================='
        }
    }
}

日志错误如下

[Pipeline] sh
+ echo '====================================' Start searching JMeter '[Slave]' IP Addresses '===================================='
==================================== Start searching JMeter [Slave] IP Addresses ====================================
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ kubectl get pods -l 'app.kubernetes.io/instance=distributed-jmeter-slave-jmeter-perf-23' -o 'jsonpath={.items[*].status.podIP}'
+ tr ' ' ,
[Pipeline] }
[Pipeline] // script
[Pipeline] sh
/home/jenkins/agent/workspace/jmeter-maser-slave-poc@tmp/durable-103cb96e/script.sh: line 1: syntax error: bad substitution
[Pipeline] }
[Pipeline] // container
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Erase JMeter Slave Nodes)
Stage "Erase JMeter Slave Nodes" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] sh
+ echo ==================================== Starting Post Failure ====================================

【问题讨论】:

    标签: shell kubernetes jenkins-pipeline


    【解决方案1】:
    sh 'echo Slave IP Details : ${env.jenkinsSlaveNodes}'
    

    此字符串无效。 看来您想在这里使用 Jenkins 变量,但单个配额阻止这样做,将字符串按原样发送到 sh。 而且从 shell 语法来看,变量名不能在名称中包含点。 我认为您需要在这里使用双倍配额,尝试:

    sh "echo 从站 IP 详细信息:${env.jenkinsSlaveNodes}"

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 2021-03-26
      • 2019-05-19
      • 2011-11-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 2014-01-04
      相关资源
      最近更新 更多