在Jenkins文件中为Jenkins管道使用shell命令中的参数

Mar*_*tin 7 parameters shell jenkins jenkins-pipeline

我想Jenkinsfile在几个shell命令中使用已定义的参数,但我得到一个例外.在我的例子中,我想执行一个简单的docker命令.该参数定义了docker executable的路径.

这是我的简短Jenkinsfile:

pipeline {
  agent any

  parameters {
    string(defaultValue: '/Applications/Docker.app/Contents/Resources/bin/docker', description: '', name: 'docker')
  }

  stages {
    stage('Test') {
      steps {
        sh 'sudo ${params.docker} ps -a'
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

[e2e-web-tests_master-U4G4QJHPUACAEACYSISPVBCMQBR2LS5EZRVEKG47I2XHRI54NCCQ] Running shell script
/Users/Shared/Jenkins/Home/workspace/e2e-web-tests_master-U4G4QJHPUACAEACYSISPVBCMQBR2LS5EZRVEKG47I2XHRI54NCCQ@tmp/durable-e394f175/script.sh: line 2: ${params.docker}: bad substitution
Run Code Online (Sandbox Code Playgroud)

当我Jenkinsfile在shell命令中不使用参数的情况下更改它时,它成功传递:

pipeline {
  agent any

  parameters {
    string(defaultValue: '/Applications/Docker.app/Contents/Resources/bin/docker', description: '', name: 'docker')
  }

  stages {
    stage('Test') {
      steps {
        sh 'sudo /Applications/Docker.app/Contents/Resources/bin/docker ps -a'
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

那么,如何在Jenkinsfile中使用shell命令中的参数呢?我试过stringtext作为参数类型.

Jam*_*esD 15

您遇到的问题是单引号是标准的java String.

双引号是一个可模板化的String,如果它是模板化的,它将返回一个GString,或者是一个标准的Java String.

所以你用双引号:

  stages {
    stage('Test') {
      steps {
        sh "sudo ${params.docker} ps -a"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后params.docker将替换管道中'sh'脚本中的$ {params.docker}.