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