当ssh部署失败时,Jenkins构建传递

时间:2014-12-16 09:50:14

标签: deployment ssh jenkins continuous-deployment automated-tests

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

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

1 个答案:

答案 0 :(得分:2)

您没有在“此处的文档”中捕获任何错误代码 最后一个命令是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'

相关问题