yml tutorial example yaml gitlab-ci gitlab-ci-runner

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}