0

我正在使用安装了Cygpath 插件的Jenkins

我有一些在 Cygwin bash 中运行的脚本没有问题

#!/bin/bash

pwd

SCRIPTFILENAME=$(readlink -f $0)
SCRIPTPATH=`dirname $SCRIPTFILENAME`
cd $SCRIPTPATH
(python check_for_clip_duplicates.py) || exit $?

但是当我尝试使用 Jenkins 构建它时,我遇到了错误:

$ D:\cygwin\bin\cygpath -w d:\cygwin\bin\bash.exe
[default] $ D:\cygwin\bin\bash.exe -xe C:\Windows\TEMP\hudson2178008588278192726.sh
cygwin warning:
MS-DOS style path detected: C:\Windows\TEMP\hudson2178008588278192726.sh
  Preferred POSIX equivalent is: /cygdrive/c/Windows/TEMP/hudson2178008588278192726.sh
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
+ sh tools/generate_all.sh pc compress reset --use-texture-packer
tools/generate_all.sh: line 2: $'\r': command not found
tools/generate_all.sh: line 3: $'pwd\r': command not found
tools/generate_all.sh: line 4: $'\r': command not found
tools/generate_all.sh: line 7: cd: /cygdrive/d/Jenkins/workspace/default/tools

: No such file or directory
C:\Python27\python.exe: can't open file 'check_for_clip_duplicates.py': [Errno 2] No such     file or directory
tools/generate_all.sh: line 8: exit: 2
: numeric argument required
Build step 'Execute shell' marked build as failure
Finished: FAILURE

在 Shell 可执行文件的 Jenkins 配置中,我有:d:\cygwin\bin\bash.exe。

主要问题是 cygdrive 路径不起作用:

tools/generate_all.sh: line 7: cd: /cygdrive/d/Jenkins/workspace/default/tools

: No such file or directory

有任何想法吗?

4

2 回答 2

0

该脚本很可能失败,因为您cd $SCRIPTPATH失败了(由于尾随\r字符),然后它尝试check_for_clip_duplicates.py在脚本的当前目录(而不是tools目录)中查找,但该目录不存在。

为什么所有先前的命令都失败并且只有最后一个执行?因为最后一个实际上没有换行符,因此没有\r

下载Notepad++,它是必不可少的工具,并且对文件 EOL 转换有很好的支持(您的问题\r

  • 打开记事本++
  • 单击文件->新建
  • 注意在状态栏右下角,它会显示Dos\Windows(默认 EOL)
  • 单击编辑-> EOL 转换-> UNIX 格式
  • 注意在状态栏的右下角,它现在将显示UNIX
  • 请输入(不要复制粘贴)generate_all.sh脚本的内容
  • 将此文件保存到您的tools/generate_all.sh位置。可能不会注意到差异,但在正常视图中行尾是不可见的。
  • 重要提示:如果您使用 SVN 或其他 SCM 签出到 Jenkins 的工作区,您需要将更改保存回 SVN/SCM!

最后,为避免再次发生这种情况,您可以将dos2unix命令放入用于触发的Execute Shellgenerate_all.sh构建步骤中:

dos2unix toos/generate_all.sh
tools/generate_all.sh pc compress reset --use-texture-packer

专业提示:
要实际查看行尾,在 Notepad++ 中,单击查看 -> 显示符号 -> 显示所有字符

编辑:
您从脚本中调用 python ,而脚本又调用 Windows 可执行文件C:\Python27\python.exe。作为一个外部可执行文件,它不知道任何 Jenkins 插件(cygpath)甚至 Jenkins 本身,就此而言。

进一步分析您的问题,首先几乎不需要 Cygwin,您可以使用常规的Execute Windows Batch 命令构建步骤来完成所有这些操作

cdWindows 相当于pwd.
$WORKSPACE是一个环境变量,指向您的工作工作区的路径,并且您知道脚本在tools文件夹中。可以替换为,但如果这是构建步骤中的最后一行(实际上是脚本),则它是完全多余的
。Jenkins 将使用构建步骤最后一条语句的退出代码作为整个构建步骤的退出代码|| exit $?|| exit %ERRORLEVEL%

因此,将整个 cygwin 构建步骤更改为常规的Execute Window Batch构建步骤,如下所示:

cd
cd $WORKSPACE/tools
C:\Python27\python.exe check_for_clip_duplicates.py 

如果您的 python 目录已经在%PATH%变量中,您可以简单地使用python而不是完整路径。

于 2014-03-18T15:31:11.837 回答
0

看起来您的文件中有一些 Windows 行结尾 - 尝试dos2unix在其上运行:

$ dos2unix /cygdrive/c/Windows/TEMP/hudson2178008588278192726.sh

然后尝试再次运行该脚本。

于 2014-03-18T09:22:33.503 回答