доступ запрещен с использованием mkdir и rmdir в jenkins

Дженкинс создает сборку проекта C++, сделанного в Visual Studio.

Во время процесса вызываются некоторые .bat, и в одном из них есть такая структура:

SET TEMPDIR=Temp
rmdir %TEMPDIR% /S /Q
echo Don't continue if there was an error above (except the not found error which is ok) and go hand delete the dir!
:pause
mkdir %TEMPDIR%

Я не очень хорошо знаком с пакетными сценариями, но когда вызываются и rmdir, и mkdir, Дженкинс дает мне access denied.

Я просмотрел конфигурации сборки для поиска любого типа разрешений на чтение/запись, но, похоже, их нет.

Как я могу это исправить? Позже другие скрипты пытаются получить доступ к Temp, но они терпят неудачу, и это ломает мою сборку.


person Daniel    schedule 25.01.2020    source источник
comment
Temp — это относительный путь, так с чем он связан?   -  person aschipfl    schedule 25.01.2020
comment
Не совсем понял, что вы имеете в виду. Temp — это истинное имя папки, на которую ссылается переменная TEMPDIR. Temp используется для хранения двоичных файлов, созданных Visual Studio в процессе сборки. Поскольку это дает мне access denied, папка не создается, и сборка ломается.   -  person Daniel    schedule 25.01.2020
comment
Temp — это литерал, который присваивается TEMPDIR, а не значению, содержащемуся в %Temp%, поэтому это относительный путь от %CWD%. Есть ли у процесса Jenkins привилегии везде, где находится его %CWD%?   -  person jwdonahue    schedule 25.01.2020
comment
Обычная проблема людей, отказывающихся сообщать окнам, где они хотят вещи. Мы используем известные пути в программировании, а не случайные пути, как вы используете.   -  person    schedule 25.01.2020
comment
Может кто-нибудь объяснить разницу между TEMPDIR и %TEMPDIR%? Как я уже сказал, я не эксперт в пакетном синтаксисе, и в данной ситуации это имеет смысл. Я думал, что все, что мне нужно, это добавить дополнительную строку, предоставляющую разрешения.   -  person Daniel    schedule 25.01.2020
comment
Вы используете форму %VAR% для чтения значения, хранящегося в VAR. %CWD% — это встроенная cmd.exe псевдопеременная окружения.   -  person jwdonahue    schedule 25.01.2020
comment
rmdir %TEMPDIR% /S /Q удаляет каталог (не уверен, почему вы это делаете, поскольку пытаетесь воссоздать его сразу) относительно текущего каталога (где бы он ни был - он меняется в зависимости от того, КАК вы запускаете свою программу).   -  person    schedule 25.01.2020
comment
Ну то есть Temp это только имя папки, не указано на каком диске она находится и по какому пути...   -  person aschipfl    schedule 25.01.2020
comment
Он находится в C:\Users\Daniel\....   -  person Daniel    schedule 25.01.2020
comment
rmdir "C:\Users\Daniel\Temp" /s /q удалит эту папку и всегда найдет ее.   -  person    schedule 25.01.2020
comment
В чем разница? Например, предположим, я пишу rmdir "C:\Users\Daniel\Temp" /s /q, вы говорите, что это сработает. Но если я нахожусь в C:\Users\Daniel и пишу rmdir %TEMPDIR% /S /Q, какая разница, что первый случай работает, а второй нет?   -  person Daniel    schedule 25.01.2020
comment
В любом случае, не делайте этого так, войдите в Temp, сделав его своим текущим каталогом, а затем удалите его и его подкаталоги. Затем вы можете снова выйти из него. Это может даже помочь в вашей ситуации, потому что проблема может заключаться в разрешении, основанном только на Temp. Вы можете использовать CD "Temp", RD /S/Q "Temp", CD .. или PushD "Temp", RD /S/Q "Temp", PopD.   -  person Compo    schedule 25.01.2020
comment
Исправление, указанное выше должно быть RD /S/Q "." или `RD /S/Q %CD%.   -  person Compo    schedule 26.01.2020
comment
@Compo, я не думаю, что ты когда-нибудь сможешь удалить текущий каталог.   -  person jwdonahue    schedule 26.01.2020
comment
В этом и был смысл моего комментария, @jdwdonahue. Он удаляет все файлы и каталоги внутри, но оставляет текущий каталог нетронутым, потому что он не может удалить текущий каталог.   -  person Compo    schedule 26.01.2020
comment
@Compo, мои извинения! В конце концов я понял ваши намерения.   -  person jwdonahue    schedule 26.01.2020
comment
Я подозреваю, что конфигурация / сценарии сборки OP написаны плохо, и мы не сможем решить эту проблему без более полной картины того, что происходит. ОП говорит, что сценарии сгенерированы, так что же можно сделать? Перепроектируйте систему сборки, найдите и исправьте все ее недостатки!   -  person jwdonahue    schedule 26.01.2020
comment
В программировании нас не волнует и не беспокоит поиск относительных путей, поскольку мы их не используем. Существует целая куча способов определения абсолютных путей относительно того, что мы ищем.   -  person    schedule 26.01.2020


Ответы (1)


Некоторые из причин, по которым rmdir может выйти из строя:

  • Нет разрешений
  • Каталог содержит файлы.
  • Это текущий рабочий каталог одного или нескольких процессов.
  • Процесс имеет блокировку.

Некоторые причины, по которым mkdir может выйти из строя:

  • Нет разрешений
  • Каталог уже существует.

Сценарий OP пытается создать каталог с именем «Temp» в любом %CD% для процесса, выполняющего этот скрипт. Если есть другие процессы, которые также запускают этот сценарий, или какие-либо процессы, которые по какой-либо причине используют один и тот же путь %CD%\Temp, то могут возникнуть сбои как при создании, так и при удалении этого пути.


В системах сборки часто бывает несколько параллельных процессов и потоков, выполняющих различные программы/скрипты в различных рабочих каталогах. С точки зрения любого экземпляра файла cmd любой путь, являющийся %CD% относительным, фактически является случайным. Все нисходящие системы сборки CI предоставляют переменные среды, которые такие программы/скрипты могут использовать для правильной ориентации относительно известного корня сборки в той или иной форме, часто называемой чем-то вроде BuildRoot.

Но реальная проблема здесь заключается в том, как сценарии OP обрабатывают управление временными каталогами. Они просто недостаточно надежны, чтобы использовать общий временный каталог.


Я бы добавил, что хорошая система сборки CI предоставляет некоторую форму временного каталога для каждого процесса/потока, который программы/скрипты могут использовать без необходимости какого-либо управления каталогами.

person jwdonahue    schedule 25.01.2020
comment
Я думаю, что эти .bat автоматически генерируются визуальной студией. - person Daniel; 25.01.2020
comment
@Daniel, у вас, вероятно, есть настраиваемые этапы сборки, или некоторые из ваших процессов сборки определяются пакетами, которые вы используете. - person jwdonahue; 25.01.2020