Omnibus GitLabへの新しいサービスの追加

GitLabに新しいサービスを追加するには、以下の手順に従ってください:

  1. ビルド中のソフトウェアの取得とコンパイル
  2. サービスのトップレベル構成オブジェクトを追加します。
  3. サービスリストにサービスを追加
  4. サービスの有効・無効レシピの作成

オプションとして、もう一つの一般的なタスクは、サービスのための追加の設定解析を追加することです。

ビルド中のソフトウェアの取得とコンパイル

プロジェクトにまだ含まれていない場合は、サービスの新しいソフトウェア定義を追加する必要があります。

サービスのトップレベル構成オブジェクトを追加します。

files/gitlab-cookbooks にあるクックブックとレシピは、Omnibus GitLab パッケージがインストールされたインスタンスでgitlab-ctl reconfigure の間に実行されるものです。 ここで、新しいサービスの設定を追加する必要があります。

デフォルト属性の定義

既存のクックブックの中からサービスを設定するクックブックを選ぶか、独自のクックブックが必要であれば新しいクックブックを作成してください。

Cookbookの内部にはattributes/default.rb ファイルがあるはずです。 ここでサービスのデフォルト属性を定義します。 サービスではデフォルトでenable オプションを定義する必要があります。

default['gitlab']['best-service']['enable'] = false
default['gitlab']['best-service']['dir'] = '/var/opt/gitlab/best-service'
default['gitlab']['best-service']['log_directory'] = '/var/log/gitlab/best-service'
  • default は基本的なクックブックの属性を定義する方法です。
  • ['gitlab'] にはクックブックの名前が入ります。
  • ['best-service'] はサービス名で、このレベルではハイフンを使って単語を区切ります。
  • enabledir、 は内部設定であり、アンダースコアで単語を区切っています。log_directory
  • /var/opt/gitlab は、サービスの作業ディレクトリと設定ファイルが置かれる場所です。
  • /var/log/gitlab は GitLab パッケージのログが書き込まれる場所です。

パッケージ内で設定可能なすべての設定をここで定義してください。他の設定に基づいてデフォルトを計算する必要がある場合は、とりあえずnil をデフォルトにしてください。

サービスの設定マッシュを作成します。

ユーザが/etc/gitlab/gitlab.rbからサービスを設定できるようにするには、サービスのトップレベルのマッシュを追加する必要があります。

files/gitlab-cookbooks/package/libraries/config/gitlab.rbattribute のメソッド一覧があります。

もしあなたのサービスが GitLab cookbook の属性内に存在するのであれば、attribute_block('gitlab') ブロック内に追加してください。そうでなければ、もしあなたのサービスが独自の cookbook を持っているのであれば、上に追加してください。

デフォルトの属性でハイフンを使用した場合でも、アンダースコアで単語を区切って、サービスを属性として追加してください。

attribute('best_service')

EEのみの属性の場合は、代わりにee_attribute

ee_attribute('best_service')

設定テンプレートにサービス構成を追加

私たちは、サービスの設定方法の例がコメントアウトされた状態で利用できるグローバル設定テンプレートを維持しています。

このファイルは、パッケージの新規インストール時に/etc/gitlab/gitlab.rb となります。

サービスのコンフィギュレーションをユーザーに公開し、ユーザーが変更できるようにしたい場合は、このファイルにコンフィギュレーションを追加します。files/gitlab-config-template/gitlab.rb.template

### Best Service configuration
# best_service['enable'] = true
# best_service['dir'] = '/var/opt/gitlab/best-service'
# best_service['log_directory'] = '/var/log/gitlab/best-service'

単語の区切りにはアンダースコア構文を使用してください。 提供される値はデフォルトを反映するためのものではなく、サービスを使用するためにコメントを解除することを容易にするためのものです。 それが不可能な場合は、YOURSECRET などのように明らかに置換を意味する値を使用することができます。最も理にかなっている場合は、デフォルトを使用することもできます。

サービスリストにサービスを追加

レシピの中でサービスを簡単に有効/無効にできるように、サービスリストに追加し、適切なグループを与える必要があります。

files/gitlab-cookbooks/package/libraries/config/services.rb ファイルで、サービスがGitLab EE専用かどうかに応じて、適切なConfigクラス、BaseまたはEEにサービスを追加します。

service 'best_service', groups: ['bestest']

アンダースコアで区切っているのは、これらのサービスが先ほど作成した Mash オブジェクトに対して動作するためです。 グループを指定することで、関連する複数のサービスを一度に無効化/有効化することが簡単になります。

もし既存のグループがどれもあなたのサービスが行うことと一致せず、現在グループを使用してサービスを有効化/無効化する必要がない場合、この時点ではわざわざ追加する必要はありません。

既存のグループの例をいくつか挙げてみましょう:

  • サービスがデフォルトでomnibusで有効になっている場合、DEFAULT_GROUP グループが追加されるはずです。
  • ほとんどのシナリオでサービスが本当に無効になってはいけない場合は、SYSTEM_GROUPを追加してください。
  • サービスが GitLab Rails の設定に依存している場合は、rails グループを追加します。
  • サービスが新しいExporterの場合、prometheus グループを追加します。

サービスの有効・無効レシピの作成

レシピの有効化

既存のクックブックに追加される場合、enable レシピはfiles/gitlab-cookbooks/<cookbook-name>/recipes/<service-name>.rbとして作成されるべきです。サービスがそれ自身のクックブックを持っている場合、enable レシピはfiles/gitlab-cookbooks/<cookbook-name>/recipes/enable.rbとして作成できます。

レシピでは、/var/opt/gitlabにサービスの作業ディレクトリを作成します。 サービスを実行するシステムユーザが作成されていることを確認します。 サービスに必要な設定ファイルを作業ディレクトリにレンダリングします。

レシピの最後の方で、レシピを定義するためにrunitサービス定義を呼び出したいでしょう。 この作業をするためには、cookbookstemplates/default ディレクトリにrunファイルを作成する必要があります。これらのファイル名はsv- で始まり、サービス名、runitアクション名が続きます。

サービスには通常、runlog-runlog-configが必要です。

sv-best-service-log-config.erb:

<%= "s#@svlogd_size" if @svlogd_size %>
<%= "n#@svlogd_num" if @svlogd_num %>
<%= "t#@svlogd_timeout" if @svlogd_timeout %>
<%= "!#@svlogd_filter" if @svlogd_filter %>
<%= "u#@svlogd_udp" if @svlogd_udp %>
<%= "p#@svlogd_prefix" if @svlogd_prefix %>

sv-best-service-log-run.erb:

#!/bin/sh
exec svlogd -tt <%= @options[:log_directory] %>

sv-best-service-run.erb:

#!/bin/sh
exec 2>&1
<%= render("mount_point_check.erb") %>
cd <%= node['gitlab']['best-service']['dir'] %>
exec chpst -P /opt/gitlab/embedded/bin/best-service -config-flags -etc

何を走らせるか、どのユーザーが走らせるかによって、ランファイルの設定は異なるはずです。例については、他の-run.erb

レシピの中で、runitサービスを呼び出し、開始する必要があります:

runit_service "best-service" do
  options({
    configItem: 'value'
  }.merge(params))
  log_options node['gitlab']['logging'].to_hash.merge(node['best-service'].to_hash)
end

if node['gitlab']['bootstrap']['enable']
  execute "/opt/gitlab/bin/gitlab-ctl start best-service" do
    retries 20
  end
end

レシピの無効化

既存のクックブックに追加される場合、enable レシピはfiles/gitlab-cookbooks/<cookbook-name>/recipes/<service-name>_disable.rbとして作成されるべきです。サービスがそれ自身のクックブックを持っている場合、disable レシピはfiles/gitlab-cookbooks/<cookbook-name>/recipes/disable.rbとして作成できます。

レシピには、サービスが無効になったときに行いたいクリーンアップを記述し、runitサービスを無効にするコールを記述する必要があります。

runit_service "best-service" do
  action :disable
end

サービスの追加設定解析

ユーザーによって設定された他のオプションに基づいて、特定の設定オプションを入力したい場合、私たちはあなたのサービスに変数を解析するためのライブラリを追加します。

ライブラリはfiles/gitlab-cookbooks/<cookbook name>/libraries/<service-name>.rb

ライブラリは、parse_variables メソッドを持つ、サービスにちなんだ名前のモジュールでなければなりません。

module BestService
  class << self
    def parse_variables
      # setup some additional configuration based on the values of the user provided configuration
    end
  end
end

GitLabの設定からparse_variablesメソッドを呼び出すようにします。

files/gitlab-cookbooks/package/libraries/config/gitlab.rb にアクセスし、ライブラリを使用するように属性を更新してください。

attribute('best_service').use { BestService }

変数をパースする順序が重要であることに注意してください。 そのため、ライブラリが他のサービスのライブラリの後でパースされることを期待する場合は、属性値をpriority 後で priority更新する必要がありますpriority (デフォルト priority値は20)。

attribute('expected_service').use { ExpectedService }
attribute('best_service', sequence: 25).use { BestService }