2013-07-24 5 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 

Параметр `локон команда вытаскивает:

<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\n как замена \\r\\n с literal 'rn ,

Через несколько часов это, я, наконец, попытался двойные кавычки вместо одинарные кавычки:

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

Это сработало! Обычно вы используете одиночные кавычки с sed для защиты регулярного выражения от интерполяции. Однако одиночные кавычки также убивали интерполяцию \r\n как <CR><LF>. Изменение их с помощью двойных кавычек решило проблему.

Смежные вопросы