[英]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.