GitLab CI的多行YAML字符串(.gitlab-ci.yml)

sam*_*ime 56 yaml gitlab-ci gitlab-ci-runner

我正在尝试编写一个gitlab-ci.yml使用多行字符串作为命令的文件.但是,它似乎没有被解析.我都试过了- |,并- >用相同的结果.

stages:
  - mystage

Build:
  stage: mystage
  script:
    - |
        echo -e "
            echo 'hi';
            echo 'bye';
        "
Run Code Online (Sandbox Code Playgroud)

当它尝试运行时,它只显示echo -e '要运行的脚本,而不是整个多行字符串.这给我带来了问题.

写这样的东西的正确语法是什么?

Pot*_*mer 77

我来到这里是先发制人地期待这将是一个问题,但以下"多行"命令的可读性对我有用:

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}
Run Code Online (Sandbox Code Playgroud)

  • @ victor-grazi据我所知:在普通的YAML(纯流标量)中,转义符(例如换行符\ n)不执行任何操作,并且忽略了开头的空格-似乎Gitlab YAML在此解析了脚本块时尚。关于缩进:YAML规范说:“在YAML块样式中,结构由缩进确定”,因此第二行的缩进量与YAML规范要求的缩进相同(相对于父缩进一个空格),为可读性又增加了一行(从技术上讲,这是多余但更漂亮)。 (4认同)
  • 这里有什么诀窍?您是否将第二行缩进到与第一行相同的级别? (3认同)

Ben*_*y K 22

您可以通过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
[...]
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的例子,但是如果您定义.rsync,它将更加清楚 (4认同)

Ant*_*hon 19

由于这个问题似乎与Gitlab CI不支持的多行脚本有关(如@Jordan所示)并且你的"脚本"实际上只是一个命令,你应该只将它重写为一行:

script:
- echo -e 
   "echo 'hi';
    echo 'bye';"
Run Code Online (Sandbox Code Playgroud)

因为你的标量没有被引用(即它以它开头echo -e)你不需要在YAML中做任何特殊的反斜杠或引号.

脚本的结果是相同的(打印一个空行,echo在一行上打印缩进四个空格,echo 'hi';在一行上打印缩进四个空格.)

如果要使用多行输入以提高可读性,最佳选择是预处理输入.我建议使用Python和ruamel.yaml(免责声明:我是作者),它允许您在执行此操作时保留引号和注释等功能.

鉴于此echo 'bye';:

- echo -e "\n    echo 'hi';\n    echo 'bye';\n"
Run Code Online (Sandbox Code Playgroud)

和以下Python(版本3)程序:

script:
- echo -e 
   "echo 'hi';
    echo 'bye';"
Run Code Online (Sandbox Code Playgroud)

给出以下内容bye:

script:
- echo -e 
   "echo 'hi';
    echo '
   bye';"
Run Code Online (Sandbox Code Playgroud)

(不会>保留多行字符串).

从程序中你还可以触发新生成的YAML文件的处理(例如,使用:,如果你想将它作为参数,请确保echo -e使用)echoecho 'hi';

  • **哦,天哪。** 虽然从技术上讲是正确的,但这个答案却冗长得可笑,以至于难以阅读。每个不编写 YAML 解析器的人可能只是想要 [PotatoFarmer](/sf/users/535519281/) 的 [高度赞成和 *很多* 简洁的答案](https://stackoverflow.com/a/ 42705098/2809027),改为。 (4认同)
  • @CecilCurry 就我个人而言,我更喜欢这个(Anthon)的答案。它解释了原因,这有助于我理解我所做的事情,并帮助我避免货物崇拜编程的陷阱。YMMV ;)谢谢安东! (3认同)

小智 8

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
Run Code Online (Sandbox Code Playgroud)


Mak*_*min 6

这在 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
Run Code Online (Sandbox Code Playgroud)

这里两个环境变量(${GITHUB_USERNAME}${GITHUB_PASSWORD})也将被插值