GitLab CI/CD ComponentsとCatalogを使ってパイプラインを再利用可能な部品にする #gitlab
GitLabサポートエンジニアの今井です。GitLabのCI/CDパイプラインを構築するために.gitlab-ci.yml
を書いているとき、共通部品として使えそうな箇所は再利用したいと考えることは良くあるケースではないかと思います。
今までは共通で使えそうな箇所を.gitlab-ci.yml
から別のファイルに分割して、使うときはinclude
キーワードを使ってパイプラインに組み込んでいました。しかしこれはあくまで外部ファイルで定義されたパイプラインをYAMLファイルに含めるという意味合いの機能であるため、パイプラインを再利用可能な部品として利用するにはいささか使いづらい点がありました。
その使いづらさを改善したGitLab CI/CD ComponentsとCI/CD Catalogの機能をご紹介したいと思います。
includeキーワードを使った再利用可能な部品化
前述のとおりinclude
キーワードは外部ファイルで定義されたパイプラインをYAMLファイルに含める機能です。この分割した外部ファイルを部品とし、include
キーワードを使って再利用していました。include
した後でパイプラインの構成をオーバーライドすることもできるため、必要に応じてカスタマイズすることも可能です。
しかし、このオーバーライドでscript
のほんの一部を変えたいだけカスタマイズしたい場合、script
全体を書き換えなければならないため、個人的には少し融通の利かない機能だと感じていました。
CI/CD Componentsによる部品化とCI/CD Catalogによる部品の公開
CI/CD Componentsでパイプラインを部品化
この融通の利かなさを改善してくれるのがGitLab 17.0で一般公開されたCI/CD Componentsという機能です。
この機能はComponentsプロジェクトに部品となるYAMLファイルを定義して、部品を利用するときはこのYAMLファイルをinclude: components
キーワードで追加します。また部品を再利用できるだけでなく入力パラメーターを定義することでジョブの一部動作のカスタマイズも直感的にできるようになりました。
CI/CD CatalogでCI/CD Componentsで定義した部品を公開
同じくGitLab 17.0から一般公開されたCI/CD Catalogは公開されているCI/CD Componentsを含むプロジェクトのリストです。Catalogに公開することでComponentsの検索性も上がり、プロジェクトの説明やREADME、入力パラメーターの情報を見ることができます。Componentsは定義すればすぐに利用できますが、Catalogに公開した方がより利便性が向上します。
CI/CD Componentsを作ってCI/CD Catalogに公開して使ってみよう
CI/CD Componentsプロジェクトを作成する
- プロジェクトを作成します
CI CD Components Sample
という名前でプロジェクトを作成します- プロジェクトの説明にComponentsの概要を記載します
- README.mdにComponentsの詳細を記載します
- ComponentsプロジェクトをCatalogプロジェクトに設定します
Project
>Settings
>General
>Visibility, project features, permissions
- ディレクトリ、ファイルを作成します
.
├── templates/
│ └── my-component1.yml
│ └── my-component2.yml
├── README.md
└── .gitlab-ci.yml
名前 | 説明 |
templates/ | Componentsを配置する最上位ディレクトリ。 1つのComponentsで複数のファイルを利用する場合、配下にサブディレクトリを作成しても良い |
templates/my-component1.yml | Componentsを定義するYAMLファイル |
templates/my-component2.yml | Componentsを定義するYAMLファイル |
README.md | Componentsの詳細説明を記載するファイル |
.gitlab-ci.yml | リポジトリにTagを付けたときにReleaseを作成するパイプラインジョブを定義するファイル (本来はComponentsをテストするジョブも定義すると良い) |
CI/CD Componentsを書く
CI CD Components Sampleのmy-component1.yml
とmy-componen2.yml
を下記のように編集します。
my-component1.yml
spec: inputs: stage: default: test description: "Defines the test stage" job-name: default: "my-component1" description: "Pipeline job name" message: default: "my-component1" description: "Defalut echo message" --- "$[[ inputs.job-name ]]-job": stage: $[[ inputs.stage ]] script: - echo "my-components1" - echo $[[ inputs.message ]]
my-component2.yml
spec: inputs: stage: default: test description: "Defines the test stage" job-name: default: "my-component2" description: "Pipeline job name" message: default: "my-component2" description: "Defalut echo message" --- "$[[ inputs.job-name ]]-job": stage: $[[ inputs.stage ]] script: - echo "my-components2" - echo $[[ inputs.message ]]
spec: inputs
キーワードを使ってComponentsの入力パラメーターを定義しています。また、入力パラーメーターではscriptだけでなく、ジョブ名やstageをカスタマイズすることも可能です。
Componentsを書く上での注意事項はここでは割愛します。詳細は公式ドキュメントを参照してください。
CI/CD ComponentsをCI/CD Catalogに公開する
Releaseを作るパイプラインジョブを定義する
CI CD Components Sampleの.gitlab-ci.yml
を下記のように編集します (公式ドキュメントの.gitlab-ci.ymlの例をそのまま使っています)。
これはTagが付けられたときにReleaseを作成するシンプルなジョブになっています。
.gitlab-ci.yml
stages: - release create-release: stage: release image: registry.gitlab.com/gitlab-org/release-cli:latest script: echo "Creating release $CI_COMMIT_TAG" rules: - if: $CI_COMMIT_TAG release: tag_name: $CI_COMMIT_TAG description: "Release $CI_COMMIT_TAG of components in $CI_PROJECT_PATH"
Tagを付けてReleaseを作成する
Project
>Code
>Tags
を開いてNew tag
をクリックしますTag name
に1.0.0
を入力してCreate tag
をクリックします- Tag
1.0.0
が作成されます Project
>Build
>Pipelines
を開いてパイプラインジョブが完了していることを確認しますProject
>Deploy
>Releases
を開いてRelease1.0.0
が作成されていることを確認します
CI/CD Catalogを確認する
Search or go to…
> Explore
> CI/CD Catalog
を開いてCI/CD Componentsが公開されていることを確認します。一覧画面にはComponentsプロジェクト名やプロジェクトの説明、Components名などが表示されます。
Componentsプロジェクト名をクリックすると詳細画面が表示されます。Readme
タブにはREADME.mdの内容が表示されます。
Components
タブにはinclude: component
キーワードの記述や入力パラメーターの定義が表示されます。
補足: CI/CD Componentsのバージョン
TagとReleaseを作成するときに1.0.0を指定しましたが、CI/CD ComponentsではComponentsプロジェクト毎にセマンティックバージョンを指定できます。もちろんComponentsを利用するときもバージョンを指定することができます。
補足: CI/CD Catalogの可視性
CI/CD Componentsプロジェクトの表示設定に準拠します。
- Private: Componentsプロジェクトに対してGuest以上のロールが割り当てられているユーザーのみに表示されます
- Internal: インスタンスにログインしているユーザーのみに表示されます
- Public: インスタンスにアクセスできるすべてのユーザーに表示されます
CI/CD Componentsを使う
- プロジェクトを作成します
Use CI CD Components Sample
という名前でプロジェクトを作成します
- 下記の内容で
.gitlab-ci.yml
を作成しますinclude: component
キーワードでComponentsプロジェクトに定義されたmy-component1
とmy-component2
を利用するように記述しますinputs
キーワードで各Componentsの入力パラメータを記述します
stages: - test - build include: - component: $CI_SERVER_FQDN/creationline/personal/y-imai/ci-cd-components/my-component2@1.0.0 inputs: stage: test job-name: "my-component2" message: "hogehoge" - component: $CI_SERVER_FQDN/creationline/personal/y-imai/ci-cd-components/my-component1@1.0.0 inputs: stage: build job-name: "my-component1" message: "piyopiyo"
Project
>Build
>Pipelines
> 実行されたパイプラインを開いてパイプラインの実行を確認します- 各ジョブをクリックしてジョブログを開いてジョブの実行を確認します
まとめ
CI/CD Componentsを使いパイプラインを部品化して、CI/CD Catalogで公開することができました。
従来のinclude
キーワードよりも部品の検索性や入力パラメーターによるカスタマイズの柔軟性が向上していることを実感できたかと思います。
今回は紹介しきれませんでしたがGitLab.comで公開されているComponentsを自分のSelf-Managedインスタンスで利用することも可能ですので、自分たちで作成したComponentsだけでなく広く公開されているComponentsを活用も視野に入れ、パイプライン構築の省力化を進めてみると良いと思います。