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

时间:2017-03-02 15:57:05

标签: yaml gitlab-ci gitlab-ci-runner

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

stages:
  - mystage

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

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

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

6 个答案:

答案 0 :(得分:63)

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

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}

答案 1 :(得分:19)

您可以通过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
[...]

答案 2 :(得分:10)

TL; DR;您希望使用多行YAML标量(为了便于阅读),该标量作为单行字符串加载,可以作为Gitlab-CI的命令发出。为此,请使用YAML中的普通(无引号)标量,该标量分布在多行中:

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

请注意,YAML对此类标量施加了一些限制。您当然需要知道的是,每个跟随行的位置至少比echo -e缩进了一个位置(相对于其集合节点缩进了两个位置,根本没有缩进),并且每个新行都是在加载时被空格替换(所以你需要稍微关注换行的位置)。

您的帖子中存在多种误解,导致您提出错误的问题。

没有多行YAML字符串。 YAML有标量,其中一些标量可以由程序作为字符串加载,而其他一些可以作为整数,浮点数等加载。

您显然对作为字符串加载的标量节点感兴趣,因为该字符串可以被解释为命令行。但是你不想拥有多行命令行(即嵌入换行符),因为Gitlab CI不支持multi-line scripts(如@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错误而失败,则类似的折叠标量很可能不会。

答案 3 :(得分:3)

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

答案 4 :(得分:0)

这在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

这里也会插入两个环境变量(${GITHUB_USERNAME}${GITHUB_PASSWORD}

答案 5 :(得分:0)

此格式将起作用。在YAML中使用普通(无引号)标量。例如用于初始化Terraform后端的脚本

SELECT * FROM `youtubeData` WHERE date = MAX(date);