当来自 Jenkins 的 运行 mkdir 命令时访问被拒绝

Access is denied when running mkdir command from Jenkins

我正在尝试创建一个新目录并将文件复制到其中。所以我正在使用 "Execute batch command".

的工作

首先我尝试 运行: robocopy source destination /e.
然后我试了:mkdir destination。在这两种情况下,我都收到了 "Access is denied" 消息。

如果我自己手动尝试,我可以创建一个目录并将文件复制到其中。
目标是远程计算机的共享文件夹:\computerName\sharedFolder\

有人知道如何使用 Jenkins 获得访问权限吗?

在我的设置中,Jenkins 从属服务在特定用户(名为 jenkins)下运行。
它使验证特定用户的访问权限变得容易。
当然 jenkins 需要对远程文件夹具有写入权限,包括物理磁盘和共享。

要找出您的作业 运行 所属的用户,请在 Jenkins 中创建一个 "scratch" 作业。给它一个 "Execute Windows Batch command" 构建步骤并输入 "set" 作为批处理命令的文本。如果您受影响的工作 运行ning 在 Windows 从站上,请确保此工作 运行s 在同一个从站上。 运行 这份工作。您的控制台将显示该作业已知的环境变量列表,就像您在桌面上的命令提示符 window 中键入 "set" 一样。不同之处在于,在底部附近,您的命令 window 中 "USERDOMAIN" 和 "USERNAME" 显示的用户名将是您(您登录的用户);在控制台输出中,它将是您的 Jenkins 作业 运行 所在的用户帐户。

该用户实际上可能没有登录权限。而且,如果 Jenkins 运行 宁作为一项服务,你不能只在你的命令中设置一个共享 window: Jenkins jobs 运行 under a different Windows "session" 并且该会话将看不到您在登录会话中创建的共享。

让您渡过难关的一种不太安全的方法是为您的作业添加用户名(字符串参数)和密码(密码参数)的参数。在您需要访问驱动器之前,无论是在同一构建步骤中还是在该构建步骤之前 运行 的 'Execute Windows Batch Command' 步骤中,运行 "@net use : \computername\sharename %% /USER:%% /persistent:no"。 (例如:“@net 使用 p: \COMPUTER\SHARE %PASSWORD% %USER% /persistent:no”)。 “@”将使密码不显示在日志中。 (但是,如果启用了 "Allow rebuild",密码将与作业相关联并将在 Jenkins 中编码。)确保完成后清理("net use /delete"),您可能需要测试和在尝试连接之前清理驱动器号,以防之前的作业在未释放驱动器号的情况下失败。

在这种情况下,当您 运行 工作时,您必须为可以访问共享的人输入用户名和密码。您可以使用预先填写的这些值对隐藏参数进行编码,但这意味着用户的用户名和密码被编码到作业定义中,并且隐藏密码参数的默认值不会在 Jenkins 配置文件中加密。

肯定有更安全的方法可以在 Jenkins 服务会话中启用驱动器共享,但根据您的环境,这可能 'good enough' 让您克服目前面临的障碍。我在我不是 Jenkins 管理员的环境中使用过这样的技巧,并且我对 Jenkins slaves 的访问权限非常有限(并且没有管理员权限)。

我知道这个 post 有点旧,但我发现了两个非常有效的解决方案,所以我 post 准备它以备不时之需。

首先:允许当前运行的磁盘使用 在您的 "Execute batch command" 上,您可以添加一行:

net use \server\folder /USER:domain\user password

然后您可以在您的命令中使用 \server\folder,它将起作用。 Jenkins 甚至可以处理凭据,因此不会出现纯文本形式。

第二个解决方案是将 Jenkins 作为特定用户启动,这样所有命令都将作为该用户 运行。 为此:

  1. 在 windows
  2. 中打开服务应用程序
  3. 搜索詹金斯
  4. 右击,属性
  5. 在“登录”选项卡上配置您要使用的凭据
  6. 重启 Jenkins

我希望这对某人有所帮助