gpt4 book ai didi

bash - SSH 捕获远程 ssh 命令的退出代码

转载 作者:行者123 更新时间:2023-12-02 13:47:34 35 4
gpt4 key购买 nike

我编写了一个脚本,它是 gitlab ci 管道的一部分,用于通过 ssh 将代码部署到远程服务器。该脚本位于本地并转发到远程服务器。到目前为止一切正常,但不幸的是,当发生错误时就会出现问题。现在 migrate 命令退出,因为没有保存数据库凭据。该命令以非零代码退出,但管道仍然成功,这是一种误导,迫使我登录到远程服务器并检查那里的日志。

如何将退出代码从远程转发到本地机器,以便在这种情况下 gitlab-ci 作业也失败?

我遇到过这些问答,但由于我是 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 行之后

关于bash - SSH 捕获远程 ssh 命令的退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63552422/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com