下面是我在部署一个码头容器时运行的一个脚本。当容器没有正确构建/测试时,docker ps -a | grep $APP_CONTAINER_NAME命令将返回非零值,因此产生了|| true。
如何防止Jenkins将${PIPELINESTATUS}解释为脚本中的变量替换?
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
'''EDIT1:为了澄清-这个命令给出了错误/mnt/data/jenkins/workspace/Test@tmp/durable-4c7b4748/script.sh: 7: /mnt/data/jenkins/workspace/Test@tmp/durable-4c7b4748/script.sh: Bad substitution
我尝试过三重双引号,对shell脚本中的引号进行转义,单个引用PIPESTATUS命令会阻止执行。
更新:我试着逃避了很多事情。一个斜杠也会导致上述错误。双斜杠导致打印该行而不运行bash命令。
sh label: 'Stop and Remove Old Docker Container', script: '''
docker ps -a
echo $APP_CONTAINER_NAME
docker ps -a | grep $APP_CONTAINER_NAME || true
echo "HERE"
echo \\${PIPESTATUS[@]}
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
'''上述版本的产出:
TEST
+ docker ps -a
+ grep TEST
+ true
+ echo HERE
HERE
+ echo ${PIPESTATUS[@]}
${PIPESTATUS[@]}
+ DOCKERCODE=${PIPESTATUS[0]}
+ GREPCODE=${PIPESTATUS[1]}
+ echo Docker Command Code: ${PIPESTATUS[0]}
Docker Command Code: ${PIPESTATUS[0]}
+ echo Grep Command Code: ${PIPESTATUS[1]}
Grep Command Code: ${PIPESTATUS[1]}
/mnt/data/jenkins/workspace/Test@tmp/durable-4a5608fa/script.sh: 17: /mnt/data/jenkins/workspace/Test@tmp/durable-4a5608fa/script.sh: Syntax error: "else" unexpected (expecting "then")最后的答案: shebang需要与脚本在同一行:“”,因为系统读取前几个字符来检查#!
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
'''发布于 2019-11-26 20:14:06
这里似乎存在一些语法问题,如果使用bash shell,我也建议使用sh。
试试下面的代码,看看它是否正常工作。(编辑-把她放在第一行接受作为答案)
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
'''在上面的代码中,我改变了您试图使用docker ps -a | grep $APP_CONTAINER_NAME || true变量获取命令PIPESTATUS输出的方式。因为PIPESTATUS是一个特殊的变量,所以它的值在每个命令之后都会更新,所以您没有得到任何${PIPESTATUS[1]}值
我所做的另一个更改是将if [ $DOCKERCODE -eq 0 ] then;行中的语法问题修正为if [ $DOCKERCODE -eq 0 ]; then。
您可以进一步测试代码。
https://devops.stackexchange.com/questions/9942
复制相似问题