【问题标题】:how to setup jenkins on win10 to use cygwin bash如何在win10上设置jenkins以使用cygwin bash
【发布时间】:2020-05-08 23:04:35
【问题描述】:

是否可以使用 Cygwin 在 jenkins 中运行 sh 步骤?我尝试过的方法不起作用。

为了让 sh 步骤与 cygwin 一起工作,我使用了配置屏幕 http://<jenkins>:8080/configure 并将 Shell Executable 设置为运行 C:\\cygwin64\\bin\\bash.exe 但是在运行测试管道时

node {
    stage('1'){
        bat "dir C:\\cygwin64\\bin\\bash.exe"
        sh 'ls ..'
    }
}

这就是结果。

Running on Jenkins in J:\workspace\try_shellx
[Pipeline] {
[Pipeline] stage
[Pipeline] { (1)
[Pipeline] bat

J:\workspace\try_shellx>dir C:\cygwin64\bin\bash.exe 
 Volume in drive C has no label.
 Volume Serial Number is 9CDC-D180

 Directory of C:\cygwin64\bin

01/27/2017  01:13 PM           739,859 bash.exe
               1 File(s)        739,859 bytes
               0 Dir(s)  294,634,586,112 bytes free
[Pipeline] sh
sh: C:\cygwin64\bin\bash.exe: command not found
[Pipeline] }
[Pipeline] // stage

因此,sh "ls .." 无法执行,因为找不到 bash,但通过 bat 步骤找到了 dir C:\\cygwin64\\bin\\bash.exe

任何帮助表示赞赏

【问题讨论】:

    标签: bash jenkins jenkins-pipeline cygwin windows-subsystem-for-linux


    【解决方案1】:

    终于想通了。由于正斜杠和反斜杠,它令人困惑,并且由于未知原因没有 bat 文件就无法工作。第一步是复制Cygwin.bat 通常在c:\cygwin64\ 目录中

    copy C:\cygwin64\Cygwin.bat C:\cygwin64\CygwinForJenkins.bat
    

    编辑C:\cygwin64\CygwinForJenkins.bat 使其看起来像这样。

    @echo off
    
    c:\cygwin64\bin\bash %*
    

    然后在“配置系统”管理屏幕中设置Shell executable 设置以指向新的 bat 文件并忽略所有可能向您显示的错误。 注意非 DOS 正斜杠。

    现在,当您执行sh "find ." 或其他 linux 命令时,jenkins 会将命令包装在临时脚本中,并以这种方式调用。

    C:/cygwin64/CygwinForJenkins.bat -xe J:/workspace/try_shellx@tmp/durable-aa951084/script.sh
    

    CygwinForJenkins.bat 然后使用 DOS arg glob %* 像这样将临时脚本传递给 cygwin bash.exe

    c:\cygwin64\bin\bash -xe J:/workspace/try_shellx@tmp/durable-aa951084/script.sh
    

    此外,您还需要在 Windows 系统路径中添加 C:\cygwin64\bin(在系统下的控制面板中找到或使用下面的搜索)。这是因为 Jenkins 还添加了仅在该路径中可用的 nohup 命令。

    如果您在使用此设置时遇到问题,可以使用set 在 bat 文件中显示您的 windows 环境。设置@echo on 将显示DOS 环境中的所有命令,这就是我找到解决方案的方式。

    我在J:\\workspace 下有我的詹金斯,我遵循this 解决方案来做到这一点

    Linux 的 Windows 子系统 (WSL) 无法使用此功能,因为它不理解 Jenkins 通过 cygwin bash 的路径中的正斜杠符号。持久任务插件执行此操作scriptPath.replace("\\", "/")seen about here in the source。因此,在将它传递给 WSL 之前,您必须在 bat 脚本中撤消此替换,并且看起来像这样。

    C:\Windows\System32\bash.exe -xe J:\\workspace\\try_shellx@tmp\\durable-aa951084\\script.sh
    

    您可能可以在 Windows 上使用类似 sed 的命令来做到这一点。我只是懒得走那么远。

    【讨论】:

    • 这听起来很糟糕。我给你的一个提示是永远不要在 Windows 上弄乱反斜杠路径,除非作为最后的手段。反斜杠搞砸了一切。但大多数人不知道的是 Windows 内核理解正斜杠。在 cmd.exe 中试试这个: dir "C:/Users" 有效吧?还有一个名为 cygpath 的 cygwin 命令可以转换路径格式……但由于我从不使用反斜杠,因此在 Windows 和 cygwin 使用的数十年中,我从来没有遇到过它。尝试将你的 shell 设置为 C:/cygwin64/bin/bash.exe
    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多