Nous avons récemment déménagé à Gitlab et avons commencé à utiliser des pipelines. Nous avons mis en place un serveur de build (une instance Ubuntu 16.04) et installé un coureur qui utilise un exécuteur Shell mais je ne suis pas sûr de la façon dont il exécute réellement les scripts définis dans le fichier .gitlab-ci.yml
. Considérons l'extrait de code suivant:Comment l'exécuteur Shell exécute-t-il les scripts?
script:
- sh authenticate.sh $DEPLOY_KEY
- cd MAIN && sh deploy.sh && cd ..
- sh deploy_service.sh MATCHMAKING
- sh deauthenticate.sh
j'avais l'impression que ce sera juste conduit ces commandes à Bash, et donc je me attendais le comportement de Bash par défaut. Qu'est-ce qui se passe, cependant, est que le deploy.sh
échoue en raison d'une erreur ssh
; Bash continue alors à exécuter deploy_service.sh
(ce qui est un comportement attendu) mais cela échoue avec une erreur can't open deploy_service.sh
et le travail se termine sans que Bash n'exécute la dernière instruction. D'après ce que je comprends, Bash n'abandonnera en cas d'erreur que si vous faites d'abord un set -e
et donc je m'attendais à ce que toutes les instructions soient exécutées. J'ai essayé d'ajouter le set -e
comme première instruction mais cela ne fait aucune différence - il ne se termine pas sur la première erreur ssh
.
J'ai ajouté la sortie exacte de gitlab ce ci-dessous:
Sans set -e
$ cd MAIN && sh deploy.sh && cd ..
deploy.sh: 72: deploy.sh: Bad substitution
Building JS bundles locally...
> better-npm-run build
running better-npm-run in x
Executing script: build
to be executed: node ./bin/build
-> building js bundle...
-> minifying js bundle...
Uploading JS bundles to server temp folder...
COMMENCING RESTART. 5,4,3,2,1...
ssh: Could not resolve hostname $: Name or service not known
$ sh deploy_service.sh MATCHMAKING
sh: 0: Can't open deploy_service.sh
ERROR: Job failed: exit status 1
Avec set -e
$ set -e
$ cd MAIN && sh deploy.sh && cd ..
deploy.sh: 72: deploy.sh: Bad substitution
Building JS bundles locally...
> better-npm-run build
running better-npm-run in x
Executing script: build
to be executed: node ./bin/build
-> building js bundle...
-> minifying js bundle...
Uploading JS bundles to server temp folder...
COMMENCING RESTART. 5,4,3,2,1...
ssh: Could not resolve hostname $: Name or service not known
$ sh deploy_service.sh MATCHMAKING
sh: 0: Can't open deploy_service.sh
ERROR: Job failed: exit status 1
Pourquoi est-il, sans set -e
, se terminant en cas d'erreur (également, pourquoi se termine-t-il uniquement sur la deuxième erreur et non sur l'erreur ssh
)? Toute idée serait grandement appréciée.
« sh deploy.sh » Vous invoquer 'sh' ici, pas 'bash'. Ils peuvent ne pas être la même chose sur votre système. Si vous voulez bash, appelez bash. – Kenster
@Kenster 'bash' est utilisé pour invoquer' sh' sur ce script et l'erreur est renvoyée 'bash' avec le code de sortie approprié (127 pour la première erreur et 255 pour la deuxième erreur). Le problème est que 'bash' est/ne détecte pas l'erreur comme prévu. – Amposter
De la docs: # Cette commande est utilisée si la construction doit être exécutée dans le contexte d'un autre utilisateur (l'interpréteur de shell) 'cat generated-bash-script | su --shell/bin/bash --login user' – Amposter