GitLab extendsキーワードでJobを再利用する
今回はGitLabの extends というキーワードを使ってみました。
背景
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 キーワードと組み合わせた場合を見てみます。
※参考:
ここでは以下のような 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重までに抑えるよう記載しています。