使用 if 语句和函数调用编写构建脚本

使用 if 语句和函数调用编写构建脚本

我的构建/部署脚本的行为不符合我的预期。如果克隆或构建失败,它仍然会继续并调用重新启动。我怀疑它是因为我返回 0,但是如果我想从内部命令返回结果,我应该如何编写,并且在“克隆”中,仅当克隆成功时我才想移动到克隆文件夹中。您将如何改进这个脚本?

function clone {
    git clone /volume1/repos/project.git
    cd project
    return 0
}

function build {
    docker build -t project .
    return 0
}

function cleanup {
    ...
}

function restart {
    ...
    docker run ...
}

trap cleanup EXIT

if clone && build; then
    restart
    exit 0
else
    echo Failed...
    exit 1
fi

答案1

是的,正如您所指出的,由于您的函数始终返回 a ,因此0它始终会返回成功。不管发生什么。最简单的解决方案是让您的函数根本不返回任何内容:

function clone {
    git clone /volume1/repos/project.git
    cd project
}

function build {
    docker build -t project .
}

然后,它将返回最后运行命令的退出状态(来自man bash):

当执行时,函数的退出状态是函数体中执行的最后一个命令的退出状态。

当然,由于clone函数的最后一个命令是cd,这意味着如果git clone失败但cd project成功,您的函数仍将返回成功。为了避免这种情况,您可以将 git 命令的退出状态保存在一个变量中,然后让您的函数返回该变量:

function clone {
    git clone /volume1/repos/project.git
    out=$?
    cd project
    return $out
}

或者,也许更好:

function clone {
    git clone /volume1/repos/project.git && cd project
}

通过组合命令,如果其中任何一个失败,您的函数将返回失败。

答案2

将您的函数修改为:

function clone {
    if git clone /volume1/repos/project.git; then
            cd project
            return 0
    else
            return 1
    fi
}

function build {
    docker build -t project .
}

这样,如果其中的命令失败,该函数将正确退出。请注意,您不需要显式返回该build函数的任何内容,因为它只会返回 docker 命令的退出状态,但是如果您向其中添加更多命令,您可能需要对其进行类似于该函数的设置clone

相关内容