我在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
有没有更好的方法来解决这个问题?
答案 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'