TL;DR ; Vous voulez utiliser un scalaire YAML à plusieurs lignes (pour plus de lisibilité) qui est chargé comme une chaîne à une seule ligne qui peut être émise comme une commande par Gitlab-CI. Pour ce faire, utilisez un scalaire simple (sans guillemets) dans YAML qui est réparti sur plusieurs lignes :
script:
- echo -e
"echo 'hi';
echo 'bye';"
Sachez qu'il existe certaines restrictions imposées par YAML sur ces scalaires. Ce que vous devez certainement savoir, c'est que chaque ligne suivante est indentée d'au moins une position supplémentaire que echo -e
(qui est indenté de deux positions par rapport à son nœud de collection, qui n'est pas indenté du tout), et que chaque nouvelle ligne est remplacée par un espace lors du chargement (il faut donc faire un peu attention à l'endroit où placer les nouvelles lignes).
Il y a plusieurs idées fausses dans votre message, qui vous amènent à poser la mauvaise question.
Il n'existe pas de chaîne YAML à plusieurs lignes. . YAML comporte des scalaires et certains de ces scalaires peuvent être chargés par un programme sous forme de chaînes de caractères, tandis que d'autres seront chargés sous forme d'entiers, de flottants, etc.
Vous êtes évidemment intéressé par les nœuds scalaires qui sont chargés sous forme de 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-lignes (i.e. avec des nouvelles lignes intégrées), puisque scripts multi-lignes ne sont pas pris en charge dans Gitlab CI (comme l'a indiqué @Jordan).
Pour plus de lisibilité, vous voulez utiliser la capacité standard de YAML pour charger des scalaires multi-lignes comme des chaînes de caractères d'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 puisque votre scalaire n'est pas cité (c'est-à-dire qu'il commence par echo
) vous n'avez pas besoin de faire quoi que ce soit de spécial dans YAML pour les backslashes ou les guillemets.
Le résultat du script est le même (imprimer une ligne vide, imprimer echo 'hi';
sur une ligne en retrait de quatre espaces, imprimez echo 'bye';
sur une ligne en retrait de quatre espaces).
Si vous voulez utiliser l'entrée multi-lignes pour la lisibilité, qui sont chargées comme une seule ligne, il y a essentiellement deux options : utiliser un scalaire plan multi-lignes ou utiliser un scalaire plié dans votre YAML.
scalaire uni multi-ligne
Plain signifie que le scalaire n'est pas cité, et comme pour toute chose à 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, donc ne le font pas :
script:
- echo -e
"echo 'hi';
echo '
bye';"
car vous obtiendrez un espace visible avant bye
.
Il existe certaines restrictions, comme le fait que vous ne pouvez pas avoir de deux-points suivis d'un espace dans un tel scalaire (ce qui le ferait ressembler à une paire clé-valeur).
Il n'est pas nécessaire d'échapper les barres obliques inverses dans les scalaires simples, car vous ne pouvez pas échapper de caractères dans un scalaire simple, mais vous pouvez bien sûr inclure une barre oblique inversée, qui se retrouvera dans la chaîne chargée à partir du fichier YAML et du fichier peut ont une signification pour la commande exécutée à partir de cette chaîne.
scalaire plié
Un scalaire plié est similaire à un scalaire simple, mais tous les retours à la ligne (simples) sont remplacés par un espace pendant le chargement :
script:
- >
echo -e
"echo 'hi';
echo 'bye';"
Vous devez indenter les informations de la commande réelle au moins autant que l'indicateur scalaire plié ( >
).
Contrairement aux scalaires ordinaires, les choses comme :
n'ont pas de signification particulière. Ainsi, si les scalaires simples échouent en lançant une erreur YAML, les scalaires pliés similaires ne le feront probablement pas.
0 votes
Il y a un problème pour ça : gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166 Je ne vois pas bien où est le problème, puisque votre code devrait être équivalent (suffisamment) YAML aux solutions proposées ici. Vous pouvez essayer d'ajouter
\
à vos lignes, mais je ne peux pas dire si ça va marcher ou pas.