【问题标题】:Extracting part of a string on jenkins pipeline在詹金斯管道上提取部分字符串
【发布时间】:2018-04-25 18:42:58
【问题描述】:

我的管道脚本中的语法有些问题。

我正在尝试捕获最后一个正斜杠“/”之后和最后一个句点“。”之前的所有内容。在这个字符串中 git@github.com:project/access-server-pd.git (access-server-pd)

Here(下)是我想要的设置方式

MYVAR="git@github.com:project/access-server-pd.git" 

NAME=${MYVAR%.*}  # retain the part before the colon
NAME=${NAME##*/}  # retain the part after the last slash
echo $NAME

我在管道脚本上设置了三引号:

  stage('Git Clone') {
  MYVAR="$GIT_REPO"
  echo "$MYVAR"
  NAME="""${MYVAR%.*}"""
  echo "$NAME"

但是我在“.”上收到了一个意外的标记。错误。我该如何写这个才能让它工作?

更新:这个命令可以解决问题:

echo "git@github.com:project/access-server-pd.git" | sed 's#.*/\([^.]*\).*#\1#'

现在我只需要找到正确的语法来创建一个变量来存储该值。

【问题讨论】:

  • 看起来您正在将 shell 代码与 Groovy 代码混合使用。
  • @mkobit 也许,根据您的经验,您将如何从 Jenkins 管道中的 url 中提取测试?
  • 对我来说,我通常会尝试在Jenkinsfile 中做这部分工作(这意味着使用受支持的 Groovy 功能​​的 Jenkins 子集)。所以在这个例子中,final beforeColon = url.substring(0, url.indexOf(':')) 将结果存储到final 变量beforeColon 中。 Groovy 不需要声明类型,但结果是String,其值为git@github.comfinal afterLastSlash = url.substring(url.lastIndexOf('/') + 1, url.length()) 将得到最后一个 / 之后的所有内容。
  • 这太棒了,您能否确认在我的情况下使用变量 gitRepo 这是正确的方法? url="$GIT_REPO" final beforeColon = url.substring(0, url.indexOf('.git')) url="$beforeColon" final gitRepo = url.substring(url.lastIndexOf('/') + 1, url .length())
  • 这对我来说看起来不错,但你绝对应该测试它。我的一个偏好是(通常)总是使用像final gitRepodef gitRepoString gitRepo 甚至final String gitRepo 这样的变量,而不仅仅是gitRepo。如果您只使用gitRepo,这将使其成为整个脚本的全局范围变量,有时可能难以调试。如果您想朝那个方向发展,还有一些库/工具可以测试您的Jenkinsfile。在 Jenkins 流水线的大多数情况下,这只是一种“尝试直到成功”的策略。

标签: shell jenkins substring jenkins-pipeline


【解决方案1】:

在这种情况下,看起来在String 上使用一些 Groovy/Java 方法可以提取这些部分。

final beforeColon = url.substring(0, url.indexOf(':'))  // git@github.com
final afterLastSlash = url.substring(url.lastIndexOf('/') + 1, url.length()) // project/access-server-pd.git

这使用了几种不同的方法:

您确实需要小心您在管道中使用的代码。如果它是沙盒的,它将在一个受保护的域中运行,每个调用都经过安全检查。例如,Script Security Plugin 中的 whitelist 将上面使用的所有调用列入白名单(例如,method java.lang.String lastIndexOf java.lang.String)。

在您的管道代码中执行String 操作是完全合理的,因为您可能会根据它做出决策并更改您的编排。

【讨论】:

    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 2019-01-09
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多