🕌

default: キーワードに置き換えよう (.gitlab-ci.yml)

2022/12/05に公開

この記事は 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