#batch-file #variables #jenkins #commit #environment
#пакетный файл #переменные #дженкинс #фиксация #Окружающая среда
Вопрос:
Я хотел бы сохранить значение некоторой строки (в данном случае сообщение о фиксации из 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%'
}
}
...
}
Но после этого echo %GIT_MESSAGE% запускается повторно:
echo D:.jenkinsworkspacefolder log --no-walk --format=format:GIT_COMMIT} 1>git
И, естественно, если я запускаю его с помощью bat ‘%GIT_MESSAGE%’, он завершается неудачей. Я знаю, что часть ответа может заключаться в том, как передать переменную окружения скрипту bat ${%GIT_COMMIT%}, но, похоже, я не могу понять, как это сделать.
Есть какие-нибудь идеи?
Комментарии:
1. Чтобы установить возвращаемое значение из команды в качестве переменной, вам нужно либо выполнить команду с помощью
For /F
цикла; или, если результатом является вывод в одну строку, (или только в первой строке) , вывести результат в текстовый файл и задать переменную с помощьюSet /P "VariableName=" 0< "OutputFile.ext"
, при необходимости удалив файл впоследствии.2. Я не пробовал использовать переменные среды space из Windows для решения этой проблемы, я хотел использовать возможности среды Pipeline framework от Jenkins. Хотя стоило бы попробовать.
Ответ №1:
Я только что решил эту проблему. Это было связано с тем, как 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(" ")
там, где это необходимо, чтобы получить сообщение о фиксации только без указания пути, с которого была запущена команда.
Также было важно использовать «…» внутри параметра script функции bat, иначе интерполяция не произойдет и переменная окружения GIT_COMMIT не была бы распознана.