【发布时间】: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.com。final 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 gitRepo、def gitRepo、String gitRepo甚至final String gitRepo这样的变量,而不仅仅是gitRepo。如果您只使用gitRepo,这将使其成为整个脚本的全局范围变量,有时可能难以调试。如果您想朝那个方向发展,还有一些库/工具可以测试您的Jenkinsfile。在 Jenkins 流水线的大多数情况下,这只是一种“尝试直到成功”的策略。
标签: shell jenkins substring jenkins-pipeline