Многострочная строка YAML для GitLab CI (.gitlab-ci.yml)

Я пытаюсь написать файл gitlab-ci.yml, который использует многострочную строку для этой команды. Однако кажется, что он не анализируется. Я пробовал как теги - |, так и - > с одинаковыми результатами.

stages:
  - mystage

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

Когда он пытается выполнить, он показывает только echo -e ' как script, а не всю многострочную строку. Это вызывает проблемы для меня.

Каким будет правильный синтаксис, чтобы написать что-то вроде этого?

Ответ 1

TL; DR; Вы хотите использовать многострочный скаляр YAML (для удобства чтения), который загружается в виде однострочной строки, которая может быть выдана как команда Gitlab-CI. Для этого используйте простой (без кавычек) скаляр в YAML, который разбит на несколько строк:

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

Имейте в виду, что YAML накладывает ограничения на такие скаляры. Что вам, безусловно, нужно знать, так это то, что каждая следующая строка имеет отступ по крайней мере на одну позицию больше, чем echo -e (который имеет две позиции относительно его узла сбора, который вообще не имеет отступа), и что каждая новая строка заменяется при загрузке на пробел (поэтому вам нужно немного позаботиться о том, где ставить переносы).


В вашем сообщении есть несколько заблуждений, из-за которых вы задаете неправильный вопрос.

Нет такой вещи как многострочная строка YAML. В YAML есть скаляры, и некоторые из этих скаляров могут быть загружены программой в виде строк, а некоторые другие будут загружены как целые числа, числа с плавающей запятой и т.д.

Вы, очевидно, заинтересованы в скалярных узлах, которые загружаются в виде строки, поскольку эту строку можно интерпретировать как командную строку. Но вы не хотите использовать многострочную командную строку (т.е. со встроенными символами новой строки), поскольку многострочные сценарии не поддерживаются в Gitlab CI (как указано @Jordan).

Для удобства чтения вы хотите использовать стандартную возможность YAML для загрузки многострочных скаляров в виде однострочной строки.

Если вас не волнует читабельность, вы можете использовать:

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

и так как ваш скаляр не указан в кавычках (то есть начинается с echo), вам не нужно делать ничего особенного в YAML для обратной косой черты или кавычек.

Результат сценария такой же (выведите пустую строку, выведите echo 'hi'; на строке с отступом в четыре пробела, выведите echo 'bye'; на строке с отступом в четыре пробела.)

Если вы хотите использовать многострочный ввод для удобочитаемости, который загружается как одна строка, по сути, есть два варианта: использовать скаляр с несколькими строками или сложить скаляр в YAML.

многострочный простой скаляр

Обычный означает, что скаляр не заключен в кавычки, и, как и любая многострочная вещь в многострочном YAML, означает, что следующие строки должны быть соответствующим образом смещены, в этом случае дальше исходной строки

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

переводы строк заменяются пробелами, поэтому не делайте:

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

так как вы получите видимое пространство до bye.

Существуют некоторые ограничения, такие как то, что в таком скаляре не должно быть двоеточия, за которым следует пробел (из-за чего он будет выглядеть как пара ключ-значение).

В простых скалярах не требуется экранировать обратную косую черту, поскольку вы не можете экранировать символы в простом скаляре, но, конечно, вы можете включить обратную косую черту, которая в конечном итоге окажется в строке, загруженной из YAML, и может имеют значение для команды, выполняемой из этой строки.

сложенный скаляр

Сложенный скаляр подобен простому скаляру в том, что все (одиночные) символы новой строки заменяются пробелом во время загрузки:

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

Вам нужно сделать отступ от фактической информации о команде, по крайней мере, столько же, сколько от сложенного скалярного индикатора (>).

В отличие от простых скаляров, такие вещи, как :, не имеют особого значения. Таким образом, если простые скаляры завершатся неудачно из-за ошибки YAML, схожие скалярные скаляры, скорее всего, не сработают.

Ответ 2

Я пришел сюда превентивно, ожидая, что это будет проблемой, но следующая "многострочная" команда для удобства чтения работает для меня:

Gitlab Runner: версия Shell Runner 1.11.0/версия 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}

Ответ 3

Вы можете использовать любые многострочные скрипты/команды с помощью функции yaml literal_block и anchors. Пример:

.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
[...]

Ответ 4

Команда wp config create была довольно привередливой... из .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

Ответ 5

Это работает для меня в 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

Здесь две переменные env (${GITHUB_USERNAME} и ${GITHUB_PASSWORD}) также будут интерполированы