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

low*_*292 0 deployment ssh automated-tests continuous-deployment 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

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

Sla*_*lav 5

您没有在“此处文档”中捕获任何错误代码。
最后一个命令是exit和没有退出代码,它将默认0为成功。
由于你的最后一个命令ssh是成功的,整个命令都被视为成功,而 build 是成功的。

解决这个问题的最简单方法:将所有命令链接起来,&&如下所示:
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
Run Code Online (Sandbox Code Playgroud)

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