正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

スクリプトとジョブログ

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

scriptセクションでは、特別な構文を使用して以下を実行できます。

scriptで特殊文字を使用する

scriptコマンドは、一重引用符または二重引用符で囲む必要がある場合があります。たとえば、コロン(:)を含むコマンドは、一重引用符(')で囲む必要があります。YAMLパーサーでは、テキストを「キー: 値」のペアではなく、文字列として解釈する必要があります。

たとえば、以下のスクリプトではコロンを使用しています。

job:
  script:
    - curl --request POST --header 'Content-Type: application/json' "https://gitlab.example.com/api/v4/projects"

有効なYAMLとして認識されるようにするには、コマンド全体を一重引用符で囲む必要があります。コマンドですでに一重引用符を使用している場合、可能であれば二重引用符(")に変更する必要があります。

job:
  script:
    - 'curl --request POST --header "Content-Type: application/json" "https://gitlab.example.com/api/v4/projects"'

CI Lintツールを使用して、構文が有効であることを確認できます。

次の文字を使用する場合も注意してください。

  • {}[],&*#?|-<>=!%@`

ゼロ以外の終了コードを無視する

スクリプトコマンドがゼロ以外の終了コードを返すと、ジョブは失敗し、それ以降のコマンドは実行されません。

この動作を回避するには、終了コードを変数に格納します。

job:
  script:
    - exit_code=0
    - false || exit_code=$?
    - if [ $exit_code -ne 0 ]; then echo "Previous command failed"; fi;

すべてのジョブに対してデフォルトのbefore_scriptまたはafter_scriptを設定する

before_scriptおよびafter_scriptを、defaultとともに使用できます。

  • before_scriptdefaultとともに使用して、すべてのジョブでscriptコマンドの前に実行されるコマンドのデフォルトの配列を定義します。
  • after_scriptをdefaultとともに使用して、ジョブの完了またはキャンセル後に実行されるコマンドのデフォルトの配列を定義します。

ジョブ内で別の値を定義し、デフォルトを上書きすることができます。デフォルトを無視するには、before_script: []またはafter_script: []を使用します。

default:
  before_script:
    - echo "Execute this `before_script` in all jobs by default."
  after_script:
    - echo "Execute this `after_script` in all jobs by default."

job1:
  script:
    - echo "These script commands execute after the default `before_script`,"
    - echo "and before the default `after_script`."

job2:
  before_script:
    - echo "Execute this script instead of the default `before_script`."
  script:
    - echo "This script executes after the job's `before_script`,"
    - echo "but the job does not use the default `after_script`."
  after_script: []

ジョブがキャンセルされた場合にafter_scriptコマンドをスキップする

before_scriptまたはscriptセクションの実行中にジョブがキャンセルされた場合、after_scriptコマンドが実行されます。

UIでのジョブのステータスは、after_scriptの実行中はcancelingとなり、after_scriptコマンドが完了するとcanceledに変わります。after_scriptコマンドの実行中、定義済み変数$CI_JOB_STATUSの値はcanceledになります。

ジョブのキャンセル後にafter_scriptコマンドが実行されないようにするには、after_scriptセクションを次のように設定します。

  1. after_scriptセクションの冒頭で、定義済み変数$CI_JOB_STATUSを確認します。
  2. 値がcanceledの場合は、実行をすぐに終了します。

次に例を示します。

job1:
  script:
    - my-script.sh
  after_script:
    - if [ "$CI_JOB_STATUS" == "canceled" ]; then exit 0; fi
    - my-after-script.sh

長いコマンドを分割する

|(リテラル)および>(折りたたみ)YAML複数行ブロックスカラーインジケーターを使用して、長いコマンドを複数行のコマンドに分割し、読みやすさを向上させることができます。

複数のコマンドが1つのコマンド文字列に結合されている場合、最後のコマンドの失敗または成功のみが報告されます。バグにより、以前のコマンドからのエラーは無視されます。これを回避するには、各コマンドを個別のscript項目として実行するか、各コマンド文字列にexit 1コマンドを追加します。

|(リテラル)YAML複数行ブロックスカラーインジケーターを使用して、ジョブ記述のscriptセクションで複数行にわたってコマンドを記述できます。各行は個別のコマンドとして処理されます。ジョブログでは最初のコマンドのみが繰り返されますが、追加のコマンドも引き続き実行されます。

job:
  script:
    - |
      echo "First command line."
      echo "Second command line."
      echo "Third command line."

前述の例は、ジョブログでは次のように表示されます。

$ echo First command line # collapsed multiline command
First command line
Second command line.
Third command line.

>(折りたたみ)YAML複数行ブロックスカラーインジケーターは、セクション間の空行を新しいコマンドの開始として処理します。

job:
  script:
    - >
      echo "First command line
      is split over two lines."

      echo "Second command line."

これは、>または|ブロックスカラーインジケーターを使用しない複数行コマンドと同様に動作します。

job:
  script:
    - echo "First command line
      is split over two lines."

      echo "Second command line."

前述の2つの例は、ジョブログでは次のように表示されます。

$ echo First command line is split over two lines. # collapsed multiline command
First command line is split over two lines.
Second command line.

>または|ブロックスカラーインジケーターを省略すると、GitLabは空行以外の行を連結してコマンドを形成します。行を連結したときに問題なく実行できることを確認してください。

Shellのヒアドキュメントは、|および>演算子でも機能します。次の例では、小文字を大文字に変換します。

job:
  script:
    - |
      tr a-z A-Z << END_TEXT
        one two three
        four five six
      END_TEXT

結果:

$ tr a-z A-Z << END_TEXT # collapsed multiline command
  ONE TWO THREE
  FOUR FIVE SIX

スクリプト出力にカラーコードを追加する

スクリプト出力は、ANSIエスケープコードを使用するか、ANSIエスケープコードを出力するコマンドまたはプログラムを実行することで色付けされます。

たとえば、Bashでカラーコードを使用する場合:

job:
  script:
    - echo -e "\e[31mThis text is red,\e[0m but this text isn't\e[31m however this text is red again."

カラーコードは、Shell環境変数、またはCI/CD変数で定義できます。これにより、コマンドが読みやすく、再利用可能になります。

たとえば、前述の例と、before_scriptに定義された環境変数を組み合わせた場合:

job:
  before_script:
    - TXT_RED="\e[31m" && TXT_CLEAR="\e[0m"
  script:
    - echo -e "${TXT_RED}This text is red,${TXT_CLEAR} but this part isn't${TXT_RED} however this part is again."
    - echo "This text is not colored"

または、PowerShellカラーコードを使用する場合:

job:
  before_script:
    - $esc="$([char]27)"; $TXT_RED="$esc[31m"; $TXT_CLEAR="$esc[0m"
  script:
    - Write-Host $TXT_RED"This text is red,"$TXT_CLEAR" but this text isn't"$TXT_RED" however this text is red again."
    - Write-Host "This text is not colored"