我有一个bash文件,它有多个参数,确切的数量是在运行时确定的。这个文件是由Jenkins中的管道调用的。我在传递参数时遇到了麻烦,仍然可以在bash脚本中使用。这将在后面变得更清楚。
bash脚本看起来像这样:
#!/bin/bash
java myApp.$1.com $2
字符串
相应的(极度简化的)Jenkinsfile如下:
def subdom= 'example'
def opts= ''
opts += '-test '
opts += '-comment=\\"' + "test comment" + '\\"'
pipeline {
agent any
options {
disableConcurrentBuilds()
}
environment {
SUBDOM="${subdom}"
OPTS= "${opts}"
}
stages {
stage('Run') {
steps('Prepare') {
script {
sh "bash -x /usr/share/jenkins/ref/runApp.sh $SUBDOM \"$OPTS\""
}
}
}
}
}
型
注解中的空格导致错误。我必须找到一种方法通过Jenkins中的shell命令传递opts。
我试过将opts
放入一个数组中,看起来似乎可以工作,但在bash脚本中显示为example '[-test,' '-comment="test comment"]'
。一般来说,无论我尝试什么,我都会看到这些单引号在bash脚本中弹出,我不知道它们来自哪里,也不知道如何防止它们。查看日志,它们不存在于Jenkins调用中,但是在脚本中突然出现。或者它们在Jenkins调用中,但不在控制台输出中?我记得Jenkins有点奇怪。
尝试在Jenkins中将opts
转换为bash数组并没有取得成果,并导致了groovy中大量的语法错误,似乎没有多少转义可以解决。
有没有办法把opts
传递到bash脚本中?这真的让我头疼。
编辑:来自评论的建议
#!/bin/bash
subdom=$1
shift
java myApp.$subdom.com $@
型
又出现了引用。
#!/bin/bash
subdom=$1
shift
java myApp.$subdom.com << EOF
$@
EOF
型
没有导致任何参数传递到Java应用程序。
在groovy中用"""
封装shell调用对神秘的引号没有影响。
1条答案
按热度按时间mklgxw1f1#
摘要
问题不在于jenkins,而是bash如何解释jenkins的参数。
没有简单的方法,但步骤最少的方法可能是用base64编码参数
字符串
那么在你的剧本里
型
第二个参数是
x1c 0d1x的数据
我会告诉你其他的选择。从最简单的到高级的
参数的工作原理
如果你的剧本是
型
如果参数中有空格,则应该用双引号将其括起来
的
您还可以使用**$@**来访问所有参数
Base64
使用base64对变量进行编码
型
的
结果
的
这也可以帮助您处理复杂的参数,如文件或证书或带有特殊字符的字符串
环境变量
bash脚本不应该从参数中获取值,而应该使用环境变量
型
然后你的管道应该注入变量:
型