TL;DR; Vous voulez utiliser un scalaire YAML multi-ligne (pour la lisibilité) qui est chargé comme une chaîne d'une seule ligne pouvant être exécutée comme une commande par Gitlab-CI. Pour ce faire, utilisez un scalaire simple (sans guillemets) en YAML qui est réparti sur plusieurs lignes :
script:
- echo -e
"echo 'hi';
echo 'bye';"
Veuillez noter qu'il existe certaines restrictions imposées par YAML sur de tels scalaires. Ce que vous devez absolument savoir, c'est que chaque ligne suivante est indentée d'au moins une position de plus que echo -e
(qui est indenté de deux positions par rapport à son noeud de collection, qui n'est pas du tout indenté), et que chaque nouvelle ligne est remplacée par un espace lors du chargement (vous devez donc faire attention à l'emplacement des nouvelles lignes).
Il y a plusieurs idées fausses dans votre publication, qui vous amènent à poser la mauvaise question.
Il n'existe pas de tel chose comme une chaîne YAML multi-ligne. YAML a des scalaires et certains de ces scalaires peuvent être chargés par un programme en tant que chaînes, tandis que d'autres seront chargés en tant qu'entiers, flottants, etc.
Vous êtes évidemment intéressé par les noeuds scalaires qui sont chargés en tant que chaîne, puisque cette chaîne peut ensuite être interprétée comme une commande ligne de commande. Mais vous ne voulez pas avoir une ligne de commande multi-ligne (c'est-à-dire avec des sauts de ligne intégrés), car les scripts multi-lignes ne sont pas pris en charge dans Gitlab CI (comme l'a indiqué @Jordan).
Pour la lisibilité, vous voulez utiliser la capacité standard de YAML à charger des scalaires multi-lignes en tant que chaîne d'une seule ligne.
Si vous ne vous souciez pas de la lisibilité, vous pourriez utiliser :
- echo -e "\n echo 'hi';\n echo 'bye';\n"
et puisque votre scalaire n'est pas entre guillemets (c'est-à-dire qu'il commence par echo
), vous n'avez pas besoin de faire quelque chose de spécial en YAML pour les antislashs ou les guillemets.
Le résultat du script est le même (afficher une ligne vide, afficher echo 'hi';
sur une ligne indentée de quatre espaces, afficher echo 'bye';
sur une ligne indentée de quatre espaces).
Si vous souhaitez utiliser une entrée multi-ligne pour la lisibilité, qui est chargée comme une seule ligne, il existe essentiellement deux options : utiliser un scalaire plain multi-ligne ou utiliser un scalaire plié dans votre YAML.
scalaire plain multi-ligne
Plain signifie que le scalaire n'est pas entre guillemets, et comme pour toute chose multi-ligne en YAML, cela signifie que les lignes suivantes doivent être indentées de manière appropriée, dans ce cas plus que la ligne initiale
script:
- echo -e
"echo 'hi';
echo 'bye';"
les sauts de ligne sont remplacés par des espaces donc ne faites pas :
script:
- echo -e
"echo 'hi';
echo '
bye';"
car vous obtiendrez un espace visible avant bye
.
Il y a quelques restrictions comme le fait que vous ne pouvez pas avoir un deux-points suivi d'un espace à l'intérieur d'un tel scalaire (ce qui le ferait ressembler à une paire clé-valeur).
Il n'est pas nécessaire d'échapper les antislashs dans les scalaires plain, car vous ne pouvez pas échapper de caractères dans un scalaire plain, mais bien sûr vous pouvez inclure un antislash, qui se retrouvera dans la chaîne chargée depuis le YAML et peut avoir une signification pour la commande exécutée à partir de cette chaîne.
scalaire plié
Un scalaire plié est similaire à un scalaire plain en ce sens que toutes les (uniques) nouvelles lignes sont substitué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 de scalaire plié (>
).
Contrairement aux scalaires plain, des choses comme :
n'ont pas de signification spéciale. Donc si les scalaires plain échouent en lançant une erreur YAML, des scalaires pliés similaires ne le feront probablement pas.
0 votes
Il y a un problème à ce sujet : gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 Il n'est pas clair pour moi quel est le problème, puisque votre code devrait être équivalent (suffisamment) en YAML par rapport aux solutions proposées là-bas. Vous pouvez essayer d'ajouter
\
à la fin de vos lignes, mais je ne peux pas garantir si cela fonctionnera ou non.