如何解决SSH捕获远程ssh命令的退出代码
我已经编写了一个脚本,该脚本是gitlab ci管道的一部分,用于通过ssh将代码部署到远程服务器。该脚本位于本地,并转发到远程服务器。到目前为止还可以,但是不幸的是,发生错误时会出现问题。现在,由于没有保存数据库凭据,因此迁移命令退出。该命令以非零代码退出,但是管道仍然成功,这会产生误导,并迫使我登录到远程服务器并检查那里的日志。
如何将退出代码从远程转发到本地计算机,这样在这种情况下gitlab-ci作业也会失败?
我遇到过这些Q / A,但是由于我对bash相当陌生,所以我不了解解决方案。删除set -e
并没有帮助。
gitlab-ci配置部分如下所示:
script:
# Change directory to the packaged app (not the repo).
- cd /var/www/html
# Copy over the code.
- |
rsync \
-azc \
--exclude-from="$RSYNC_EXCLUDES" \
"$(pwd)/" "$SSH_CONNECTION:$BASE_DIR/releases/$CI_COMMIT_SHA/"
# Run the post deployment script.
- ssh -T "$SSH_CONNECTION" "bash -s" < ./.deploy/post_deploy.sh "$BASE_DIR" "$CI_COMMIT_SHA"
post_deploy.sh脚本如下:
#!/bin/bash
# Terminate execution if any command fails
set -e
########################
# Program arguments:
########################
## The base directory
BASE_DIR=$1
# The commit sha that is being deployed.
COMMIT_SHA=$2
################
# Variables:
################
# The path to the releases directory
RELEASE_DIR=$BASE_DIR/releases/$COMMIT_SHA
# The path to the shared directory.
SHARED_DIR=$BASE_DIR/shared
###############
# Deployment:
###############
echo "Symlink $SHARED_DIR/.env to $RELEASE_DIR/.env."
rm -rf "$RELEASE_DIR/.env" && ln -sf "$SHARED_DIR/.env" "$RELEASE_DIR/.env."
echo "Symlink $SHARED_DIR/storage to $RELEASE_DIR."
rm -rf "$RELEASE_DIR/storage" && ln -sf "$SHARED_DIR/storage" "$RELEASE_DIR"
echo "Fixing permissions."
find "$RELEASE_DIR" -type f -exec chmod 644 {} \;
find "$RELEASE_DIR" -type d -exec chmod 755 {} \;
echo "Running custom scripts."
php "$RELEASE_DIR" artisan storage:link
php "$RELEASE_DIR" artisan migrate --no-interaction --force
php "$RELEASE_DIR" artisan cache:clear
php "$RELEASE_DIR" artisan config:clear
php "$RELEASE_DIR" artisan config:cache
php "$RELEASE_DIR" artisan view:cache
echo "Releasing the new version (symlink current/)."
ln -nsf "$RELEASE_DIR/" "$BASE_DIR/current"
echo "Remove all releases older than a day."
find "$BASE_DIR/releases" -maxdepth 1 -mindepth 1 -mtime +1 -exec rm -r {} \;
解决方法
如果您真的得到非零代码,它应该可以工作。 我在机器上测试了
$ ssh user@host 'bash -s' < script.sh
remote script execute with exit 1
$ echo $?
1
如果至少一个脚本行返回非零值,则Gitlab必须使作业失败。
据我了解,除了您所说的这一行
php "$RELEASE_DIR" artisan migrate --no-interaction --force
我对这个工具一无所知,但标志--force
通常应使命令不带零代码。请检查标志。
如果这不起作用,请尝试放入
if [[ $? != 0 ]]; then
exit 1
fi
与migrate
>
好的。看来这是我的错误,并且一切正常。我没有正确调用以下命令之一:
php "$RELEASE_DIR" artisan migrate --no-interaction --force
此问题已解决:
php "$RELEASE_DIR/artisan" migrate --no-interaction --force
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。