web-dev-qa-db-fra.com

L'exécution conditionnelle du script ne fonctionne pas dans travis.yml, pourquoi?

Les éléments suivants empêchent travis de se construire du tout. Lorsque j'essaie de valider le travis.yml, il se plaint que la ligne juste au-dessus de l'instruction if manque un - caractère dans la colonne 3, mais l'erreur est liée à l'instruction if ci-dessous.

Dois-je déplacer l'instruction if dans un script?

# Deploy
after_success:
  - ./tools/docker-Push-container.sh
  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi
20
user1283776

Vous faites certaines hypothèses sur la syntaxe YAML qui vous posent des problèmes. Si vous "étendez" une ligne de YAML en mettant en retrait les lignes suivantes, comme ceci:

- The quick brown fox
  jumped over the
  lazy dog.

C'est exactement comme vous l'avez écrit à la place:

- The quick brown fox jumped over the lazy dog.

Cela signifie que votre fragment Shell, que vous avez écrit comme suit:

  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi

Devient en fait:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then ./.travis/success_message.sh fi

Et si vous essayez d'exécuter cette ligne dans le shell, vous obtenez:

sh: -c: line 1: syntax error: unexpected end of file

Si vous souhaitez inclure un script Shell sur plusieurs lignes dans votre document YAML, le mieux est probablement d'utiliser l'opérateur de bloc textuel, |, comme ça:

  - |
    if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi

Ce qui se traduira, comme prévu, par:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
  ./.travis/success_message.sh
fi

Alternativement, vous pouvez simplement utiliser correctement les points-virgules:

  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh;
    fi

Notez le nouveau ; avant le terminal fi. Il en résulte:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then ./.travis/success_message.sh; fi

... qui est une syntaxe Shell parfaitement valide.

37
larsks

J'ai essayé la solution ci-dessus par larsks mais, cela n'a pas fonctionné pour moi et pourrait être parce que dans bash lorsque vous utilisez && et || vous devez séparer les conditions.

J'ai eu ce qui suit (selon la solution ci-dessus)

  - if [ $TRAVIS_PULL_REQUEST == false && $TRAVIS_BRANCH == "development" ]; then
        echo "# Bump version and flyway migrate db"; 
    else 
        echo "Skip version increment!"; 
    fi

Et j'ai aussi vérifié le .travis.yml in Travis Lint et il apparaît comme valide mais, selon bash, ce qui précède peut être séparé comme indiqué ci-dessous, également mentionné dans ce SO Question et je suis passé à ce qui suit

    - if [ $TRAVIS_PULL_REQUEST == false ] && [ $TRAVIS_BRANCH == "development" ]; then
            echo "# Bump version and flyway migrate db"; 
        else 
            echo "Skip version increment!"; 
        fi

Et travis build a fonctionné. Cela a du sens car ci-dessus est une manière valide d'utiliser && et || en bash. Juste partager au cas où quelqu'un d'autre rencontrerait un problème similaire.

2
Raf

Aucune des solutions de contournement suggérées n'a fonctionné pour moi, je l'ai utilisé à la place:

- if [[ ( "$TRAVIS_OS_NAME" == "osx" ) && ( "$TOXENV" == "py36" ) ]]; then brew update; fi
0
MrMeemus

La solution de Raf a fonctionné pour moi en séparant les conditions avec []

[ $TRAVIS_PULL_REQUEST == false ] && [ $TRAVIS_BRANCH == "develop" ];
0
Rebekah Apelt