triggerを使って.gitlab-ci.ymlを分割する

2022.03.31

.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内で各モジュールごとに一回で済み、スッキリしました。

参考情報