我创建了一个Jenkins管道共享库来检索连接到kubernetes集群的pod IP,该集群失败并在下面引发错误。任何修复这一问题的指针都将是伟大的:
JSL:
docker.withRegistry('https://' + dockerRegistry, dockerCredentialsId) {
docker.image(kubectlImage).inside("""--entrypoint=''"""){
sh """
#!/bin/sh
set +x
kubectl get pods -n ${namespace} -o json > $WORKSPACE/pods.json
podIP=$(jq -r '.items[] | select(.metadata.generateName | test("${appName}")).status.podIP' $WORKSPACE/pods.json}
echo "Pod IP:$podIP"
"""
}
}
管道执行期间出错-
70: illegal string body character after dollar sign;
16:18:23 solution: either escape a literal dollar sign "$5" or bracket the value expression "${5}" @ line 70, column 14.
16:18:23 podIP=$(jq -r '.items[] | select(.metadata.generateName | test("${appName}")).status.podIP' $WORKSPACE/pods.json)
16:18:23 ^
16:18:23
16:18:23 1 error
16:18:23
16:18:23 at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
16:18:23 at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:150)
16:18:23 at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:120)
16:18:23 at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:132)
"""
语法用于多行插值Groovy字符串。这不是您在上述任何一种用法中想要的。我们可以使用单行文字字符串'
和多行文字字符串:
docker.withRegistry('https://' + dockerRegistry, dockerCredentialsId) {
docker.image(kubectlImage).inside('--entrypoint=""'){
sh '''
#!/bin/sh
set +x
kubectl get pods -n ${namespace} -o json > $WORKSPACE/pods.json
podIP=$(jq -r ".items[] | select(.metadata.generateName | test($appName)).status.podIP" $WORKSPACE/pods.json}
echo "Pod IP:$podIP"
'''
}
}
由于WORKSPACE
是一个导出到shell解释器的管道环境变量,因此它可以按原样使用。如果您使用了插值语法,则需要在env
对象(即env.WORKSPACE
(中访问它。
问题中没有显示appName
的定义,因此,如果问题没有按预期解决,则需要相应地更新问题。