【问题标题】:The system cannot find the specified drive in Jenkins系统在 Jenkins 中找不到指定的驱动器
【发布时间】:2012-11-29 07:02:16
【问题描述】:

我想从网络共享驱动器(安装在我的本地计算机上作为驱动器 Z)复制一些文件。我已经编写了一个批处理文件来将 Z 驱动器的内容复制到我的本地驱动器中。该批处理文件在 cmd 上成功运行,但是当我通过 Jenkins 触发它时遇到问题。詹金斯给出以下错误:

“系统找不到指定的驱动器”

对此的任何帮助,将不胜感激。

谢谢, 努曼。

【问题讨论】:

    标签: batch-file jenkins cmd hudson jenkins-plugins


    【解决方案1】:

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

    Subst U:\驱动器\文件夹

    然后你的查询。

    【讨论】:

    • 我要补充一点,您需要确保已将 C:\Windows\System32 添加到 PATH 环境变量中,您需要将其添加到:Jenkins > Manage Jenkins > Configure System。跨度>
    【解决方案2】:

    如果您不想使用 Jenkins-plugins 或 schedule-Tasks,这里是一种“groovy”方式:

    手工:

    您可以使用 Jenkins 提供的 Groovy Script-Console>Manage Jenkins>Script Console 并执行命令在 Jenkins-service 中映射网络驱动器。 (必须重复,一旦 Jenkins 服务停止)

    自动化:

    将您的 Groovy 命令写入名为“init.groovy”的文件中,并将其放在您的 JENKINS_HOME 目录中。所以网络驱动器被映射到 Jenkins-startup 上。

    Groovy 命令 - Windows:

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

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

    您的 init.groovy 将如下所示:

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

    【讨论】:

    • 很好,我不知道这些。可悲的是,在我的情况下,我需要动态获取一个空闲驱动器号,然后将其分配给在运行时创建的新创建的 UNC 路径(ClearCase 视图)。问题是,任何需要映射的构建步骤都必须在每个“执行 Windows 批处理命令”构建步骤中手动重复重新映射驱动器。
    • 如何映射两个不同的驱动器?
    【解决方案3】:

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

    【讨论】:

    • 如果您将 Jenkins 作为 Windows 服务运行,那么它将以用户“NT AUTHORITY\SYSTEM”的身份运行,这很可能与您或普通用户具有不同的设置、权限等。要查看您的批处理文件将如何从您自己的 cmd shell 执行,请参阅关于 serverfault 的问题How to run commands as NT AUTHORITY...
    • Jenkins 允许服务在节点配置中使用指定的用户/密码运行。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      基本上,您可以使用 jenkins 命令中的服务器名或 IP 访问您的网络共享驱动器 (Z)。写\\192.168.x.xxx\Your_Folder 而不是z:\Your_Folder

      例如:

      mkdir \\192.168.x.xxx\Your_Folder
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          documentation 之后,在 Windows Server 2008 上设置的 Jenkins slave 上出现了类似的问题。即使在使用正确的用户凭据配置代理服务后,Jenkins 代理也无法访问挂载的网络驱动器。

          疑难解答:

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

          简介:

          不要将 slave 代理安装为 Windows 服务,以继续使用驱动器号访问已安装的网络驱动器。但这是非常不可靠,因为代理可能无法在机器重新启动后重新启动。或者,看看 Jenkins 是否可以通过\\<ip_address\of\network\drive> 访问它们。

          【讨论】:

            【解决方案8】:

            为了访问您的远程驱动器

            只需在 cmd 提示符下使用命令


            • 推送“\sharedDrive\Folder1\DestinationFolder”

            • mkdir 文件夹名称

            • 弹出


            pushd >> 它通过创建虚拟驱动器导航到共享驱动器.. popd >> 让你回到本地目录

            【讨论】:

              【解决方案9】:

              在我的 jenkins 作业无法读取网络驱动器上存在的文件时遇到了这个问题。 我通过在预构建步骤中添加“net use”命令解决了这个问题。即

              打开你的工作。 转到前置步骤 从下拉列表中选择执行 Windows 批处理命令 输入以下命令: net use E:\[服务器名称][文件夹名称] "[密码]" /user:"[用户ID]" 点击保存 执行作业

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-11-19
                • 1970-01-01
                • 1970-01-01
                • 2018-07-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多