Jenkins正在生成Visual Studio中制作的C ++项目的构建。
在此过程中,调用了一些.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
,但它们失败了,这破坏了我的构建。
答案 0 :(得分:1)
rmdir
失败的某些原因:
mkdir
失败的某些原因:
OP的脚本正尝试在运行该脚本的进程的%CD%
中创建一个名为“ Temp”的目录。如果还有其他进程也在运行该脚本,或者由于某种原因而使用同一%CD%\Temp
路径的任何进程,则创建或删除该路径都可能会失败。
在构建系统中很常见,因为有多个并行进程和线程在各种工作目录中运行各种程序/脚本。从cmd
文件的任何实例的角度来看,%CD%
相对的任何路径实际上都是随机的。所有下降的CI构建系统都提供了环境变量,这些程序/脚本可使用这些环境变量来相对于某种形式的已知构建根(通常称为BuildRoot
之类)正确定向自身。
但是这里真正的问题是OP的脚本如何处理临时目录管理。它们根本不够强大,无法共享一个公共的临时目录。
我还要添加一个好的CI构建系统,它提供某种形式的每进程/线程临时目录,程序/脚本可以使用它们而无需进行任何目录管理。