default: キーワードに置き換えよう (.gitlab-ci.yml)
この記事は GitLab Advent Calendar 2022 の 5 日目の記事です。
default: セクションに置き換えよう (.gitlab-ci.yml)
.gitlab-ci.yml に各ジョブの共通の設定を書くとき、以前 (と言ってもかなり昔) は次のようにグローバルセクションに記述していました。
image: node:18
before_script:
- npm ci
build:
stage: build
script:
- npm run build
artifacts:
paths:
- dist
test:
stage: test
script:
- npm run test
lint:
stage: test
script:
- npm run lint
image: や before_script: が共通の設定で各ジョブで明示的に指定する必要がありません。
今では default: セクションが用意されていて、そちらに記述するようになりました。
default:
image: node:18
before_script:
- npm ci
build:
stage: build
script:
- npm run build
artifacts:
paths:
- dist
test:
stage: test
script:
- npm run test
lint:
stage: test
script:
- npm run lint
依然としてグローバルセクションに記述する方法も使えますが、default: セクションに記述することをお勧めします。
グローバルセクションでの問題
共通設定をしたくても、グローバルセクションに書けない設定が多いのです。timeout: や tags: などがそうです。次の .gitlab-ci.yml ファイルはエラーとなります。
image: node:18
timeout: 1 hour
tags: [docker]
.gitlab-ci.yml ファイルの仕様に GitLab が手を入れて、timeout: や tags: をグローバルセクションで共通設定できるようにしてもいいのですが、その場合次のような tags ジョブを持つ .gitlab-ci.yml ファイルが動作しなくなります。
image: node:18
tags:
script
- npm run build
only:
- tags
GitLabのバージョンアップで今までの .gitlab-ci.yml が動作しなくなったら困りますよね。それが理由で、GitLab はグローバルセクションのキーワードを増やすことができませんでした。
default: セクションが導入されたことで、tags: や timeout: などの共通設定ができるようになりました。今後もdefault: セクションには共通設定が増えていくと思いますので、グローバルセクションよりも default: セクションの利用をお勧めします。
default: セクションではなく、グローバルセクションに記述するもの
いままでグローバルセクションに記述していた設定のうち、共通設定ではないものは default: セクションには記述できません。
stages: は各ジョブの共通設定ではなく、GitLab CI のパイプラインの設定ですので、依然としてグローバルセクションに記述します。default: セクションには記述できません。
少し特殊なのが variables: です。default: セクションには記述できず、今まで通りグローバルセクションに記述します。
variables:
VAR1: value1
VAR2: value2
job1:
variables:
VAR1: VALUE1
script:
- echo $VAR1 # VALUE1
- echo $VAR2 # value2
例にあるように、グローバルセクションの variables: が job1:variables: で上書きされるのではなく、両方を結合する仕様になっています。(ジョブ側の vairables: が優先)
最後に
ググって調べたりすると、共通設定をグローバルセクションに記述しているものも見かけます。(私が昔書いた記事もそうなってます) それをそのまま利用するのではなく、共通設定を default: セクションに記述するようにしてください。
昔は、tags: を共通で設定するために YAML Anchor を使ってました。今はサクッと書けるのでかなりよくなりました。
Discussion