当 ssh 部署失败时,Jenkins 构建会通过



我在 Jenkins 构建步骤中使用 here 标签通过 ssh 发送我的部署命令,不幸的是,即使 here 标签中的命令没有成功完成,构建也会通过: ssh user@host <<EOF cd /path/to/app git pull bower install npm install grunt build cp -r /path/to/app/dist/* /path/to/dist/ forever restartall exit EOF

有没有更好的方法来解决这个问题?

您没有在"此处文档"中捕获任何错误代码。
最后一个命令是exit的,如果没有退出代码,它将默认为0即成功。
由于ssh的最后一个命令是成功的,因此整个命令被视为成功,构建是成功的。

解决此问题的最简单方法:将所有命令与&&链接,如下所示:
cd /path/to/app && git pull && bower install && npm install && grunt build && cp -r /path/to/app/dist/* /path/to/dist/ && forever restartall && exit

解决这个问题的最佳方法:编写一个适当的 shell 脚本,并进行错误处理,然后执行它。如果您懒得错误地处理每一行,则可以使用set -e启动脚本,这将导致任何单个错误的shell脚本失败

编辑:

#!/bin/bash
appPath="/path/to/app"
distPath"/path/to/dist"
echo "My great deployment script"
echo "Deploying ${appPath} to ${distPath}
if [[ ! -w "${appPath}" ]]; then
    echo "${appPath} is not writable, quitting"
    exit 1
else
    cd ${appPath} && git pull || { echo "Failed on 'git pull'"; exit 2; }
    bower install || { echo "Failed on 'bower install'"; exit 3; }
    npm install || { echo "Failed on 'npm install'"; exit 4; }
    grunt build || { echo "Failed on 'grunt build'"; exit 5; }
    if [[ -w "${distPath}" ]]; then
        cp -r ${appPath}/dist/* ${distPath}/ || { echo "Failed on 'copy'"; exit 1 }        
        forever restartall || { echo "Failed on 'forever restartall'"; exit 6 }
        echo "Deployment successful"
        exit 0 
   fi
fi

然后使用以下命令执行它:ssh user@host 'bash -s' < myfile.sh(如果文件是本地文件(
或者,如果您远程放置文件,则只需:ssh user@host '/path/to/remote/myfile.sh'

最新更新