首页 > 解决方案 > Jenkins Pipeline ${params.Environment} 错误替换

问题描述

我正在尝试通过 Jenkins 管道向 docker run 中的 docker 容器发送命令。Jenkins 机器在不同的服务器上,而 docker 镜像在不同的服务器上。当我对环境参数进行硬编码时,脚本会按预期执行。但是每当我尝试用参数替换它时,它都会出错:

bash: ${params.Environment} 错误替换

这是我的管道脚本

pipeline {
    agent any 
       parameters {
          choice(
              name: 'Environment',
              choices: ['qa','dev'],
              description: 'Passing the Environment'
            )
       }
       stages {
          stage('Environment') {
             steps {
                 echo " The environment is ${params.Environment}"
             }
          }
          stage('run') {
             steps {
                sh 'ssh 10.x.x.x \'sudo docker run --name docker_container_name docker_image_name sh -c "cd mytests ; pip3 install -r requirements.txt ; python3 runTests.py -env  ${params.Environment} "\''
             }
         }
      }
    }

标签: dockerjenkins-pipeline

解决方案


命令的sh参数需要有双引号,或者三重双引号。

sh """ssh 10.x.x.x 'sudo docker run --name docker_container_name docker_image_name sh -c "cd mytests ; pip3 install -r requirements.txt ; python3 runTests.py -env  ${params.Environment} "'"""

在管道脚本使用的 Groovy 语言中,单引号字符串根本不做任何插值,因此${params.Environment}字符串按原样传递给 shell。 双引号字符串会执行插值,因此 Groovy 引擎会${params.Environment}在调用 shell 之前进行替换。

(您可能会查看对Using Docker with Pipeline的原生支持,它可以避免ssh 'sudo "..."'包装,尽管它要求 Jenkins 能够在工作节点上运行 Docker 本身。)


推荐阅读