web-dev-qa-db-ja.com

GitLab CIの複数行YAML文字列(.gitlab-ci.yml)

コマンドに複数行の文字列を使用するgitlab-ci.ymlファイルを作成しようとしています。ただし、解析されていないようです。 - |- >の両方を試してみましたが、結果は同じです。

stages:
  - mystage

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

実行しようとすると、実行するスクリプトとしてecho -e 'のみが表示され、複数行の文字列全体は表示されません。これは私にとって問題を引き起こします。

このようなものを書くための正しい構文は何でしょうか?

49
samanime

TL; DR; Gitlab-CIがコマンドとして発行できる単一行の文字列として読み込まれる複数行のYAMLスカラー(読みやすくするため)を使用する場合。これを行うには、YAMLでプレーンな(引用符なしの)スカラーを使用して、複数の行に展開します。

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

そのようなスカラーにはYAMLによって課せられるいくつかの制限があることに注意してください。必ず知っておく必要があるのは、後続の各行がecho -e(インデントされていないコレクションノードに対して2つの位置にインデントされている)より少なくとも1つ多くインデントされていること、およびすべての改行ロード時にスペースに置き換えられます(そのため、改行を配置する場所に少し注意する必要があります)。


投稿には複数の誤解があり、間違った質問をすることにつながります。

複数行のYAML文字列のようなものはありません。 YAMLにはスカラーがあり、これらのスカラーの一部はプログラムによって文字列としてロードできますが、他の一部のスカラーは整数、浮動小数点などとしてロードされます。

文字列をコマンドラインとして解釈できるため、文字列としてロードされるスカラーノードに明らかに興味があります。ただし、 複数行スクリプト はGitlab CIでサポートされていないため(@Jordanが示したように)、複数行のコマンドライン(つまり、改行が埋め込まれている)は必要ありません。

読みやすくするために、YAMLの標準機能を使用して、複数行のスカラーを単一行の文字列としてロードします。

読みやすさを気にしない場合は、次を使用できます。

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

また、スカラーは引用符で囲まれていない(つまり、echoで始まる)ため、バックスラッシュまたは引用符に対してYAMLで特別なことをする必要はありません。

スクリプトの結果は同じです(空行を印刷し、4つのスペースをインデントした行にecho 'hi';を印刷し、4つのスペースをインデントした行にecho 'bye';を印刷します。)

読みやすくするために単一行として読み込まれる複数行入力を使用する場合、基本的に2つのオプションがあります。複数行プレーンスカラーを使用するか、YAMLで折り畳まれたスカラーを使用します。

複数行のプレーンスカラー

Plainはスカラーが引用符で囲まれていないことを意味し、YAMLの複数行のものと同様に、複数行は後続の行を適切にインデントする必要があることを意味します。この場合、最初の行よりもさらに

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

改行はスペースに置き換えられるため、実行しないでください。

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

byeの前にスペースが表示されます。

そのようなスカラー内にスペースが続くコロンを使用できないなど、いくつかの制限があります(これにより、キーと値のペアのようになります)。

プレーンスカラーの文字をエスケープすることはできないため、プレーンスカラーのバックスラッシュをエスケープする必要はありませんが、もちろん、バックスラッシュを含めることができます。バックスラッシュは、YAMLからロードされた文字列になり、canは、その文字列から実行されるコマンドに意味があります。

折り畳まれたスカラー

折り畳まれたスカラーは、ロード中にすべての(単一の)改行がスペースに置き換えられるという点で、プレーンスカラーに似ています。

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

実際のコマンド情報は、少なくとも折りたたみスカラーインジケーター(>)と同じくらいインデントする必要があります。

:のような単純なスカラーに反して、特別な意味はありません。したがって、プレーンスカラーがYAMLエラーをスローして失敗した場合、同様のフォールドスカラーはほとんど失敗しません。

16
Anthon

これが問題になると先手を打ってここに来ましたが、次の読みやすさの「複数行」コマンドが機能しています。

Gitlab Runner: Shell Runnerバージョン1.11.0/Gitlab Runner: 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}
69
PotatoFarmer

Yaml literal_blockおよびアンカー機能を介して、複数行のスクリプト/コマンドを使用できます。例:

.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
[...]
20
Benny K

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
7
mal

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

ここでは、2つのenv変数(${GITHUB_USERNAME}および${GITHUB_PASSWORD})も補間されます

1