使用Env {} => environment {}将脚本移植到声明式的Jenkinsfile时出现问题

时间:2019-05-20 11:57:39

标签: jenkins jenkins-pipeline environment jenkins-declarative-pipeline

我在将脚本移植到声明性管道时遇到了问题。我曾经有脚本: //脚本化

var arrayAbjad=[{char:"الف",value: 1},{char:"ب", value: 2},{char:"ج", value: 3}]
function letterValue(str){
    var sum = 0;
    for(var charIndex = 0; charIndex < str.length; charIndex++){
      for(var i = 0; i < arrayAbjad.length; i++){
        if(str[charIndex] == arrayAbjad[i].char){
          sum += arrayAbjad[i].value;
        }
      }
    }
    return sum;
}

let str = prompt('enter string');
console.log(letterValue(str));

现在我想要声明性地

//声明性

بج

当我尝试运行此命令时,它失败并显示Env

  

org.codehaus.groovy.control.MultipleCompilationErrorsException:   启动失败:WorkflowScript:xx:“ myEnv”不是有效的环境   表达。将“键=值”对与有效的Java / shell键配合使用。

足够公平。 为了能够使用声明性环境{}避免在以后的每步中使用withEnv(myEnv),我该怎么办?

2 个答案:

答案 0 :(得分:0)

您似乎缺少的部分是使用environment子句。

代替

environment { myEnv }

应该是

environment { myEnvVal = myEnv }

就像错误方法提到的那样,这应该是键=值对。

答案 1 :(得分:0)

您的问题来自变量myEnv的类型。您进行def myEnv = [:]时将其定义为地图。

因此,它可以与takes a map as parameterwithEnv一起使用,但不能与takes only "key = value" statementsenvironment {...}一起使用。

解决方案取决于您如何添加myEnv中包含的环境变量。

最简单的方法是使用environment指令,列出先前变量myEnv中包含的所有键/值:

pipeline{
    agent none
    environment {
        test1 = 'test-1'
        test2 = 'test-2'
    }
    stages{
        stage('Fancy stuff'){
            steps{
                echo "${test1}"
            }
        }
        stage('Fancy stuff2'){
            steps{
                echo "${test2}"
            }
        }
    }
}

但是您也可以按照脚本方式进行操作:

pipeline{
    agent none
    stages{
        stage('Prepare my env') {
            steps {
                script {
                    def test = []
                    for (int i = 1; i < 3; ++i) {
                        test[i] = 'test-' + i.toString()
                    }
                    test1 = test[1]
                    test2 = test[2]
                }
            }
        }
        stage('Fancy stuff'){
            steps{
                echo "${test1}"
            }
        }
        stage('Fancy stuff2'){
            steps{
                echo "${test2}"
            }
        }
    }
}