web-dev-qa-db-fra.com

Chaîne YAML multiligne pour GitLab CI (.gitlab-ci.yml)

J'essaie d'écrire un fichier gitlab-ci.yml qui utilise une chaîne multiligne pour la commande. Cependant, il semble que cela ne soit pas analysé. J'ai essayé à la fois le - | et le - > avec des résultats identiques.

stages:
  - mystage

Build:
  stage: mystage
  script:
    - |
        echo -e "
            echo 'hi';
            echo 'bye';
        "

Lorsqu'il tente de s'exécuter, il affiche uniquement echo -e ' en tant que script à exécuter, et non la chaîne multiligne entière. Cela cause des problèmes pour moi.

Quelle serait la syntaxe correcte pour écrire quelque chose comme ça?

49
samanime

TL; DR; Vous souhaitez utiliser un scalaire YAML multiligne (pour la lisibilité) chargé en tant que chaîne simple pouvant être émise sous forme de commande par Gitlab-CI. Pour ce faire, utilisez un scalaire brut (sans guillemets) dans YAML qui est réparti sur plusieurs lignes:

script:
- echo -e 
   "echo 'hi';
    echo 'bye';"

Sachez que YAML impose certaines restrictions à ces scalaires. Ce que vous devez certainement savoir, c’est que chaque ligne suivante est indentée d’au moins une position de plus que echo -e (qui est indentée de deux positions par rapport à son noeud de collecte, ce qui n’est pas du tout indentée), et que chaque nouvelle ligne est remplacé par un espace lorsqu’il est chargé (vous devez donc vous occuper de savoir où placer les nouvelles lignes).


Il y a plusieurs idées fausses dans votre message, ce qui vous amène à poser la mauvaise question.

Il n’existe pas de chaîne YAML multiligne . YAML a des scalaires et certains d'entre eux peuvent être chargés par un programme sous forme de chaînes, tandis que d'autres seront chargés sous forme d'entiers, de flottants, etc.

Vous êtes évidemment intéressé par les nœuds scalaires chargés en tant que chaîne, puisque cette chaîne peut ensuite être interprétée comme une ligne de commande. Mais vous ne voulez pas avoir une ligne de commande multi-ligne (c'est-à-dire avec des lignes nouvelles incorporées), car les scripts multi-ligne ne sont pas supportés dans Gitlab CI (comme @Jordan l'a indiqué).

Pour des raisons de lisibilité, vous souhaitez utiliser la capacité standard de YAML pour charger des scalaires à plusieurs lignes en tant que chaîne à une seule ligne.

Si vous ne vous souciez pas de la lisibilité, vous pouvez utiliser:

- echo -e "\n    echo 'hi';\n    echo 'bye';\n"

et comme votre scalaire n’est pas cité (c’est-à-dire qu’il commence par echo), vous n’avez pas besoin de faire quelque chose de spécial en YAML pour les barres obliques inverses ou les guillemets.

Le résultat du script est identique (imprimer une ligne vide, imprimer echo 'hi'; sur une ligne en retrait de quatre espaces, imprimer echo 'bye'; sur une ligne en retrait de quatre espaces.)

Si vous souhaitez utiliser l'entrée multiligne pour la lisibilité, qui sont chargées comme une seule ligne, il existe essentiellement deux options: utiliser un scalaire plan multiligne ou utiliser un scalaire plié dans votre YAML.

scalaire simple multiligne

Plain signifie que le scalaire n'est pas cité, et comme pour tout ce qui concerne plusieurs lignes dans YAML, cela signifie que les lignes suivantes doivent être indentées de manière appropriée, dans ce cas plus loin que la ligne initiale.

script:
- echo -e 
   "echo 'hi';
    echo 'bye';"

les nouvelles lignes sont remplacées par des espaces alors ne faites pas:

script:
- echo -e 
   "echo 'hi';
    echo '
   bye';"

comme vous obtiendrez un espace visible avant bye.

Il existe des restrictions telles que vous ne pouvez pas avoir de deux points suivis d'un espace dans un tel scalaire (ce qui donnerait l'impression que c'est une paire clé-valeur).

Il n’est pas nécessaire d’échapper des barres obliques inverses dans des scalaires ordinaires, car vous ne pouvez échapper à aucun caractère d’un scalaire ordinaire, mais vous pouvez bien sûr inclure une barre oblique inverse, qui se retrouvera dans la chaîne chargée à partir de YAML et peut avoir un sens pour la commande exécutée à partir de cette chaîne.

scalaire plié

Un scalaire plié est similaire à un scalaire simple en ce sens que toutes les nouvelles lignes (simples) sont remplacées par un espace lors du chargement:

script:
- >
  echo -e 
  "echo 'hi';
  echo 'bye';"

Vous devez indenter les informations de commande réelles au moins autant que l'indicateur scalaire replié (>).

Contrairement aux simples scalaires, des choses comme : n'ont pas de signification particulière. Ainsi, si les scalaires simples échouent en générant une erreur YAML, les scalaires similaires ne le seront probablement pas.

16
Anthon

Je suis arrivé ici en pensant que cela poserait un problème, mais la commande "multi-lignes" suivante pour la lisibilité fonctionne pour moi:

Gitlab Runner: Shell Runner version 1.11.0/version de Gitlab: 8.17.2

myjob:
stage: deploy
script:
  # Single line command
  - az component update --add sql

  # Multi-line command
  - az sql server create -n ${variable} -g ${variable} -l ${variable}
    --administrator-login ${variable} --administrator-login-password ${variable}
69
PotatoFarmer

Vous pouvez utiliser n’importe quel script/commande multiligne via la fonction yaml literal_block et anchor. Exemple:

.build: &build |
    echo -e "\n$hl???? Building $green$build_path/$build_assets_dir/*.js $nl\n"
    echo -e "javascript-obfuscator $build_path/$build_assets_dir/*.js"
[...]

build:master: 
  stage: build
  script:
    - *rsync
    - *build
[...]
20
Benny K

La commande wp config create était assez précise ... du .gitlab-ci ...

build:
  stage: build
  script:
    - echo "Building the app"
    - |
        wp config create --dbname=$vardb --dbhost=$varhost --dbuser=$varusr --dbpass=$varpas --extra-php <<PHP
            define( 'WP_DEBUG', false );
            define( 'FS_METHOD', 'direct' );
            define( 'WP_POST_REVISIONS', 5 );
            define( 'AUTOSAVE_INTERVAL', 600 );
        PHP
    - scp ./wp-config.php continued...
  allow_failure: true
7
mal

Ce travail pour moi dans Travis CI

before_install:
  - set -e
  - |
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    <settings xmlns=\"http://maven.Apache.org/SETTINGS/1.0.0\"
              xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
              xsi:schemaLocation=\"http://maven.Apache.org/SETTINGS/1.0.0
                                   http://maven.Apache.org/xsd/settings-1.0.0.xsd\">
      <servers>
        <server>
          <id>github</id>
          <username>${GITHUB_USERNAME}</username>
          <password>${GITHUB_PASSWORD}</password>
        </server>
      </servers>
    </settings>
    " >  ${HOME}/.m2/settings.xml

Ici, deux variables env (${GITHUB_USERNAME} et ${GITHUB_PASSWORD}) seront également interpolées.

1
Maksim Kostromin