Jenkins中系统无法找到指定的驱动器

11
我想从网络共享驱动器(在我的本地机器上作为Z驱动器挂载)复制一些文件。我编写了一个批处理文件,将Z驱动器的内容复制到本地驱动器。这个批处理文件在命令提示符下成功运行,但是我通过Jenkins触发它时出现问题。Jenkins显示以下错误: "系统找不到指定的驱动器"。如有帮助,将不胜感激。谢谢,Nouman.
9个回答

10

如果您不想在 Jenkins 插件或定时任务中使用,这里介绍一种“groovy”的方法:

手动方式:

您可以使用 Jenkins 提供的 Groovy 脚本控制台,在 Jenkins > 管理 Jenkins > 脚本控制台中执行命令来为 Jenkins 服务映射网络驱动器。(必须在停止 Jenkins 服务后再次执行)

自动化方式:

将您的 Groovy 命令编写到名为“init.groovy”的文件中,并将其放置在 JENKINS_HOME 目录中。这样,在 Jenkins 启动时就会映射网络驱动器。

Groovy 命令 - Windows:

使用脚本控制台检查可用的网络驱动器:

println "net use".execute().getText()

你的 init.groovy 文件应该是这样的:

def mapdrive = "net use z: \\\\YOUR_REMOTE_MACHINE\\SHARED_FOLDERNAME"
mapdrive.execute()

很好,我之前不知道这些。但可惜的是,我需要动态获取一个空闲的驱动器号码,然后将其分配给在运行时创建的新的UNC路径(ClearCase视图)。问题是,任何需要使用这个映射的构建步骤都必须在每个“执行Windows批处理命令”的构建步骤中手动重新映射驱动器。 - Garen
你要如何映射两个不同的驱动器? - Brian

2

是的,Jenkins使用不同的登录凭据。要通过Jenkins映射驱动器,请在Jenkins命令提示符中使用以下命令:

Subst U: \ drive \ folder

然后,执行您的查询。


我想补充一点,您需要确保将C:\Windows\System32添加到PATH环境变量中,这需要您添加到:Jenkins > 管理Jenkins > 配置系统。 - Cthutu

1

您可能会遇到权限问题。Jenkins 可能会使用不同的用户凭据执行,因此它不知道配置的 Windows 共享驱动器。我建议使用插件而不是使用 shell 脚本。有一组发布-超过插件,可以通过几个协议(ssh、cfis 等)将部署发送到远程系统。请查看CFIS 插件,该插件允许将工件发送到 Windows 共享。一旦配置了插件(即在管理 Jenkins部分中指定了主机),您就可以将发送文件到 Windows 共享添加到构建后步骤中,在其中指定要发送到哪个位置的哪些文件。


1
如果您正在将Jenkins作为Windows服务运行,则它将以用户“NT AUTHORITY\SYSTEM”运行,其设置、权限等可能与您或常规用户不同。要查看批处理文件如何从自己的cmd shell中执行,请参考serverfault上的问题如何在Windows Server 2008下以NT AUTHORITY SYSTEM身份运行命令 - jwernerny
Jenkins允许在节点配置中使用指定的用户/密码运行服务。 - Garen

1
我曾遇到一个问题,我的Jenkins作业无法读取网络驱动器上的文件。我通过在预构建步骤中添加"net use"命令来解决它,即:

打开您的作业。 进入“预步骤” 从下拉菜单中选择“执行Windows批处理命令” 输入以下命令: net use E:\[服务器名称][文件夹名称]“[密码]”/user:“[用户ID]” 点击保存 执行该作业

按照上述步骤,我能够从我的网络驱动器中读取文件。

这似乎是一次性的活动,因为在最初运行之后,我已经从我的作业中删除了批处理命令,并且它似乎记住了映射驱动器命令。


0

访问远程驱动器的方法

只需在命令提示符中使用该命令即可。


  • pushd "\sharedDrive\Folder1\DestinationFolder"

  • mkdir 文件夹名称

  • popd


pushd >> 它通过创建虚拟驱动器导航到共享驱动器。 popd >> 将您带回本地目录。


0

尝试将调试命令添加到批处理文件中,或作为单独的构建步骤,例如net useset(注意像HOMEPATHUSERNAME这样的变量)和纯粹的dir Z:\

如另一个答案所述,最可能的原因是Jenkins以SYSTEM用户身份运行,该用户具有不同的权限。解决方法之一是进入服务(例如打开任务管理器,转到其中的服务选项卡,在该选项卡的右下角单击“服务”按钮),找到Jenkins服务,打开其属性,转到“登录”选项卡,并将您的普通用户帐户设置为运行Jenkins的帐户。


0

基本上你可以通过jenkins命令使用服务器名称或IP访问网络共享驱动器(Z)。 使用 \\192.168.x.xxx\Your_Folder 代替 z:\Your_Folder

例如:

mkdir \\192.168.x.xxx\Your_Folder

0

我们在安装在Windows Server 2008上的Jenkins从机上遇到了类似的问题,参考了这个文档。即使配置了正确的用户凭据,Jenkins代理仍无法访问已挂载的网络驱动器。

故障排除:

  1. 当通过JNLP代理连接时(通过Java Web Start启动代理),Jenkins可以通过驱动器字母访问已挂载的网络驱动器。
  2. 但是,在我们将代理安装为Windows服务后不久,它就停止识别驱动器字母。即使配置了正确的用户凭据并重新启动代理,也无济于事。
  3. 我们仍然可以在使用上述用户登录到计算机时通过命令行访问驱动器。
  4. services.msc停止代理服务,然后通过运行命令jenkins-slave.exe uninstall卸载代理。此时从机已断开连接。
  5. 通过Java Web Start启动JNLP代理重新连接从机。现在代理可以再次访问网络驱动器。

简介:

不要将从属代理作为 Windows 服务安装,以便使用驱动器字母访问已挂载的网络驱动器。但这是非常不可靠的,因为代理可能在机器重新启动后无法重新启动。或者,尝试通过\\<ip_address\of\network\drive>让 Jenkins 访问它们。

0

我试图从一个远程计算机复制文件到另一个,对我有效的简单解决方案是COPY iphone.exe \192.xx.xx.xx\dev(dev是该IP地址上C驱动器中的文件夹名称)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接