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


83

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

stages:
  - mystage

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

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

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


これには問題があります:gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/166コードそこで提案されたソリューションと(十分な)YAMLである必要があるため、問題が何であるかは私にはわかりません。\行に追加してみるかもしれませんが、それがうまくいくかどうかはわかりません。
ジョーダンランニング

回答:


35

TL; DR; Gitlab-CIによってコマンドとして発行できる単一行の文字列としてロードされる複数行のYAMLスカラー(読みやすさのため)を使用する必要があります。これを行うには、複数行に分散されたYAMLのプレーン(引用符なし)スカラーを使用します。

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

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


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

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

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

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

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

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

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

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

読みやすくするために複数行の入力を使用する場合は、1行として読み込まれ、基本的に2つのオプションがあります。複数行の平面スカラーを使用するか、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エラーをスローして失敗した場合、同様の折りたたまれたスカラーは失敗しない可能性があります。


わかりやすく、保守しやすいように、複数行で書きたいと思います。私の例は些細なことですが、実際のスクリプトは明らかにそうではありません。
samanime 2017年

理解できます。読み取り可能なYAMLファイルをGitLabCIで処理する前に前処理してもかまいませんか?
Anthon 2017年

私はそれを考慮しました。これは余分な手順であり、少し複雑になりますが、それだけの価値があるかもしれません。
samanime 2017年

考えられる解決策を追加しました。
Anthon 2017年

3
ああ少年。技術的には正しいですが、この答えは、読みにくいという点でばかげて冗長です。YAMLパーサーを作成していない人は、おそらくPotatoFarmer非常に賛成で、より簡潔な回答を望んでいます
セシルカレー

111

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

Gitlabランナー:ShellRunnerバージョン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}

2
ここでのトリックは何ですか?2行目を1行目と同じレベルにインデントしましたか?
ビクターグラジ

6
@ victor-grazi私が理解しているように:プレーンYAML(プレーンフロースカラー)では、エスケープ(改行など\n)は何もせず、先頭の空白は無視されます-GitlabYAMLはこの方法でスクリプトブロックを解析しているようです。インデントについて:YAML仕様によるIn YAML block styles, structure is determined by indentationと、2行目はYAML仕様に必要なだけインデントされ(親インデントに対して1スペース)、読みやすさのためにもう1行(技術的には不要ですがきれいです)です。
PotatoFarmer

チャームのように機能します。また、新しい行のすべてののparamsで動作します
bodolsog

25

yamlliteral_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
[...]

共有していただきありがとうございます-このより高度な機能は、ジョブの読みやすさ/レシピ全体でコードチャンクを再利用できるようにするために特に役立ちます。
PotatoFarmer 2017

5
これは偉大な例ですが、あなたが.rsync定義した場合、それは明確だろう
ビクターGrazi

13

wp configcreateコマンドはかなり厄介でした.... 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

これはTravisCIで私のために働いています

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つの環境変数(${GITHUB_USERNAME}および${GITHUB_PASSWORD})も補間されます


0

この形式は機能します。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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.