簡體   English   中英

SSH 捕獲遠程 ssh 命令的退出碼

[英]SSH capture exit code of remote ssh commands

我編寫了一個腳本,它是 gitlab ci 管道的一部分,用於通過 ssh 將代碼部署到遠程服務器。 該腳本位於本地並轉發到遠程服務器。 到目前為止,這工作正常,但不幸的是,發生錯誤時會出現問題。 現在 migrate 命令退出,因為沒有保存數據庫憑據。 該命令以非零代碼退出,但管道仍然成功,這是一種誤導,並迫使我登錄到遠程服務器並檢查那里的日志。

如何將退出代碼從遠程轉發到本地機器,以便在這種情況下 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM