无法在Jenkinsfile中设置环境变量

5
我正在尝试在Jenkins流水线中设置名为"TEST_CONFIG_ROOT"的环境变量,我参考了这里的示例:https://jenkins.io/doc/book/pipeline/jenkinsfile/#working-with-the-environment。但是,当我执行测试时,出现了环境变量未设置的情况,因为我的测试仍然抱怨它没有从env获取变量"TEST_CONFIG_ROOT"的值。请查看下面的JenkinsFile:
node('node1'){


        def buildInput;

      echo 'Deploying my build'
     if(!params.buildName) {
         buildInput = input(
                 id: 'userInput', message: 'What is the build name?', parameters: [
                 [$class: 'StringParameterDefinition', defaultValue: 'abcd-1', description: 'Environment', name: 'buildName']
         ])
      }
      buildToUse = params.buildName ? params.buildName : buildInput;
      echo ("Env: "+buildToUse);



    if ( "${params.buildParam}" == 'prequal' || !params.buildParam ){
        stage('Prequal') {


        }
    }


    node('nodename'){

        if ( "${params.buildParam}" == 'test' || !params.buildParam ){
            withMaven(
                    maven: 'M2Slave',
                    mavenSettingsConfig: 'MavenSettingsXML',
                    mavenLocalRepo: '${HOME}/.m2/repository') {

                stage('Test') {
                    echo 'Testing my build'
                    echo " my work space is ${env.WORKSPACE}"
                    checkout scm

                    environment {
                        TEST_CONFIG_ROOT = '${env.WORKSPACE}/testsE2e/src/main/resources'

                    }

  dir ( 'testsE2e'){
 sh 'mvn clean verify surefire-report:report surefire-report:failsafe-report-only -Dtestngxml=testng.xml -Dhttp.proxyHost=proxy02.com -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy02.com -Dhttps.proxyPort=8080  -Djavax.xml.accessExternalSchema=all'
                        }

                }

            }
        }

    }

}

我尝试使用下面的shell脚本执行导出命令,但这并没有帮助。
echo " my work space is ${env.WORKSPACE}"
sh  'export TEST_CONFIG_ROOT="${WORKSPACE}/testsE2e/src/main/resources"'

当流水线任务被执行时,请查看下面的日志片段:

[Pipeline] echo
 my work space is /usr/home/nodename/Jenkins/workspace/workspace/someName-RCZ4A4MA3GRP4PSVYT4HTVVIKU4J7TW2667CKTZU22CHR2CBEM5Q
[Pipeline] dir
Running in /usr/home/nodename/Jenkins/workspace/workspace/someName-RCZ4A4MA3GRP4PSVYT4HTVVIKU4J7TW2667CKTZU22CHR2CBEM5Q/testsE2e
[Pipeline] {
[Pipeline] sh
[testsE2e] Running shell script
+ mvn clean verify surefire-report:report surefire-report:failsafe-report-only -Dtestngxml=testng.xml -Dhttp.proxyHost=proxy02.com -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy02.com -Dhttps.proxyPort=8080 -Djavax.xml.accessExternalSchema=all
----- withMaven Wrapper script -----
Picked up JAVA_TOOL_OPTIONS: -Dmaven.ext.class.path="/usr/home/nodename/Jenkins/workspace/workspace/someName-RCZ4A4MA3GRP4PSVYT4HTVVIKU4J7TW2667CKTZU22CHR2CBEM5Q@tmp/withMaven00e87287/pipeline-maven-spy.jar" -Dorg.jenkinsci.plugins.pipeline.maven.reportsFolder="/usr/home/nodename/Jenkins/workspace/workspace/someName-RCZ4A4MA3GRP4PSVYT4HTVVIKU4J7TW2667CKTZU22CHR2CBEM5Q@tmp/withMaven00e87287" 
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)
Maven home: /opt/maven/apache-maven-3.3.9
Java version: 1.8.0_111, vendor: Oracle Corporation
Java home: /opt/oracle/jdk1.8.0_111/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-573.7.1.el6.x86_64", arch: "amd64", family: "unix"
[jenkins-maven-event-spy] INFO generate /usr/home/nodename/Jenkins/workspace/workspace/someName-RCZ4A4MA3GRP4PSVYT4HTVVIKU4J7TW2667CKTZU22CHR2CBEM5Q@tmp/withMaven00e87287/maven-spy-20170924-225639-49.log ...
[INFO] Scanning for projects...

1
欢迎来到 StackOverflow,亲爱的 stackoverflow 先生。请重新格式化您的代码示例以获得更好的可读性。 - StephenKing
2个回答

18

我觉得你把声明式管道和脚本管道搞混了(请参阅文档中的Pipeline Syntax)。

以下代码片段属于声明式管道,但你使用了脚本管道。

environment {
    TEST_CONFIG_ROOT = "${env.WORKSPACE}/testsE2e/src/main/resources"
}

使用脚本化管道,实际上更容易:

env.TEST_CONFIG_ROOT = "${env.WORKSPACE}/testsE2e/src/main/resources"

谢谢@StephenKing,我按照您上面说的尝试了,但仍然没有成功。 - learner
那我会说你某些地方搞砸了。将你的管道简化到最小版本,看看它是否有效。 - StephenKing
通过将单引号替换为双引号来修复字符串插值。对于这个错误我很抱歉。 - StephenKing

10

所以,在我的情况下这就是有效的,只是为了让其他人参考。

withEnv(["TEST_CONFIG_ROOT=${env.WORKSPACE}/testsE2e/src/main/resources"]) {
      dir ( 'testsE2e'){
     sh 'mvn clean verify surefire-report:report surefire-report:failsafe-report-only -Dtestngxml=testng.xml -Dhttp.proxyHost=proxy02.com -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy02.com -Dhttps.proxyPort=8080  -Djavax.xml.accessExternalSchema=all'
      }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接