Дженкинс обрезает список параметров внутри пакетного скрипта - PullRequest
1 голос
/ 20 февраля 2020

Как часть моего конвейера Jenkins, я хочу заархивировать свой выходной каталог на общий диск, и у меня есть пакетный скрипт, который прекрасно работает при запуске его через оболочку, но когда Jenkins запускает его, аргумент file_names для 7zip пропадает, и он вместо этого архивирует всю папку проекта.

Пакетный скрипт выглядит следующим образом, где GGProjectName имеет строковое значение (без специальных символов), а CHANGESET - целое число

set path=D:\Data\Builds\%GGProjectName%\development

call "C:\Program Files\7-Zip\7z.exe" a -tzip %path%\%GGProjectName%-%CHANGESET%.zip .\Build\

Вызов пакетного скрипта через оболочка выдает следующие выходные данные с GGProjectName = ProjectName и CHANGESET = 2:

E:\Jenkins\ProjectName\ProjectName_Main\workspace>set path=D:\Data\Builds\ProjectName\development

E:\Jenkins\ProjectName\ProjectName_Main\workspace>CALL "C:\Program Files\7-Zip\7z.exe" a -tzip D:\Data\Builds\ProjectName\development\ProjectName-2.zip E:\Jenkins\ProjectName\ProjectName_Main\workspace\Build\

7-Zip [64] 16.04 : Copyright (c) 1999-2016 Igor Pavlov : 2016-10-04

Scanning the drive:
23 folders, 439 files, 718413046 bytes (686 MiB)

Creating archive: D:\Data\Builds\ProjectName\development\ProjectName-2.zip

Items to compress: 462


Files read from disk: 439
Archive size: 137063321 bytes (131 MiB)
Everything is Ok

При запуске Jenkins для запуска того же скрипта выдается следующий вывод с GGProjectName = ProjectName и CHANGESET = 77:

17:04:21  E:\Jenkins\ProjectName\ProjectName_Main\workspace>set path=D:\Data\Builds\ProjectName\development 
17:04:21  
17:04:21  E:\Jenkins\ProjectName\ProjectName_Main\workspace>CALL "C:\Program Files\7-Zip\7z.exe" a -tzip D:\Data\Builds\ProjectName\development\ProjectName-77 
17:05:57  
17:05:57  7-Zip [64] 16.04 : Copyright (c) 1999-2016 Igor Pavlov : 2016-10-04
17:05:57  
17:05:57  Scanning the drive:
17:05:57  856 folders, 14893 files, 2074486211 bytes (1979 MiB)
17:05:57  
17:05:57  Creating archive: D:\Data\Builds\ProjectName\development\ProjectName-77.zip
17:05:57  
17:05:57  Items to compress: 15749
17:05:57  
17:05:57  
17:05:57  Files read from disk: 14893
17:05:57  Archive size: 453305828 bytes (433 MiB)
17:05:57  Everything is Ok

Я идентифицировал проблему как Дженкинс, как-то обрезая последний аргумент вызова 7z.exe, хотя я понятия не имею, что его вызывает.

Стадия Jenkins, на которой выполняется сценарий, чрезвычайно проста, поэтому мне трудно усмотреть в этом причину.

stage('Deploy') {
    steps {
        bat 'publish.bat'
    }
}

Я запускаю Jenkins 2.204.2 на Windows машина.

1 Ответ

0 голосов
/ 23 февраля 2020

Основной проблемой, скорее всего, является строковое значение, присвоенное переменной окружения CHANGESET, которая представляет собой не просто строку 77, а строку 77 с переводом каретки или переводом строки или переводом каретки + line- добавляется feed, что приводит к усеченной командной строке при исполнении Jenkins. Таким образом, источник этой проблемы должен быть найден в коде, который определяет переменную окружения CHANGESET со строкой не только числа, но числа с символом новой строки.

GG_Victor написал в комментарии :

Возврат каретки, похоже, был проблемой, и изменение присвоения CHANGESET, чтобы иметь .trim() на выходе оболочки в jenkinsfile, выглядит так: env.CHANGESET = sh (...).trim() облегчен проблема.

Но было бы еще лучше выяснить, почему переменная окружения CHANGESET определяется со строковым значением с добавлением возврата каретки к числу, поскольку это реальный источник Проблема.


Другая проблема с кодом пакета - это переопределение предопределенной переменной среды PATH со строкой, представляющей собой путь к одной папке. Пожалуйста, взгляните на В чем причина "X не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл"? После длинного ответа сверху вниз вы должны знать, почему path не должен использоваться в качестве имени локальной переменной среды. Лучше было бы FolderPath или ProjectPath или ArchivePath вместо path.

Поэтому первая строка должна быть, например:

set "ArchivePath=D:\Data\Builds\%GGProjectName%\development"

Использование " как здесь сделано, настоятельно рекомендуется. Причина описана в моем ответе:
Почему нет строкового вывода с 'echo% var%' после использования 'set var = text' в командной строке?


Команда CALL необходима только для вызова пакетного файла из пакетного файла. Нет необходимости запускать исполняемый файл из командного файла. Командный процессор Windows останавливает выполнение пакетного файла до тех пор, пока запущенный исполняемый файл не прервется сам. Таким образом, выполнение командного файла в вашем случае не продолжается cmd.exe до тех пор, пока запущенный 7z.exe не завершит создание файла архива и не завершит работу с кодом выхода, возвращенным командному процессору Windows, который присваивает его ERRORLEVEL для оценки одним следующих команд.

Такое поведение при запуске консоли или GUI исполняемого файла из пакетного файла можно легко увидеть, создав пакетный файл со следующими пятью строками и выполнив его двойным щелчком:

@echo off
echo Run Notepad.
%SystemRoot%\Notepad.exe
echo Notepad terminated.
pause

Командный процессор Windows выводит Run Notepad. и запускается следующим Windows Блокнот . В окне консоли отображается Run Notepad., пока открыто графическое окно Блокнот , поскольку cmd.exe ожидает завершения Windows Блокнот . Как только пользователь завершает работу Windows Notepad , командный процессор Windows продолжает работу и выдает следующую строку Notepad terminated. Last, выполнение команды снова приостанавливается из-за команды PAUSE чтобы дать пользователю возможность увидеть, что выполнение пакетного файла продолжилось после завершения Notepad .

Это поведение при запуске исполняемого файла из пакетного файла отличается от запуска исполняемого файла изнутри окно командной строки. Командный процессор Windows не ожидает завершения запуска исполняемого файла, если пользователь открывает командную строку , вводит %SystemRoot%\Notepad.exe и нажимает клавишу RETURN или ENTER для запуска Windows Блокнот . Пользователь может в этом случае сразу же ввести и выполнить следующую команду после переключения с все еще открытого Блокнота окна на окно Windows командной строки.

Поэтому для второй строки следует использовать:

"C:\Program Files\7-Zip\7z.exe" a -bd -tzip -y -- "%ArchivePath%\%GGProjectName%-%CHANGESET%.zip" ".\Build\"

Двойные кавычки настоятельно рекомендуются снова, особенно для полного квалифицированного имени файла архива, содержащего - после пробела, чтобы избежать интерпретации остальных по ошибке как переключение 7z.exe, или для полного квалифицированного имени файла, содержащего пробел или единицу из этих символов &()[]{}^=;!'+,`~. Лучше всегда заключать имена файлов / папок в двойные кавычки, даже если в этом нет особой необходимости.

Три дополнительных ключа -bd, -y и -- описаны с помощью 7. -Zip .

...