Присвойте результат команды переменной в декларативном Jenkinsfile - PullRequest
1 голос
/ 23 апреля 2020

Я реализую декларативный Jenkinsfile и хочу запустить команду windows и присвоить результат переменной.

Вот мой код:

stage('check latest commit') {
    steps {
        script{
            COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'").trim() as String
            echo "${COMMIT}"
        }
    }
}

И я получаю следующий журнал в задании Jenkins

c:\Software\JenkinsWorkspace\workspace\TFS - XXX>c:\Software\Git\bin\git.exe log -n 1 --pretty=format:'%H' 
'656669102c187fe390a1e9d72ed47aa2d8528ad6'[Pipeline] }
[Pipeline] // script

Таким образом, команда выполняется должным образом и возвращает га sh за последний коммит в HEAD. Отлично. Однако:

[Pipeline] End of Pipeline
java.lang.NullPointerException: Cannot invoke method trim() on null object
    at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)

в конце цикла, я получаю эту ошибку. Это означает, что значение, возвращаемое к команде, равно null, даже если сама команда выдает результат.

Если я не включаю усечение, например:

stage('check latest commit') {
    steps {
        script{
            COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'")
            echo "${COMMIT}"
        }
    }
}

следующая запись в журнале показывает:

[Pipeline] bat

c:\Software\JenkinsWorkspace\workspace\TFS - XXX>c:\Software\Git\bin\git.exe log -n 1 --pretty=format:'%H' 
'c77c806cdafd4f45373ef0cef8c6ff60da26611f'[Pipeline] echo
null
[Pipeline] }

Обратите внимание на значение NULL в журнале. Это результат того, что я пытался напечатать значение COMMIT.

Вопрос: Как правильно назначить значение переменной, когда такое значение должно возвращаться из команды cmd. Я реализую декларативный Jenkinsfile, и я не могу сейчас вернуться к сценарию.

РЕДАКТИРОВАТЬ: Да, я знаю, что я мог бы получить коммит га sh другим способом, однако, есть другие команды, которые мне нужно выполнить, и мне также нужны их значения.

Ответы [ 2 ]

4 голосов
/ 23 апреля 2020

Способ выполнения bat step не возвращает никаких выходных данных.

COMMIT = bat("c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'")

Поведение по умолчанию возвращает null и выводит вывод на консоль. Если вы хотите захватить вывод, вам нужно установить для параметра returnStdout значение true.

COMMIT = bat(script: "@c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'", returnStdout: true).trim()

Вы можете проверить на официальной странице документации , чтобы узнать больше обо всех параметрах bat шаг поддерживает.

1 голос
/ 23 апреля 2020

Вам необходимо настроить стандартное поведение шага летучей мыши. См. https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#bat - windows -batch-script

По умолчанию bat просто печатает на консоль. returnStdout даст вам значение, как вы ожидаете. Это уже строка, не нужно кастовать.

COMMIT = bat(returnStdout: true, script: "c:\\Software\\Git\\bin\\git.exe log -n 1 --pretty=format:'%%H'").trim()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...