在Jenkinsfile中防止${PIPELINESTATUS[0]}被解释为变量替换

57次阅读
没有评论

问题描述

在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
'''

在上述代码中,我们做了以下更改:

  1. 我们在脚本的第一行加入了shebang(#!/usr/bin/env bash)以指定使用bash来解释脚本,从而避免脚本中的命令被Jenkins解释为变量替换。
  2. 使用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]}被解释为变量替换的解决方案。根据你的环境和需求,选择适合的方法来处理这个问题。

正文完