首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止在Jenkinsfile中计算${PIPELINESTATUS[0]}

防止在Jenkinsfile中计算${PIPELINESTATUS[0]}
EN

DevOps用户
提问于 2019-11-26 15:42:40
回答 1查看 1.1K关注 0票数 2

下面是我在部署一个码头容器时运行的一个脚本。当容器没有正确构建/测试时,docker ps -a | grep $APP_CONTAINER_NAME命令将返回非零值,因此产生了|| true

如何防止Jenkins将${PIPELINESTATUS}解释为脚本中的变量替换?

代码语言:javascript
复制
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命令。

代码语言:javascript
复制
        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
            '''

上述版本的产出:

代码语言:javascript
复制
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需要与脚本在同一行:“”,因为系统读取前几个字符来检查#!

代码语言:javascript
复制
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
            '''
EN

回答 1

DevOps用户

回答已采纳

发布于 2019-11-26 20:14:06

这里似乎存在一些语法问题,如果使用bash shell,我也建议使用sh

试试下面的代码,看看它是否正常工作。(编辑-把她放在第一行接受作为答案)

代码语言:javascript
复制
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

您可以进一步测试代码。

票数 3
EN
页面原文内容由DevOps提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://devops.stackexchange.com/questions/9942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档