今回は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重までに抑えるよう記載しています。