tutorial - Cadena YAML multilínea para GitLab CI(.gitlab-ci.yml)
gitlab ci variables (3)
Dado que el problema parece estar relacionado con los scripts de varias líneas que no son compatibles con Gitlab CI (como se indica en @Jordan) y su "script" es en realidad un solo comando, solo debe volver a escribirlo para que esté en una línea:
- echo -e "/n echo ''hi'';/n echo ''bye'';/n"
ya que su escalar no está citado (es decir, comienza con echo
) no necesita hacer nada especial en YAML para las barras invertidas o las comillas.
El resultado de la secuencia de comandos es el mismo (imprimir una línea vacía, imprimir echo ''hi'';
en una línea con sangría de cuatro espacios, imprimir echo ''bye'';
en una línea con sangría de cuatro espacios).
Si desea utilizar la entrada multilínea para facilitar la lectura, su mejor opción es preprocesar la entrada. Recomiendo usar Python y ruamel.yaml (descargo de responsabilidad: yo soy el autor) que le permite conservar características como citas y comentarios mientras lo hace.
Dado este gitlab-ci.in.yml
:
stages:
- ''mystage''
Build:
stage: mystage
# the following is rewritten
script:
- |
echo -e "
echo ''hi'';
echo ''bye'';
"
y el siguiente programa de Python (versión 3):
from pathlib import Path
import ruamel.yaml
def flatten_multi_line(d):
if isinstance(d, list):
for idx, elem in enumerate(d):
if isinstance(elem, (list, dict)):
flatten_multi_line(elem)
elif isinstance(elem, ruamel.yaml.scalarstring.PreservedScalarString):
d[idx] = ruamel.yaml.scalarstring.DoubleQuotedScalarString(elem)
elif isinstance(d, dict):
for key in d:
if isinstance(d[key], (list, dict)):
flatten_multi_line(d[key])
elif isinstance(d[key], ruamel.yaml.scalarstring.PreservedScalarString):
d[key] = ruamel.yaml.scalarstring.DoubleQuotedScalarString(elem)
in_file = Path(''gitlab-ci.in.yml'')
out_file = Path(''gitlab-ci.yml'')
with in_file.open() as fp:
data = ruamel.yaml.round_trip_load(fp, preserve_quotes=True)
flatten_multi_line(data)
with out_file.open(''w'') as fp:
ruamel.yaml.round_trip_dump(data, fp)
da el siguiente gitlab-ci.yml
:
stages:
- ''mystage''
Build:
stage: mystage
# the following is rewritten
script:
- "echo -e /"/n echo ''hi'';/n echo ''bye'';/n/"/n"
(sin el flatten_multi_line()
la cadena multilínea también se conservaría).
Desde el programa, también puede activar el procesamiento del archivo YAML recién generado (por ejemplo, mediante el uso de subprocess.check_output()
, asegúrese de lanzar out_file
usando str()
si lo quiere como un argumento para check_output()
)
Estoy intentando escribir un archivo gitlab-ci.yml
que usa una cadena multilínea para el comando. Sin embargo, parece que no está siendo analizado. He probado tanto el - |
y - >
con resultados idénticos.
stages:
- mystage
Build:
stage: mystage
script:
- |
echo -e "
echo ''hi'';
echo ''bye'';
"
Cuando intenta ejecutarse, solo muestra echo -e ''
como el script a ejecutar, y no toda la cadena multilínea. Esto me causa problemas.
¿Cuál sería la sintaxis correcta para escribir algo como esto?
Puede usar cualquier script / comando multilínea a través de yaml literal_block y la característica de anclajes. Ejemplo:
.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
[...]
Vine aquí con la expectativa de que este sería un problema, pero el siguiente comando de "multilínea" para facilitar la lectura está funcionando para mí:
Gitlab Runner: Shell Runner versión 1.11.0 / versión 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}