web-dev-qa-db-fra.com

Autorisation CircleCI refusée pour l'exécution du script bash

J'ai un fichier circle.yml comme ceci:

dependencies:
  override:
    - meteor || curl https://install.meteor.com | /bin/sh

deployment:
  production:
    branch: "master"
    commands:
      - ./deploy.sh

Lorsque j'appuie sur Github, j'obtiens l'erreur suivante:

/home/ubuntu/myproject/deploy.sh returned exit code 126

bash: line 1: /home/ubuntu/myproject/deploy.sh: Permission denied Action failed: /home/ubuntu/myproject/deploy.sh

Lorsque j'exécute les commandes qui résident dans deploy.sh en dehors du fichier (sous commands), tout se passe bien. 

Tout dans le fichier circle.yml semble correspondre aux exemples de la documentation CircleCI .. Qu'est-ce que je fais mal?

17
samcorcos

Plusieurs problèmes possibles:

  1. deploy.sh n'est peut-être pas marqué comme exécutable (chmod +x deploy.sh résoudra le problème)
  2. La première ligne de deploy.sh n'est peut-être pas un shell exécutable ...

Si le premier ne fonctionne pas, pouvons-nous voir le contenu de deploy.sh?

30
palfrey

J'avais le même problème. J'ai ajouté sh au début de ma section de commandes pour le faire fonctionner.

deployment:
  production:
    branch: "master"
    commands:
      - sh ./deploy.sh

Espérons que cette solution sauve tout le monde à l'avenir.

23
Jesse Sanders

Comme @palfrey dit que le script n'est probablement pas marqué comme exécutable, et parfois, il semble être mal marqué lors du déploiement même si vous avez déjà exécuté chmod +x sur votre script sur votre ordinateur local. (Pourquoi? Je ne sais pas. Si quelqu'un me plaît, éclaire-moi!)

Voici une commande générale à utiliser pour vous assurer que vos scripts sont toujours marqués comme exécutables. Cela suppose qu'ils se trouvent tous dans un répertoire /home/ubuntu/${CIRCLE_PROJECT_REPONAME}/scripts et qu'ils ont tous une extension .sh. Si votre ou vos répertoires sont différents, modifiez-les pour les utiliser à la place.

Depuis tous mes scripts source un script partagé (shared.sh) en haut de chaque script appelé par circle.yml, j'ajoute le code suivant à shared.sh qui garantit que tous les scripts sont marqués comme étant exécutables:

SCRIPTS="/home/ubuntu/${CIRCLE_PROJECT_REPONAME}/scripts"
find "${SCRIPTS}" | grep "\.sh$" | xargs chmod +x

Fonctionne comme un charme. :-)

0
MikeSchinkel