SSH capture le code de sortie des commandes ssh distantes

Aug 24 2020

J'ai écrit un script, qui fait partie d'un pipeline gitlab ci, pour déployer du code via ssh sur un serveur distant. Le script est situé localement et transmis au serveur distant. Cela fonctionne bien jusqu'à présent, mais malheureusement, il y a un problème lorsque des erreurs se produisent. À l'heure actuelle, la commande migrate se termine, car aucune information d'identification db n'est enregistrée. La commande se termine avec un code non nul, mais le pipeline réussit toujours, ce qui est trompeur et m'oblige à me connecter au serveur distant et à y vérifier les journaux.

Comment puis-je transférer les codes de sortie de la télécommande vers la machine locale, de sorte que dans ce cas, le travail gitlab-ci échoue également ?

Je suis tombé sur ces questions/réponses, mais comme je suis assez nouveau pour bash, je ne comprends pas la solution. La suppression set -en'a pas aidé.

  • bash - Capturez le code de sortie de la commande ssh distante
  • Code de sortie de la commande à distance SSH

La partie de configuration de gitlab-ci ressemble à ceci :

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"

Le script post_deploy.sh ressemble à ceci :

#!/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 {} \;

Réponses

1 Novikov Aug 27 2020 at 04:42

cela devrait fonctionner si vous obtenez vraiment un code non nul. j'ai testé sur mes machines

$ ssh user@host 'bash -s' < script.sh remote script execute with exit 1 $ echo $?
1

Gitlab doit faire échouer une tâche si au moins une ligne de script renvoie une valeur non nulle.

D'après ce que je vous comprends, sauf que vous avez dit à propos de cette ligne

php "$RELEASE_DIR" artisan migrate --no-interaction --force

Je ne connais pas cet outil, mais souvent les drapeaux --forcedoivent faire une commande sans code zéro. Veuillez vérifier les drapeaux.

Si cela ne fonctionne pas, essayez de mettre

if [[ $? != 0 ]]; then
  exit 1
fi

après ligne avecmigrate

1 Tom Aug 27 2020 at 15:10

D'accord. Il semble que ce soit une erreur de ma part, et tout fonctionne correctement. Je n'appelais pas correctement l'une des commandes:

php "$RELEASE_DIR" artisan migrate --no-interaction --force

Cela corrige:

php "$RELEASE_DIR/artisan" migrate --no-interaction --force