Jenkins管道中的bash脚本语法问题

pjngdqdw  于 8个月前  发布在  Jenkins
关注(0)|答案(2)|浏览(116)

我想执行以下脚本:

sh """#!/bin/bash -xe
source ${rcfile}
serverName=$(openstack server list --name openstack-cluster-smoketest-${env.BUILD_NUMBER}-${hostname})
count=0
limit=6
while [ ! -z $serverName || $count -gt $limit ]
do 
  openstack server delete openstack-cluster-smoketest-${env.BUILD_NUMBER}-${hostname}
  count=$((count + 1))
  sleep 10s
  serverName=$(openstack server list --name openstack-cluster-smoketest-${env.BUILD_NUMBER}-${hostname})
done
if [ $count -eq $limit ]; then
  exit 1
fi
"""

字符串
提前感谢!
我尝试使用单引号和双引号,我知道字符串插值需要双引号
我知道我的rcfile源工作得很好,因为我之前运行过这个,它在不同的shell块中工作得很好:

sh """#!/bin/bash -xe
source ${rcfile}
openstack server delete openstack-cluster-smoketest-${env.BUILD_NUMBER}-${hostname}
"""


同样,在运行并创建一个名为openstack-cluster-smoketest-${env.BUILD_NUMBER}-${hostname}的示例后,单独运行这一部分也可以在shell块中工作,该示例成功地获取了构建号和当前主机名(我正在从jenkins管道阶段获取build_number和hostname)

sh """#!/bin/bash -xe
source ${rcfile}
openstack server list --name openstack-cluster-smoketest-${env.BUILD_NUMBER}-${hostname}
"""

gdrx4gfi

gdrx4gfi1#

作为一种习惯,总是先将代码粘贴到ShellCheck.net中。这将保存您的时间和尴尬。
简单回答-使用[[而不是[

$: declare -i count=0 limit=3
$: while [[ -n "$serverName" ]] && (( count++ < limit )); do echo $count; done
1
2
3

字符串
或者也许

$: declare -i count=0 limit=3; while [[ -n "$serverName" && $count -lt $limit ]]; do echo $((++count)); done
1
2
3

xurqigkl

xurqigkl2#

我猜rcfile在你的Jenkinsfile中是一个Groovy变量,所以你使用双引号来进行字符串插值。如果是这种情况,你还需要注意你整个bash中以$开头的任何单词,比如$(openstack$serverName$limit,如果把它们放在双引号中,它们也会被插值。
如果你整个bash,只有rcfile是Groovy变量,我建议你修改如下:

# set rcfile to be environment
# all variables inside global env groovy object will be injected into bash context
# as bash environment, thus you can access rcfile as $rcfile or ${rcfile},
# also access BUILD_NUMBER via ${BUILD_NUMBER}, but env.BUILD_NUMBER

env.rcfile = xxxxx

# because BUILD_NUMBER and rcfile can access as bash environment variable,
# thus no need to use double quote, single quote is right option.

sh '''
#!/bin/bash -xe

source ${rcfile}
serverName=$(openstack server list --name openstack-cluster-smoketest-${BUILD_NUMBER}-${hostname})
count=0
limit=6
while [ ! -z $serverName || $count -gt $limit ]
do 
  openstack server delete openstack-cluster-smoketest-${BUILD_NUMBER}-${hostname}
  count=$((count + 1))
  sleep 10s
  serverName=$(openstack server list --name openstack-cluster-smoketest-${BUILD_NUMBER}-${hostname})
done
if [ $count -eq $limit ]; then
  exit 1
fi
'''

字符串

相关问题