2017-02-24 48 views
1

我試着通過詹金斯執行這樣的風景「執行shell」蓋步:「For循環」 bash命令不詹金斯執行建設

[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 

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 

建立與控制檯輸出成功結束

問題是行「對於文件」被忽略,我不明白爲什麼。 files.txt的

內容不是空的,看起來像這樣:

addons/tiny_mce/plugins/image/plugin.min.org.js 
addons/webrtc/adapter-latest.js 
templates/standard/style/review.css 

更多了,當我通過ssh在同一詹金斯工作區文件夾中的同一個用戶下執行相同的腳本(詹金斯) - 「爲文件「行正常執行,並創建文件在」_dpatch「子文件夾中,因爲它應該。

我的環境: Debian的8, 詹金斯2.45

感謝

回答

0

可能您的/bin/sh是POSIX bourne shell。它認爲$(<構造是一個bash-ism,所以它不會與/bin/sh一起使用。

嘗試與

$(cat "_dpatch/deploy/files.txt") 

另外,在前面加上#!/bin/bash您構建步驟更換

$(<"_dpatch/deploy/files.txt") 

如果您的登錄shell是bash,那麼這也解釋了爲什麼一切正常工作通過ssh

+0

用」貓「替換」<「修復了我的問題。謝謝你的修正和很好的解釋,Alex。 – Vito

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 
+0

意外標記附近的語法錯誤執行'IFS = read -r line;更新後執行' – Vito

+0

,並在「_dpatch」之前的「」「上修復」$「,從files.txt的每行都有這樣的錯誤:」cp:target'\ r'不是目錄 '\ r':command找不到「 – Vito