TECHSTEP

ITインフラ関連の記事を公開してます。

GitLab extendsキーワードでJobを再利用する

今回はGitLabの extends というキーワードを使ってみました。

docs.gitlab.com

背景

GitLab CIはJobを再利用する方法として複数の手法を提供しており、 extends はそのひとつです。

Jobを再利用する方法は、大きく3種類あります (include等も含めるともっとあると思います) が、現在は extends の利用が推奨されているようです。

  • YAML Anchor: YAMLアンカー (&) を使うことで、特定のJobの設定や処理を他のJobに利用できます (ドキュメント) 。
  • !reference: YAMLアンカーと異なり include で呼び出した設定を対象にすることができます (ドキュメント) 。
  • extends: 上述の2つと同様の機能を提供します。

また extends 等と組み合わせるJobは、通常のJobに加えてHidden Jobというものも利用できます。これはJob名の先頭に . をつけることでそのJobを起動しないようにしたものですが、これと extends を組み合わせることでJobの設定の再利用が可能です。

検証

Hidden Jobの動き

まずは extends の前にHidden Jobの動きを見ておきます。以下のような .gitlab-ci.yml を用意してPipelineを起動してみます。

test-job-not-hide:
  script:
    - echo "This job will be executed."

.test-job-hide:
  script:
    - echo "This job is hidden."

Pipelineを起動した結果、 .test-job-hide のほうは実行されないことを確認できます。

extendsによるJobの再利用

次に extends を使ってみます。ここでは以下のように test-job-from-hide-job というJobから .test-job-hide の設定を extends で呼び出します。

test-job-not-hide:
  script:
    - echo "This job will be executed."

.test-job-hide:
  script:
    - echo "This job is hidden."

test-job-from-hide-job:
  extends: .test-job-hide

上記設定でPipelineを実行したところ、 extends で呼び出したJobの内容が実行されるのを確認できます。

また extends の設定は、呼び出したJobの設定で上書きできます。今度は以下のように extends で呼び出すJobのscriptを上書きした場合を見ます。

test-job-not-hide:
  script:
    - echo "This job will be executed."

.test-job-hide:
  script:
    - echo "This job is hidden."

test-job-from-hide-job:
  extends: .test-job-hide

test-job-overwrite:
  extends: .test-job-hide
  script: # Hide Jobの内容を上書きする
    - echo "This job will overwrite hide job setting."

上記設定でPipelineを実行した結果、上書きしたscriptの内容が実行されることを確認できます。

なお、 extends はhideでない通常のJobも指定できます。その場合は呼び出し先のJobも実行されます。

includeとextendsの組み合わせ

最後に include キーワードと組み合わせた場合を見てみます。

※参考:

techstep.hatenablog.com

ここでは以下のような test.yml を用意し、 .gitlab-ci.yml からこれを呼び出します。

test.yml

.test:
  script: 
    - echo "This is from hidden job."

.gitlab-ci.yml

test-job-not-hide:
  script:
    - echo "This job will be executed."

.test-job-hide:
  script:
    - echo "This job is hidden."

test-job-from-hide-job:
  extends: .test-job-hide

include:
  - local: test.yml

test-job-include-hidden-job:
  extends: .test

上記設定でPipelineを実行した結果、 test.yml の内容が実行されるのを確認できます。

その他

extends は多重に呼び出すことも可能です。例えばHidden Jobの中でも extends キーワードを使って別のJobの設定を呼び出したり、呼び出し先のJobでさらに extends を使うこともできます。 extends は最大11重まで使えるようですが、ドキュメントでは多くても3重までに抑えるよう記載しています。

docs.gitlab.com