【问题标题】:Modifying Jenkins Description for a build修改构建的 Jenkins 描述
【发布时间】:2013-07-24 16:03:41
【问题描述】:

我想远程更改 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

如果我是第一次添加或添加新描述,我会在 Jenkins 中得到:

<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.

【问题讨论】:

    标签: bash curl jenkins jenkins-api


    【解决方案1】:

    我玩了很久...

    首先,不要这样做:

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

    要附加或前置该行,我使用了printf

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

    通过使用printf,我在描述行分隔符中添加了&lt;CR&gt;&lt;LF&gt; 而不仅仅是&lt;LF&gt;。这样一来,我就没有&lt;NL&gt;&lt;CR&gt;&lt;NL&gt; 的混乱,并且我不再依赖于操作系统对换行符的定义。

    sed 命令花了我很长时间才弄清楚。我尝试了各种方法:

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

    但是,似乎没有任何效果...我尝试了 -E 标志,它允许我使用 extended 正则表达式,但它一直将 \r\n 解释为用 @ 替换 \\r\\n 987654334@.

    经过几个小时,我终于尝试了双引号而不是单引号:

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

    成功了!您通常在 sed 中使用单引号来保护正则表达式不被插值。但是,单引号也将\r\n 的插值杀死为&lt;CR&gt;&lt;LF&gt;。用双引号改变它们解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多