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

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

stages:
- mystage


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

When it tries to run, it only shows echo -e ' as the script to run, and not the whole multiline string. This causes issues for me.

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

117619 次浏览

您希望使用多行 YAML 标量(为了可读性) ,该标量作为单行字符串加载,可以由 Gitlab-CI 发出命令。为此,在 YAML 中使用一个分散在多行中的普通标量(不带引号) :

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

Please be aware that there are some restrictions imposed by YAML on such scalars. What you certainly need to know is that each following line is indented at least one more position than echo -e (which is indented two positions relative to its collection node, which is not indented at all), and that every new-line is replaced by a space when loaded (so you need to take a bit care of where to put newlines).


在你的文章中有许多误解,导致你提出了错误的问题。

There is no such thing as a multi-line YAML string. YAML has scalars and some of these scalars can be loaded by a program as strings, while some others will be loaded as integers, floats, etc.

您显然对作为字符串加载的标量节点感兴趣,因为这个字符串可以被解释为命令行。但是您不希望使用多行命令行(即嵌入了换行符) ,因为 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 错误而失败,那么类似的折叠标量很可能不会失败。

我来到这里,预先想到这将是一个问题,但以下“多行”命令的可读性是为我工作:

Gitlab Runner: Shell Runner version 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$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
[...]

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

这是我在特拉维斯线人的工作

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})

这种格式将工作。使用一个普通的(没有引号)标量在 YAML。例如脚本用于初始化地形后端

  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"