将Jenkinsfile中的参数传递给Docker容器中的shell命令

时间:2018-04-04 09:10:12

标签: docker jenkins groovy parameters jenkins-pipeline

我有一个带有String参数env_vars的Jenkinsfile。使用此参数,我想设置自定义环境变量,我希望稍后在启动的Docker容器中使用shell命令进行设置。在运行时设置这样的环境变量很重要。

这是我的简单Jenkinsfile

pipeline {
    options {
        timestamps()
    }
    agent {
        node {
            label 'master'
        }
    }
    parameters {
        string(name: 'env_vars', defaultValue: 'MY_USER_PASSWORD=abc MY_USER_NAME=def', description: 'the ENV variables to set before starting the tests')
    }
    stages {
      stage ('TESTS') {
        steps {
            script {
              withDockerRegistry([credentialsId: 'XXX', url: 'http://example.com']) {
                  withDockerContainer(image: 'myDockerImage:latest') {
                      withCredentials([string(credentialsId: 'cred1', variable: 'cred1'), string(credentialsId: 'cred2', variable: 'cred2')]) {
                          sh '''
                            # here we go to run npm
                            ${env_vars} npm run test -- chrome --tag=enabled
                            '''
                          }
                      }
                  }
            }
        }
      }
    }
}

这个错误我会在Jenkins中得到:

/var/lib/jenkins/jenkins3/jobs/zTestMG/workspace@tmp/durable-40340d0e/script.sh: line 4: MY_USER_PASSWORD=abc: command not found

一种可能的解决方法是使用eval作为shell命令:

eval "${env_vars} npm run test -- chrome --tag=enabled"

但我不想使用eval,因为稍后我必须评估npm run命令的结果。使用eval时,我会遇到新问题。

如何解决在Docker容器中的shell命令中使用String参数的问题?

1 个答案:

答案 0 :(得分:0)

我找到了一个可能的解决方案。我用两个不同的命令替换我的shell命令:

export ${env_vars}
npm run ${run_script_method} -- ${browser} --tag=${tags}