如何在 Jenkinsfile 中设置和引用变量
How to set and reference a variable in a Jenkinsfile
我有一个用于我的多分支项目的声明性管道脚本,我想在其中读取一个文本文件并将结果存储为一个字符串变量,以供管道中的后续步骤访问。使用片段生成器我尝试做这样的事情:
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 环境变量?如果是,怎么做?
谢谢
错误是因为您只能在 steps
指令中使用流水线步骤。我知道的一种解决方法是使用 script
步骤并将任意管道脚本包装在其中,并将结果保存在环境变量中,以便以后使用。
所以在你的情况下:
pipeline {
agent any
stages {
stage("foo") {
steps {
script {
env.FILENAME = readFile 'output.txt'
}
echo "${env.FILENAME}"
}
}
}
}
According to the documentation,如果以后想在脚本的其他部分使用该变量的值,也可以设置全局环境变量。在您的情况下,它将在根管道中设置它:
pipeline {
...
environment {
FILENAME = readFile ...
}
...
}
脚本化管道的完整示例:
stage('Build'){
withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
sh 'bash build.sh'
}
}
我们通过在 environment
步骤中添加函数来解决这个问题,即:
environment {
ENVIRONMENT_NAME = defineEnvironment()
}
...
def defineEnvironment() {
def branchName = "${env.BRANCH_NAME}"
if (branchName == "master") {
return 'staging'
}
else {
return 'test'
}
}
我还不能发表评论,但是,只是一个提示:
使用 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评论的,认为值得分享):你可能想trim喜欢这个readFile('output.txt').trim()
我有一个用于我的多分支项目的声明性管道脚本,我想在其中读取一个文本文件并将结果存储为一个字符串变量,以供管道中的后续步骤访问。使用片段生成器我尝试做这样的事情:
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 环境变量?如果是,怎么做?
谢谢
错误是因为您只能在 steps
指令中使用流水线步骤。我知道的一种解决方法是使用 script
步骤并将任意管道脚本包装在其中,并将结果保存在环境变量中,以便以后使用。
所以在你的情况下:
pipeline {
agent any
stages {
stage("foo") {
steps {
script {
env.FILENAME = readFile 'output.txt'
}
echo "${env.FILENAME}"
}
}
}
}
According to the documentation,如果以后想在脚本的其他部分使用该变量的值,也可以设置全局环境变量。在您的情况下,它将在根管道中设置它:
pipeline {
...
environment {
FILENAME = readFile ...
}
...
}
脚本化管道的完整示例:
stage('Build'){
withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
sh 'bash build.sh'
}
}
我们通过在 environment
步骤中添加函数来解决这个问题,即:
environment {
ENVIRONMENT_NAME = defineEnvironment()
}
...
def defineEnvironment() {
def branchName = "${env.BRANCH_NAME}"
if (branchName == "master") {
return 'staging'
}
else {
return 'test'
}
}
我还不能发表评论,但是,只是一个提示: 使用 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评论的,认为值得分享):你可能想trim喜欢这个readFile('output.txt').trim()