【发布时间】:2017-11-14 17:18:50
【问题描述】:
我在 Groovy 中有一个用于声明性管道的 Jenkinsfile,并创建了两个名为 OCP_TOKEN_VALUE_ONE 和 OCP_TOKEN_VALUE_TWO 的 Jenkins 变量以及相应的值。当我尝试传递一个方法变量并在 sh 命令中使用它时,问题就出现了。
我有下一个代码:
private def deployToOpenShift(projectProps, environment, openshiftNamespaceGroupToken) {
sh """/opt/ose/oc login ${OCP_URL} --token=${openshiftNamespaceGroupToken} --namespace=${projectProps.namespace}-${environment}"""
}
问题是,deployToOpenShift 方法在 openshiftNamespaceGroupToken 变量中有一个值,该值是已在 Jenkins 中设置的变量名称。它需要是动态的,问题是 Jenkins 不解析 Jenkins 变量值,只是作为字符串传递的那个,我的意思是,结果是:
--token=OCP_TOKEN_VALUE_ONE
如果我输入代码
private def deployToOpenShift(projectProps, environment, openshiftNamespaceGroupToken) {
sh """/opt/ose/oc login ${OCP_URL} --token=${OCP_TOKEN_VALUE_ONE} --namespace=${projectProps.namespace}-${environment}"""
}
工作完美,但不是动态的,这是方法变量的重点。如您所见,我已经尝试过使用“””的东西,但没有用。
还有什么想法吗?
编辑调用该方法的代码:
...
projectProps = readProperties file: './gradle.properties'
openShiftTokenByGroup = 'OCP_TOKEN_' + projectProps.namespace.toUpperCase()
...
stage ('Deploy-Dev') {
agent any
steps {
milestone ordinal : 10, label: "Deploy-Dev Milestone"
deployToOpenShift(projectProps, 'dev', openShiftTokenByGroup)
}
}
【问题讨论】:
-
能否展示调用该方法的代码?
-
使用代码@RobHales 编辑
-
您的代码是错误的,因为它定义了一个简单的字符串 OCP_TOKEN_VALUE_ONE,它是变量的名称而不是它的值!
-
@yorammi 但正如我所说,这个字符串是 Jenkins 变量的名称,该变量在另一个阶段的 openshift 插件中被正确评估: openshiftBuild apiURL: "${OCP_URL}", authToken: "$ {openShiftTokenByGroup}", namespace: "${projectProps.namespace}-dev" 我认为问题出在 sh 命令的东西上
-
好的。您是否尝试使用 ' 而不是 """ 来包装 sh 命令?根据我的经验,它在某些情况下的行为会有所不同。
标签: jenkins groovy jenkins-pipeline