在Jenkinsfile中使用sed替换pom版本

时间:2019-01-30 06:37:45

标签: linux unix jenkins sed

我有一个变量myStr,其中包含以下值:

    "app": {
    "services": {
      "app": [{
          "groupID": "com.mycompany",
          "artifactId": "myapp-versions",
          "version": "1.0.0"
        },
        {
          "groupID": "com.mycompany.xyz",
          "artifactId": "car-stats",
          "version": "1.0-master"
        },

        {
          "groupID": "com.mycompany.service",
          "artifactId": "my-differential-service",
          "version": "1.0.0-master"
        }

    ]
  }
}

现在我只想将my-differential-service artifactId的版本替换为NEW_VERSION

我尝试在myStr变量上使用sed命令,但由于我对该命令不太熟悉,因此无法成功。

有人可以指导我如何继续实现这一目标吗? 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

当您需要sed进行解析时,请在-z中寻求对选项sed的支持。此选项忽略\n的特殊含义。
如果您知道版本是artifactId之后的第一个字段,则可以尝试

new_version=1.0.1 # avoid uppercase variable names
echo "$myStr" | 
   sed -rz 's/("my-differential-service",[^:]*: ")[^"]*/\1'"${new_version}"'/'

当字段顺序可以更改时,您可能需要在Jenkins中询问jq或尝试使用awk
如果您想使用sed但没有-z选项,则可以先翻译:

echo "$myStr" | tr '\n' '\r' | sed -r 's/..../' | tr '\r' '\n'

答案 1 :(得分:0)

如果jq可用,那么恭喜!并请尝试以下操作:

echo "{ $myStr }" | jq '(.app.services.app[] | select(.artifactId == "my-differential-service") | .version) = "NEW_VERSION"'

产生:

{
  "app": {
    "services": {
      "app": [
        {
          "groupID": "com.mycompany",
          "artifactId": "myapp-versions",
          "version": "1.0.0"
        },
        {
          "groupID": "com.mycompany.xyz",
          "artifactId": "car-stats",
          "version": "1.0-master"
        },
        {
          "groupID": "com.mycompany.service",
          "artifactId": "my-differential-service",
          "version": "NEW_VERSION"
        }
      ]
    }
  }
}

如果不需要最外面的花括号,请通过bash的参数扩展或类似方法将其删除。

作为后备选项,您可以使用sed来表示:

echo "$myStr" | sed '
:l
N
$!b l
s/\("my-differential-service"[^"]*"version": *\)"[^"]*"/\1"NEW_VERSION"/g'

希望这会有所帮助。