Сохранить значение strng сообщения фиксации в переменной среды через Jenkins с bat (Windows) и с использованием конвейера?

#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 не была бы распознана.