问题描述
在Jenkinsfile的docker容器部署环节中遇到了问题。在以下脚本中,当容器未正确构建/测试时,docker ps -a | grep $APP_CONTAINER_NAME
命令返回非零值,因此添加了|| true
。
用户想知道如何防止Jenkins在脚本中解释${PIPELINESTATUS[0]}为变量替换。
sh label: 'Stop and Remove Old Docker Container', script: '''
docker ps -a
echo $APP_CONTAINER_NAME
docker ps -a | grep $APP_CONTAINER_NAME || true
DOCKERCODE="${PIPESTATUS[0]}"
GREPCODE="${PIPESTATUS[1]}"
echo "Docker Command Code: $DOCKERCODE"
echo "Grep Command Code: $GREPCODE"
if [ $DOCKERCODE -eq 0 ] then;
docker stop $APP_CONTAINER_NAME
docker rm $APP_CONTAINER_NAME
else
echo "WARNING: Docker command was empty or had an error"
fi
'''
解决方案
请注意以下操作可能涉及版本差异及风险,执行前务必做好备份。
解决方案1
在Jenkinsfile中,你可以采用如下方法防止Jenkins解释${PIPELINESTATUS[0]}为变量替换。
sh label: 'Stop and Remove Old Docker Container', script: '''#!/usr/bin/env bash
docker ps -a
echo $APP_CONTAINER_NAME
docker ps -a | grep $APP_CONTAINER_NAME || true
status=("${PIPESTATUS[@]}")
DOCKERCODE=${status[0]}
GREPCODE=${status[1]}
echo "Docker Command Code: $DOCKERCODE"
echo "Grep Command Code: $GREPCODE"
if [ $DOCKERCODE -eq 0 ]; then
docker stop $APP_CONTAINER_NAME
docker rm $APP_CONTAINER_NAME
else
echo "WARNING: Docker command was empty or had an error"
fi
'''
在上述代码中,我们做了以下更改:
- 我们在脚本的第一行加入了shebang(#!/usr/bin/env bash)以指定使用bash来解释脚本,从而避免脚本中的命令被Jenkins解释为变量替换。
- 使用status数组来保存PIPESTATUS数组的值,以便后续使用。
这样,脚本就能够正确地获取并使用${PIPESTATUS[0]}和${PIPESTATUS[1]}的值,而不会被解释为变量替换。
解决方案2
另一种方法是使用单引号将命令字符串包裹起来,这样命令中的变量不会被解释为替换。例如:
sh label: 'Stop and Remove Old Docker Container', script: '''
docker ps -a
echo $APP_CONTAINER_NAME
docker ps -a | grep $APP_CONTAINER_NAME || true
DOCKERCODE="${PIPESTATUS[0]}"
GREPCODE="${PIPESTATUS[1]}"
echo "Docker Command Code: $DOCKERCODE"
echo "Grep Command Code: $GREPCODE"
if [ $DOCKERCODE -eq 0 ]; then
docker stop $APP_CONTAINER_NAME
docker rm $APP_CONTAINER_NAME
else
echo "WARNING: Docker command was empty or had an error"
fi
'''
使用三个单引号 ”’ 将整个脚本包裹起来,这样脚本中的变量将会被当作字符串直接使用,不会被解释为变量替换。
注意事项
- 请确保脚本的语法正确,例如在if语句中要用分号 (;) 分隔条件和then关键字。
- 在脚本中使用PIPESTATUS数组时,要注意不同版本的bash可能会有一些差异,因此在测试时要仔细验证。
以上是在Jenkinsfile中防止${PIPELINESTATUS[0]}被解释为变量替换的解决方案。根据你的环境和需求,选择适合的方法来处理这个问题。
正文完