2013-07-24 168 views
1

我想遠程更改一個Jenkins構建描述。除了一個小問題外,我已經準備好了我的腳本:多行描述。修改Jenkins描述構建

我使用詹金斯的REST API和JSON下載舊描述:

old_description=$(curl -s --user "$USER:$PASSWORD" --data-urlencode "tree=description" \ 
    "$jenkins_url/job/$job_name/$build_number/api/json") 

old_description=${old_description#*:\"} #Remove JSON garbage 
old_description=${old_description%\"\}} #Remove JSON garbage 

的`curl命令翻出:

<font color=blue><b>At first you don't succeed. Try again</b></font><br/> 
\r\n<font color=gold><b>At first you don't succeed. Try again</b></font><br/> 
\r\n<font color=green><b>At first you don't succeed. Try again</b></font> 

:我添加換行符使上面更容易閱讀,這是作爲一條線拉出來的)。

\r\n是分開的線,所以我這樣做:

old_description=$(sed 's/\\r\\n/\ 
/g' <<<$old_description) 

,以及改變$old_description到:

font color=blue><b>At first you don't succeed. Try again</b></font><br/> 
<font color=gold><b>At first you don't succeed. Try again</b></font><br/> 
<font color=green><b>At first you don't succeed. Try again</b></font> 

:新行是值的一部分這種情況。是一個三行描述。)

我的程序(取決於命令行參數)可以替換,應用程序最終,或者附加新的描述來構建:

if [ "$prepend_flag" -a -n "$old_description" ] #Prepend new description to old description 
then 
    new_description="$new_description<br/> 
$old_description" 
elif [ "$append_flag" -a -n "$old_description" ] #Append new description to old description 
then 
    new_description="$old_description<br/> 
$new_description" 
fi 

現在,我要重做的描述:如果我前面加上或追加新的描述首次

if curl -u $USER:$PASSWORD --data-urlencode "description=$new_description" \ 
    --data-urlencode "Submit=Submit" \ 
    "$jenkins_url/job/$job_name/$build_number/submitDescription" 
then 
    echo "Description successfully changed on Build #$build_number in Jenkins job $job_name" 
else 
    echo "WARNING: Description was not set. Manually change the descripiton of the build" 
    echo "   for Build #$build_number in Jenkins job $job_name" 
fi 

,我得到這個在詹金斯:

<font color=blue><b>At first you don't succeed. Try again</b></font><br/> 
<font color=gold><b>At first you don't succeed. Try again</b></font><br/> 
<font color=green><b>At first you don't succeed. Try again</b></font><br/> 
<font color=red><b>My new description</b></font><br/> 

看起來不錯。下一次,它不起作用。我得到這個:

<font color=blue><b>At first you don't succeed. Try again</b></font><br/>\n<font color=gold><b>At first you don't succeed. Try again</b></font><br/>\n<font color=green><b>At first you don't succeed. Try again</b></font><br/>\n<font color=red><b>My new description</b></font><br/> 
<font color=blue><b>My new new description</b></font> 

注意\n顯示出來。

我該如何解決這個問題?

我把整個程序放在pastebin

回答

2

我這個玩了很長一段時間...

第一,而不是做這樣的:

new_description="$new_description<br/> 
$old_description" 

追加或前面加上行,我用printf

new_description="$(printf "$new_description\r\n$old_description")" 

通過使用printf,我在我的描述行分隔符中放置了一個<CR><LF>而不僅僅是<LF>。這樣,我就沒有混雜的<NL><CR><NL>,我不再依賴於操作系統對換行符的定義。

sed命令花了我很長很長時間才弄清楚。我試過各種東西:

old_description=$(sed 's/\\r\\n/\r\n/g' <<<$old_description) 

但是,似乎沒有任何工作...我試過-E標誌,讓我用擴展正則表達式,但它一直解釋\r\nliteral 'rn更換\\r\\n

幾個小時之後,我終於嘗試雙引號代替單引號:

old_description=$(sed "s/\\r\\n/\r\n/g" <<<$old_description) 

這工作!您通常使用帶sed的單引號來保護正則表達式不受插值的影響。但是,單引號也會將\r\n的插值處理爲<CR><LF>。用雙引號改變它們解決了這個問題。