如何将参数传递给 Jenkins DSL 内联 shell 脚本?
How do I pass arguments to a Jenkins DSL inline shell script?
我有一个 Jenkins 步骤需要 运行 内联 shell 脚本。该脚本需要几个参数,这些参数包含在配置中。这样做的正确方法是什么?
shell 脚本确实需要内联并且不能在单独的文件中。
我已经尝试过类似的方法,但它不起作用。
stage('Build Image') {
steps {
script {
docker.withRegistry('.......', 'Gitlab') {
CHECK_SHA_RESULT = sh '''
ARG1=
ARG2=
// Do other stuff and output a result
''' ${config.var1} ${config.var2}
}
}
}
}
传递值有两种选择:
- 字符串插值
- 展开环境变量
字符串插值
您可以通过在 Groovy 个字符串中扩展变量来传递值:
sh """\
ARG1=${config.var1}
ARG2=${config.var2}
echo $ARG1
echo $ARG2
"""
(使用双引号而不是单引号)
你一定要小心,因为值先展开,然后执行代码。这意味着您可以注入代码。示例:
- 配置文件:
var1=text; cat /etc/passwd
var2=hello
- 执行代码:
ARG1=text; cat /etc/passwd
ARG2=hello
echo $ARG1
echo $ARG2
环境变量
您可以使用环境变量注入值。它更安全,因为值由 shell 进程扩展(防止命令注入)。
withEnv([
"ARG1=${config.var1}",
"ARG2=${config.var2}"
]) {
sh '''\
echo $ARG1
echo $ARG2
'''
}
(sh
脚本使用单引号定义)
示例:
- 配置文件:
var1=text; cat /etc/passwd
var2=hello
- 可用的环境变量:
- ARG1 =
text; cat /etc/passwd
- ARG2 =
hello
- 执行代码:
echo $ARG1
echo $ARG2
我有一个 Jenkins 步骤需要 运行 内联 shell 脚本。该脚本需要几个参数,这些参数包含在配置中。这样做的正确方法是什么? shell 脚本确实需要内联并且不能在单独的文件中。 我已经尝试过类似的方法,但它不起作用。
stage('Build Image') {
steps {
script {
docker.withRegistry('.......', 'Gitlab') {
CHECK_SHA_RESULT = sh '''
ARG1=
ARG2=
// Do other stuff and output a result
''' ${config.var1} ${config.var2}
}
}
}
}
传递值有两种选择:
- 字符串插值
- 展开环境变量
字符串插值
您可以通过在 Groovy 个字符串中扩展变量来传递值:
sh """\
ARG1=${config.var1}
ARG2=${config.var2}
echo $ARG1
echo $ARG2
"""
(使用双引号而不是单引号)
你一定要小心,因为值先展开,然后执行代码。这意味着您可以注入代码。示例:
- 配置文件:
var1=text; cat /etc/passwd var2=hello
- 执行代码:
ARG1=text; cat /etc/passwd ARG2=hello echo $ARG1 echo $ARG2
环境变量
您可以使用环境变量注入值。它更安全,因为值由 shell 进程扩展(防止命令注入)。
withEnv([
"ARG1=${config.var1}",
"ARG2=${config.var2}"
]) {
sh '''\
echo $ARG1
echo $ARG2
'''
}
(sh
脚本使用单引号定义)
示例:
- 配置文件:
var1=text; cat /etc/passwd var2=hello
- 可用的环境变量:
- ARG1 =
text; cat /etc/passwd
- ARG2 =
hello
- ARG1 =
- 执行代码:
echo $ARG1 echo $ARG2