【问题标题】:access denied using mkdir and rmdir in jenkins在 jenkins 中使用 mkdir 和 rmdir 拒绝访问
【发布时间】:2024-04-14 02:10:01
【问题描述】:

Jenkins 正在生成在 Visual Studio 中制作的 C++ 项目的构建。

在此过程中,一些.bats 被调用,其中一个是这样的结构:

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%

我对批处理脚本不是很熟悉,但是当rmdirmkdir 都被调用时,Jenkins 会给我access denied

我查看了构建配置以搜索任何类型的读/写权限,但似乎没有。

我该如何解决这个问题?后来其他脚本尝试访问Temp,但它们失败了,它破坏了我的构建。

【问题讨论】:

  • Temp 是相对路径,那么它与什么有关?
  • 不太明白你的意思。 Temp 是变量TEMPDIR 引用的文件夹的真实名称。 Temp 用于存储 Visual Studio 在构建过程中生成的二进制文件。因为它给了我access denied,所以没有创建文件夹并且构建中断。
  • Temp 是分配给TEMPDIR 的文字,而不是%Temp% 中包含的值,因此它是来自%CWD% 的相对路径。 Jenkins 进程是否在其%CWD% 所在的任何地方都具有特权?
  • 您使用%VAR% 表单来读取存储在VAR 中的值。 %CWD% 是一个内置的 cmd.exe 伪环境变量。
  • @Compo,我认为你永远无法删除当前目录。

标签: batch-file jenkins mkdir access-denied rmdir


【解决方案1】:

rmdir 可能失败的一些原因:

  • 没有权限
  • 目录包含文件。
  • 这是一个或多个进程的当前工作目录。
  • 一个进程有一个锁。

mkdir 失败的一些原因:

  • 没有权限
  • 目录已存在。

OP 的脚本正在尝试在%CD% 中为运行该脚本的进程创建一个名为“Temp”的目录。如果还有其他进程也在运行该脚本,或者任何出于任何原因利用相同的 %CD%\Temp 路径的进程,那么创建或删除该路径都可能失败。


在构建系统中很常见,因为有多个并行进程和线程在各种工作目录中运行各种程序/脚本。从cmd 文件的任何实例的角度来看,任何%CD% 相对路径实际上都是随机的。所有下降 CI 构建系统都提供环境变量,这些程序/脚本可以使用这些环境变量来正确定位自己,相对于某种形式的已知构建根,通常称为 BuildRoot

但这里真正的问题是 OP 的脚本如何处理临时目录管理。它们根本不够健壮,无法共享一个公共临时目录。


我要补充一点,一个好的 CI 构建系统,提供某种形式的每进程/线程临时目录,程序/脚本可以使用该目录,而无需进行任何目录管理。

【讨论】:

  • 我认为那些.bats 是由visual studio自动生成的。
  • @Daniel,您可能有自定义构建步骤,或者您的某些构建过程是由您正在使用的包定义的。