ジョブ

パイプラインの設定はジョブから始まります。 ジョブは.gitlab-ci.yml ファイルの最も基本的な要素です。

ジョブは以下のようなものです。

  • どのような条件で実行されるべきかを示す制約とともに定義されます。
  • 任意の名前を持つトップレベル要素で」、少なくともscript 句を含んでいます。
  • 定義できる数に制限はありません。

使用例:

job1:
  script: "execute-script-for-job1"

job2:
  script: "execute-script-for-job2"

上記の例は2つのジョブを別々に実行し、それぞれのジョブが異なるコマンドを実行する、最もシンプルなCI/CDの設定です。 もちろんコマンドは直接コードを実行したり(./configure;make;make install)、リポジトリ内のスクリプトを実行したり(test.sh)することができます。

ジョブはRunnerによってピックアップされ、Runnerの環境で実行されます。重要なのは、それぞれのジョブが互いに独立して実行されることです。

パイプライン内のジョブを確認

パイプラインにアクセスすると、そのパイプラインに関連するジョブが表示されます。

個々のジョブを選択すると、そのジョブのログが表示され、以下のことができます:

  • ジョブをキャンセルする。
  • ジョブが失敗した場合は再試行します。
  • 合格した場合は、ジョブを再実行します。
  • ジョブのログを消去。

プロジェクト内のすべてのジョブを表示

プロジェクト内で実行されたジョブの全リストを表示します:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. Build > ジョブを選択します。

ジョブのステータスでリストをフィルタリングできます。

ジョブが失敗した理由を確認する。

パイプラインが失敗したり、失敗が許されたりした場合、その理由が分かる箇所がいくつかあります。

  • パイプラインの詳細ビューのパイプライングラフ
  • パイプラインウィジェット、マージリクエスト、コミットページ。
  • ジョブビュー(ジョブのグローバルビューと詳細ビュー)。

それぞれの箇所で、失敗したジョブにカーソルを合わせると、失敗した理由を見ることができます。

Pipeline detail

ジョブの詳細ページでも失敗の理由を見ることができます。

パイプライン内でのジョブの順番

パイプライン内のジョブの順番は、パイプライングラフの種類によって異なります。

ジョブのステータスの順序は以下の通りです:

  • 失敗
  • 警告
  • 保留
  • 実行中
  • 手動
  • スケジュール済み
  • キャンセル済み
  • 成功
  • スキップ済み
  • 作成済み

使用例:

Pipeline mini graph sorting

ジョブ名の制限

これらのキーワードをジョブ名として使うことはできません:

  • image
  • services
  • stages
  • types
  • before_script
  • after_script
  • variables
  • cache
  • include
  • true
  • false
  • nil
  • pages:deploy deploy ステージ用に設定されています。

ジョブ名は255文字以下でなければなりません。

ジョブ名は一意にしてください。ファイル内で複数のジョブが同じ名前を持つ場合、パイプラインに追加されるのは1つだけで、どれが選ばれるかを予測するのは困難です。同じジョブ名が1つ以上のインクルードファイルで使用されている場合、パラメータはマージされます。

パイプラインでのグループジョブ

類似したジョブが多いと、パイプライングラフが長くなって読みにくくなります。

似たようなジョブを自動的にグループにまとめることができます。ジョブ名が特定の方法でフォーマットされている場合、通常のパイプライングラフでは1つのグループにまとめられます(ミニグラフではありません)。

パイプラインにグループ化されたジョブがある場合、その中に再試行ボタンやキャンセルボタンが表示されなければ、グループ化されたジョブであることがわかります。その上にマウスカーソルを置くと、グループ化されたジョブの数が表示されます。選択すると展開されます。

Grouped pipelines

ジョブのグループを作成するにはCI/CDパイプライン設定ファイルで、各ジョブ名に以下のどれかで区切った数字を設定します。

  • スラッシュ(/)、例えばslash-test 1/3,slash-test 2/3,slash-test 3/3.
  • コロン (:) 、例えばcolon-test 1:3,colon-test 2:3,colon-test 3:3
  • スペース、例えばspace-test 0 3,space-test 1 3,space-test 2 3

これらの記号は互換性を持って使用できます。

以下の例では、これら3つのジョブはbuild ruby というグループに入っています:

build ruby 1/3:
  stage: build
  script:
    - echo "ruby1"

build ruby 2/3:
  stage: build
  script:
    - echo "ruby2"

build ruby 3/3:
  stage: build
  script:
    - echo "ruby3"

パイプライングラフには、build ruby というグループに3つのジョブが表示されます。

ジョブは左から右へ数字を比較して並べられます。通常、最初の数字をインデックスとし、2番目の数字を合計とします。

この正規表現はジョブ名を評価します:([\b\s:]+((\[.*\])|(\d+[\s:\/\\]+\d+))){1,3}\s*\z.ジョブ名の末尾からのみ、1つ以上の: [...],X Y,X/Y, またはX\Y のシーケンスが削除されます。ジョブ名の先頭または途中で見つかった一致する部分文字列は削除されません。

GitLab 13.8 以前では、正規表現は\d+[\s:\/\\]+\d+\s* です。GitLab 13.11で機能フラグが削除されました。

ジョブを隠す

設定ファイルからジョブを削除せずに、一時的にジョブを無効にします:

  • ジョブの設定をコメントアウトします:

     # hidden_job:
     #   script:
     #     - run test
    
  • ジョブ名をドット(.)で始めると、GitLab CI/CDで処理されません:

     .hidden_job:
       script:
         - run test
    

. で始まる隠しジョブを再利用可能な設定のテンプレートとして使うことができます:

デフォルトキーワードとグローバル変数の継承の制御

の継承を制御できます:

使用例:

default:
  image: 'ruby:2.4'
  before_script:
    - echo Hello World

variables:
  DOMAIN: example.com
  WEBHOOK_URL: https://my-webhook.example.com

rubocop:
  inherit:
    default: false
    variables: false
  script: bundle exec rubocop

rspec:
  inherit:
    default: [image]
    variables: [WEBHOOK_URL]
  script: bundle exec rspec

capybara:
  inherit:
    variables: false
  script: bundle exec capybara

karma:
  inherit:
    default: true
    variables: [DOMAIN]
  script: karma

この例では:

  • rubocop:
    • を継承します:何もありません。
  • rspec:
    • はデフォルトのimageWEBHOOK_URL 変数を継承します。
    • 継承しません: デフォルトのbefore_scriptDOMAIN 変数。
  • capybara:
    • inherits: デフォルトのbefore_scriptimage
    • を継承しません:DOMAINWEBHOOK_URL 変数。
  • karma:
    • デフォルトのimagebefore_script 、およびDOMAIN 変数を継承します。
    • を継承しません:WEBHOOK_URL 変数。

手動ジョブ実行時の変数の指定

GitLab 12.2で導入されました

手動ジョブを実行する際には、ジョブ固有の変数を追加で指定できます。

追加変数で実行したい手動ジョブのジョブページからこれを行うことができます。このページにアクセスするには、再生({play})ボタンではなく、パイプラインビューで手動ジョブの名前を選択します。

CI/CD 変数を使用するジョブの実行を変更したい場合、ここで CI/CD 変数を定義します。

CI/CD設定または.gitlab-ci.yml ファイルですでに定義されている変数を追加した場合、変数は新しい値で上書きされます。このプロセスで上書きされた変数はすべて展開され、マスクされません。

Manual job variables

ジョブを遅延させる

ジョブをすぐに実行したくない場合、when:delayed キーワードを使用すると、ジョブの実行を一定期間遅らせることができます。

これは新しいコードが徐々にロールアウトされていくような、時間指定したインクリメンタルロールアウトで特に有用です。

例えば、新しいコードのロールアウトを開始したとします。

  • ユーザーにトラブルを感じさせず、GitLabは0%から100%まで自動的にデプロイを完了させることができます。
  • 新しいコードでトラブルが発生した場合は、パイプラインをキャンセルすることでローリングが最後の安定版に戻り、時間指定したインクリメンタルロールアウトを停止できます。

Pipelines example

ジョブログセクションの展開と折りたたみ

GitLab 12.0から導入されました

ジョブログは折りたたんだり広げたりできるセクションに分かれています。それぞれのセクションには期間が表示されます。

以下の例をご覧ください:

  • 3つのセクションは折りたたまれており、展開することができます。
  • 3つのセクションが展開され、折りたためます。

Collapsible sections

折りたたみ可能セクションのカスタマイズ

GitLab 12.0から導入されました

GitLab がどのセクションを折りたたむかを決定するために使用する特別なコードを手動で出力することで、ジョブログに折りたたみ可能なセクションを作成することができます:

  • セクション開始マーカー \e[0Ksection_start:UNIX_TIMESTAMP:SECTION_NAME\r\e[0K +TEXT_OF_SECTION_HEADER
  • セクション終了マーカー\e[0Ksection_end:UNIX_TIMESTAMP:SECTION_NAME\r\e[0K

CI設定のスクリプトセクションにこれらのコードを追加する必要があります。例えば、echo

job1:
  script:
    - echo -e "\e[0Ksection_start:`date +%s`:my_first_section\r\e[0KHeader of the 1st collapsible section"
    - echo 'this line should be hidden when collapsed'
    - echo -e "\e[0Ksection_end:`date +%s`:my_first_section\r\e[0K"

Runnerが使用しているShellによっては、例えばZshを使用している場合、\\e\\r のように特殊文字をエスケープする必要があるかもしれません。

上記の例では、以下の項目を出力します。

  • date +%s:Unixタイムスタンプ(例:1560896352 )。
  • my_first_section:セクションの名前。
  • \r\e[0K:セクションマーカーはレンダリングされた (色付きの) ジョブログには表示されませんが、生のジョブログには表示されます。表示するには、ジョブログの右上隅で、Show complete raw({doc-text})を選択してください。
    • \r: キャリッジリターン。
    • \e[0K: クリアライン ANSI エスケープシーケンス (\e[K は機能しません。0 を含める必要があります)。

ジョブログの生データサンプルを、以下に示します。

\e[0Ksection_start:1560896352:my_first_section\r\e[0KHeader of the 1st collapsible section
this line should be hidden when collapsed
\e[0Ksection_end:1560896353:my_first_section\r\e[0K

崩壊前のセクション

GitLab 13.5 で導入されました

collapsed オプションをセクションの先頭に追加することで、折りたたみ可能なセクションを自動的に折りたたむことができます。セクション名の後、\r の前に[collapsed=true] を追加します。 セクション終了マーカーは変更されません:

  • セクション開始マーカー[collapsed=true]\e[0Ksection_start:UNIX_TIMESTAMP:SECTION_NAME[collapsed=true]\r\e[0K +TEXT_OF_SECTION_HEADER
  • セクション終了マーカー\e[0Ksection_end:UNIX_TIMESTAMP:SECTION_NAME\r\e[0K

更新されたセクション開始テキストをCI設定に追加します。例えば、echo

job1:
  script:
    - echo -e "\e[0Ksection_start:`date +%s`:my_first_section[collapsed=true]\r\e[0KHeader of the 1st collapsible section"
    - echo 'this line should be hidden automatically after loading the job log'
    - echo -e "\e[0Ksection_end:`date +%s`:my_first_section\r\e[0K"

デプロイジョブ

デプロイジョブは環境にコードをデプロイするという点で、特定の種類のCIジョブです。デプロイジョブとは、environment キーワードとstart 環境actionを使用するジョブのことです。デプロイジョブはdeploy ステージである必要はありません。次のdeploy me ジョブはデプロイジョブの例です。action: start はデフォルトの動作で、この例のために定義されていますが、省略することもできます:

deploy me:
  script:
    - deploy-to-cats.sh
  environment:
    name: production
    url: https://cats.example.com
    action: start

デプロイジョブの動作は、古いデプロイジョブを防止したり、一度に 1 つのデプロイジョブしか実行しないようにするなど、デプロイの安全設定で制御できます。