2013-07-24 120 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>。用双引号改变它们解决了这个问题。