我尝试通过Jenkins“执行shell”构建步骤执行这样的场景:
rm -r -f _dpatch;
mkdir _dpatch;
mkdir _dpatch/deploy;
from_revision='HEAD';
to_revision='2766920';
git diff --name-only $from_revision $to_revision > "_dpatch/deploy/files.txt";
for file in $(<"_dpatch/deploy/files.txt"); do cp --parents "$file" "_dpatch"; done;
whoami
使用控制台输出成功结束:
[Deploy to production] $ /bin/sh -xe /tmp/hudson8315034696077699718.sh
+ rm -r -f _dpatch
+ mkdir _dpatch
+ mkdir _dpatch/deploy
+ from_revision=HEAD
+ to_revision=2766920
+ git diff --name-only HEAD 2766920
+
+ whoami
jenkins
Finished: SUCCESS
问题是行“for file in”只是被忽略,我不明白为什么。
files.txt的内容不为空,如下所示:
addons/tiny_mce/plugins/image/plugin.min.org.js
addons/webrtc/adapter-latest.js
templates/standard/style/review.css
此外,当我通过ssh执行相同用户(jenkins)下相同jenkins工作区文件夹中的相同脚本时,“for file in”行正常执行并在“_dpatch”子文件夹中创建文件。
我的环境: Debian 8, 詹金斯2.45
由于
答案 0 :(得分:0)
尝试使用 循环替换 。并且还添加了一些日志记录
rm -r -f _dpatch;
mkdir _dpatch;
mkdir _dpatch/deploy;
from_revision='HEAD';
to_revision='2766920';
git diff --name-only $from_revision $to_revision > "_dpatch/deploy/files.txt" && echo "git diff finished"
while IFS= read -r line; do
echo $line
cp --parent $line $_dpatch
done < _dpatch/deploy/files.txt
whoami
答案 1 :(得分:0)
可能你的/bin/sh
是一个POSIX bourne shell。它认为$(<
构造是一种bash-ism,因此它不适用于/bin/sh
。
尝试替换
$(<"_dpatch/deploy/files.txt")
与
$(cat "_dpatch/deploy/files.txt")
或者,使用#!/bin/bash
。
如果你的登录shell是bash
,那么这也解释了为什么一切都通过ssh
正常工作。