この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
.gitlab-ci.ymlとは
GitLab CI/CD パイプラインの設定ファイルです。GitLab Runner上でここに書いてあるJobが書かれている設定順序で実行されていきます。
課題: .gitlab-ci.ymlが肥大化
そんな.gitlab-ci.yml
ファイルですが、リポジトリのルートディレクトリに配置する必要があります。ここにそのリポジトリに関するCI/CDの情報をつらつらと書き連ねていくのですが、モノレポ構成にしている場合、全モジュールのCI/CD設定がこのルートディレクトリの.gitlab-ci.yml
に書かれていくことになりすぐに肥大化していき、読みにくく、また変更が難しくなっていきます。
モノレポ例
.
├── module-a
│ ├── somefiles
│ .
│ .
├── module-b
│ ├── somefiles
│ .
│ .
├── module-c
│ ├── somefiles
│ .
│ .
└── .gitlab-ci.yml
.gitlab-ci.yml例
./.gitlab-ci.yml
module-a-build-job:
stage: build
script:
- echo "This job builds something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-a/**/*
module-a-test-job:
stage: test
script:
- echo "This job tests something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-a/**/*
module-a-deploy-prod:
stage: deploy
script:
- echo "This job deploys something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-a/**/*
module-b-build-job:
stage: build
script:
- echo "This job builds something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-b/**/*
module-b-test-job:
stage: test
script:
- echo "This job tests something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-b/**/*
module-b-deploy-prod:
stage: deploy
script:
- echo "This job deploys something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-b/**/*
module-c-build-job:
stage: build
script:
- echo "This job builds something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-c/**/*
module-c-test-job:
stage: test
script:
- echo "This job tests something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-c/**/*
module-c-deploy-prod:
stage: deploy
script:
- echo "This job deploys something"
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-c/**/*
解決: triggerを使う
このような場合、trigger
パラメーターを使って別ファイルに定義を分割することを考えましょう。
ルートディレクトリの.gitlab-ci.yml
は以下のようになります。条件付きで他ファイルを呼び出しているだけですね。
./.gitlab-ci.yml
trigger-module-a:
stage: triggers
trigger:
include: module-a/.gitlab-ci.yml
strategy: depend
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-a/**/*
trigger-module-b:
stage: triggers
trigger:
include: module-b/.gitlab-ci.yml
strategy: depend
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-b/**/*
trigger-module-c:
stage: triggers
trigger:
include: module-c/.gitlab-ci.yml
strategy: depend
rules:
- if: $CI_COMMIT_BRANCH
changes:
- module-c/**/*
各モジュールディレクトリーの直下にもYAMLファイルを作成し、こちらに具体的なJobを定義します。
./module-a/.gitlab-ci.yml
module-a-build-job:
stage: build
script:
- echo "This job builds something"
module-a-test-job:
stage: test
script:
- echo "This job tests something"
module-a-deploy-prod:
stage: deploy
script:
- echo "This job deploys something"
これにより、
- モジュール毎のCI/CDジョブ内容を、そのモジュールディレクトリ内に定義することができ、だいぶ読みやすくなりました。
rules
パラメーターの使用もルートディレクトリの.gitlab-ci.yml
内で各モジュールごとに一回で済み、スッキリしました。