问题描述
我想将某些字符串的值(在本例中为Git的提交消息)保存为Jenkins中多分支管道的环境变量。这是我的管道的一部分:
pipeline {
agent any
environment {
GIT_MESSAGE = """${bat(
script: 'git log --no-walk --format=format:%s ${%GIT_COMMIT%}',returnStdout: true
)}""".trim()
}
stages {
stage('Environment A'){
steps{
bat 'echo %GIT_MESSAGE%'
bat '%GIT_MESSAGE%'
}
}
...
}
但是在此之后,回显%GIT_MESSAGE%正在重新显示:
echo D:\.jenkins\workspace\folder log --no-walk --format=format:GIT_COMMIT} 1>git
很自然,如果我使用bat'%GIT_MESSAGE%'运行它,它将失败。我知道答案的一部分可能在于将环境变量传递给蝙蝠脚本$ {%GIT_COMMIT%}的方式,但我似乎无法弄清楚该怎么做。
有什么想法吗?
解决方法
我刚刚解决了这个问题。它与groovy执行字符串插值的方式有关。我保留了它与单行字符串(即“ ...”)一起使用的功能,但我很确定它应与多行字符串(“”“ ...”“”)一起使用。 这是目前可行的解决方案:
pipeline {
agent any
environment {
GIT_MESSAGE = "${bat(script: "git log --no-walk --format=format:%%s ${GIT_COMMIT}",returnStdout: true)}".readLines().drop(2).join(" ")
}
stages {
stage('Environment A'){
steps{
bat 'echo %GIT_MESSAGE%'
bat '%GIT_MESSAGE%'
}
}
...
}
请注意,readLines()
,drop(2)
和join(" ")
在必要的情况下仅为了获得提交消息而没有运行命令的路径。
在bat函数的脚本参数中使用“ ...”也很重要,否则将不会发生插值,并且将无法识别环境变量GIT_COMMIT。