36

我的多分支项目有一个声明性管道脚本,我想在其中读取一个文本文件并将结果存储为字符串变量,以便管道中的后续步骤访问。使用片段生成器我尝试做这样的事情:

filename = readFile 'output.txt'

为此filename将是我的字符串。

我在 Jenkins 控制台输出中收到错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 30: Expected a step @ line 30, column 5.
            filename = readFile 'output.txt'

我是否需要使用一个withEnv步骤来设置输出readFile为 Jenkins 环境变量?如果是这样,怎么做?

谢谢

4

5 回答 5

61

该错误是由于您只能在steps指令中使用管道步骤。我知道的一种解决方法是使用该script步骤并将任意管道脚本包装在其中,并将结果保存在环境变量中,以便以后使用。

所以在你的情况下:

pipeline {
    agent any
    stages {
        stage("foo") {
            steps {
                script {
                    env.FILENAME = readFile 'output.txt'
                }
                echo "${env.FILENAME}"
            }
        }
    }
}
于 2017-03-01T19:36:21.280 回答
26

根据文档,如果您以后想在脚本的其他部分使用变量的值,您还可以设置全局环境变量。在您的情况下,它将在根管道中设置它:

pipeline {
  ...
  environment {
    FILENAME = readFile ...
  }
  ...
}
于 2017-08-16T00:14:46.967 回答
11

我们通过在environment步骤中添加函数来解决这个问题,即:

environment {
    ENVIRONMENT_NAME = defineEnvironment() 
}
...
def defineEnvironment() {
    def branchName = "${env.BRANCH_NAME}"
    if (branchName == "master") {
        return 'staging'
    }
    else {
        return 'test'
    }
}
于 2018-09-25T08:08:36.757 回答
2

我还不能发表评论,但只是一个提示:使用 try/catch 子句以避免破坏管道(如果您确定文件存在,请忽略)

    pipeline {
        agent any
            stages {
                stage("foo") {
                    steps {
                        script {
                            try {                    
                                env.FILENAME = readFile 'output.txt'
                                echo "${env.FILENAME}"
                            }
                            catch(Exception e) {
                                //do something, e.g. echo 'File not found'
                            }
                        }
                   }
    }

另一个提示(这是@hao评论的,认为值得分享):你可能想像这样修剪 readFile('output.txt').trim()

于 2018-11-28T17:39:43.977 回答
2

脚本化管道的完整示例:

       stage('Build'){
            withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
                sh 'bash build.sh'
            }
        }
于 2018-02-23T22:46:14.203 回答