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

GitLab CI的多行YAML字符串(.GitLab CI.yml),yaml,gitlab-ci,gitlab-ci-runner,Yaml,Gitlab Ci,Gitlab Ci Runner,我正在尝试编写一个gitlab ci.yml文件,该文件使用多行字符串作为命令。但是,它似乎没有被解析。我尝试了-|和->,结果相同 stages: - mystage Build: stage: mystage script: - | echo -e " echo 'hi'; echo 'bye'; " 当它试图运行时,它只显示echo-e'作为要运行的脚本,而不是整个多行字符串。这给我带来

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

stages:
  - mystage

Build:
  stage: mystage
  script:
    - |
        echo -e "
            echo 'hi';
            echo 'bye';
        "
当它试图运行时,它只显示
echo-e'
作为要运行的脚本,而不是整个多行字符串。这给我带来了很多问题


写这样的东西正确的语法是什么;博士您希望使用多行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中不需要对反斜杠或引号做任何特殊的处理

脚本的结果是相同的(打印空行,打印缩进四个空格的行,打印缩进四个空格的行,打印缩进四个空格的行。)

如果要使用多行输入以提高可读性(作为单行加载),基本上有两个选项:在YAML中使用多行平面标量或使用折叠标量

多行纯标量 Plain表示标量不带引号,与YAML中的任何多行内容一样,多行表示后续行需要适当缩进,在这种情况下,缩进比初始行更远

script:
- echo -e 
   "echo 'hi';
    echo 'bye';"
换行符替换为空格,因此不要执行以下操作:

script:
- echo -e 
   "echo 'hi';
    echo '
   bye';"
因为您将在再见之前获得一个可见的空格

有一些限制,比如在这样的标量中不能有冒号后跟空格(这会使它看起来像键值对)

无需在纯标量中转义反斜杠,因为不能在纯标量中转义任何字符,但当然可以包含反斜杠,它将最终出现在从YAML加载的字符串中,可以对从该字符串执行的命令有意义

折叠标量 折叠标量与普通标量类似,因为在加载过程中,所有(单个)换行符都被空格替换:

script:
- >
  echo -e 
  "echo 'hi';
  echo 'bye';"
您需要缩进实际的命令信息,缩进量至少与折叠的标量指示符缩进量相同(


与普通标量相反,像
这样的东西没有特殊意义。因此,如果普通标量因抛出YAML错误而失败,那么类似的折叠标量很可能不会。我来到这里,先发制人地期望这会是一个问题,但以下关于可读性的“多行”命令对我有效:

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}

您可以通过yaml文字块和锚定功能使用任何多行脚本/命令。例如:

.build: &build |
    echo -e "\n$hlThe wp config create command was pretty finicky... from the .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
.build:&build|

echo-e“\n$hlwp config create命令非常挑剔…来自.gitlab ci

  before_script:
    - cd ${TF_ROOT}
    - terraform init -backend-config="address=${GITLAB_TF_ADDRESS}"
      -backend-config="lock_address=${GITLAB_TF_ADDRESS}/lock"
      -backend-config="unlock_address=${GITLAB_TF_ADDRESS}/lock"
      -backend-config="username=${GITLAB_USER_LOGIN}" -backend-config="password=${GITLAB_ACCESS_TOKEN}"
      -backend-config="lock_method=POST" -backend-config="unlock_method=DELETE"
      -backend-config="retry_wait_min=5"
构建:
阶段:建造
脚本:
-echo“构建应用程序”
- |

wp config create--dbname=$vardb--dbhost=$varhost--dbuser=$varusr--dbpass=$varpas--extra php这在Travis CI中对我有用

安装前:
-set-e
- |
回声“
github
${GITHUB\u USERNAME}
${GITHUB\u密码}
“>${HOME}/.m2/settings.xml

这里还将插入两个env变量(
${GITHUB\u USERNAME}
${GITHUB\u PASSWORD}
),此格式将起作用。在YAML中使用普通(不带引号)标量。例如用于初始化terraform后端的脚本


这有一个问题:我不清楚问题是什么,因为您的代码应该是等效的(足够)YAML到那里提出的解决方案。你可以尝试在你的行中添加
\
,但我不能说这是否有效。为了清晰和可维护性,我想多行编写它。虽然我的示例很琐碎,但真正的脚本肯定不是。我可以理解。在GitLab CI正在处理它?我已经考虑过了。这是一个额外的步骤,增加了一点复杂性,但可能是值得的。我添加了一个可能的解决方案。哦,天哪。虽然技术上是正确的,但这个答案是可笑的冗长到了无法理解的地步。每个不编写YAML解析器的人可能只是想要的。谢谢你分享-t他的更高级的功能对于作业的可读性/能够在整个配方中重用代码块特别有用。这是一个很好的示例,但是如果您定义.rsync,它会更清晰。这里有什么诀窍?您是否将第二行缩进到同一行