“for loop”bash命令不在Jenkins构建中执行

时间:2017-02-24 11:57:16

标签: jenkins build debian

我尝试通过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

由于

2 个答案:

答案 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正常工作。