リモートsshコマンドのSSHキャプチャ終了コード
gitlab ciパイプラインの一部であるスクリプトを作成して、ssh経由でリモートサーバーにコードをデプロイしました。スクリプトはローカルに配置され、リモートサーバーに認識されます。これまでは問題なく動作しましたが、残念ながらエラーが発生すると問題が発生します。データベースのクレデンシャルが保存されていないため、現在、migrateコマンドは終了します。コマンドはゼロ以外のコードで終了しますが、パイプラインは引き続き成功します。これは誤解を招く恐れがあり、リモートサーバーにログインしてそこでログを確認する必要があります。
終了コードをリモートからローカルマシンに転送して、この場合gitlab-ciジョブも失敗するようにするにはどうすればよいですか?
私はこれらのQ / Aに出くわしましたが、私はbashにかなり慣れていないので、解決策を理解していません。削除set -e
しても役に立ちませんでした。
- bash-リモートsshコマンドから終了コードをキャプチャします
- SSHリモートコマンドの終了コード
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
少なくとも1つのスクリプト行がゼロ以外を返す場合、Gitlabはジョブを失敗させる必要があります。
あなたがこの行について言った以外は私があなたを理解している限り
php "$RELEASE_DIR" artisan migrate --no-interaction --force
このツールについてはわかりませんが、多くの場合、フラグ--force
はゼロコードなしでコマンドを作成する必要があります。フラグを確認してください。
それがうまくいかない場合は、入れてみてください
if [[ $? != 0 ]]; then
exit 1
fi
との行の後 migrate
はい。これは私の側の間違いだったようで、すべてが正しく機能しています。コマンドの1つを正しく呼び出していませんでした:
php "$RELEASE_DIR" artisan migrate --no-interaction --force
これはそれを修正します:
php "$RELEASE_DIR/artisan" migrate --no-interaction --force