特徴の分類
GitLab 13.2 で導入されました。
各 Sidekiq ワーカー、Batched Background マイグレーション、コントローラーアクション、テストサンプル、API エンドポイントは、feature_category
属性を宣言する必要があります。この属性は、それぞれを機能カテゴリにマッピングします。これは、エラー予算、アラートルーティング、チーム帰属のために行われます。
機能カテゴリのリストは、ファイルconfig/feature_categories.yml
にあります。このファイルは、GitLabハンドブックや他のGitLabリソースで使われているstages.yml
データファイルから生成されています。
更新config/feature_categories.yml
GitLabのステージやグループ、製品カテゴリーに新しい機能が追加されることがあります。このような場合は、scripts/update-feature-categories
を実行することでconfig/feature_categories.yml
を自動的に更新することができます。このスクリプトはstages.yml
を取得・解析して新しいバージョンのファイルを生成し、リポジトリにコミットする必要があります。
現在、Scalability チームが feature_categories.yml
ファイルをメンテナーしています。ファイルが古くなると、Slackで自動的に通知されます。
Sidekiqワーカー
この宣言では、feature_category
クラスメソッドを使用しています。
class SomeScheduledTaskWorker
include ApplicationWorker
# Declares that this worker is part of the
# `continuous_integration` feature category
feature_category :continuous_integration
# ...
end
feature_category
を使用して指定された機能カテゴリは、config/feature_categories.yml
で定義されている必要があります。
Sidekiqワーカーをフィーチャーカテゴライズから除外する方法
すべてのフィーチャーで使用されるいくつかのSidekiqワーカーは、1つのカテゴリーにマッピングできません。これらは、feature_category :not_owned
宣言を使って、以下のように宣言してください:
class SomeCrossCuttingConcernWorker
include ApplicationWorker
# Declares that this worker does not map to a feature category
feature_category :not_owned # rubocop:disable Gitlab/AvoidFeatureCategoryNotOwned
# ...
end
可能であれば、”not owned” とマークされたワーカーは、メトリクスとログで呼び出し元のカテゴリ(ワーカーまたはHTTPエンドポイント)を使用します。例えば、ReactiveCachingWorker
はメトリクスとログで複数の機能カテゴリを持つことができます。
バックグラウンドでの一括マイグレーション
(時間制限のガイドラインに従って)長時間実行されるマイグレーションはバッチバックグラウンドマイグレーションとして引き出されます。feature_category
を定義する必要があります:
# File name: lib/gitlab/background_migration/my_background_migration_job.rb
class MyBackgroundMigrationJob < BatchedMigrationJob
feature_category :gitaly
#...
end
RuboCop::Cop::BackgroundMigration::FeatureCategory
cop は有効なfeature_category
が定義されていることを保証します。Railsコントローラ
コントローラのアクションで機能カテゴリを指定するには、feature_category
クラスメソッドを使用します。
機能カテゴリは、コントローラ全体で指定することができます:
class Boards::ListsController < ApplicationController
feature_category :kanban_boards
end
機能カテゴリは、第2引数を使用してアクションのリストに制限できます:
class DashboardController < ApplicationController
feature_category :team_planning, [:issues, :issues_calendar]
feature_category :code_review_workflow, [:merge_requests]
end
コントローラが複数のカテゴリを持つ場合、すべてのアクションをリストする必要があります。
コントローラのアクションをフィーチャーカテゴライズから除外する方法
アクションをフィーチャカテゴリに結び付けられない場合は、not_owned
フィーチャカテゴリを使用します。
class Admin::LogsController < ApplicationController
feature_category :not_owned
end
機能カテゴリが有効であることの確認
spec/controllers/every_controller_spec.rb
は、定義されたすべてのルートを繰り返し、コントローラをチェックして、すべてのアクションにカテゴリが割り当てられているかどうかを確認します。
この仕様では、使用される機能カテゴリが既知かどうかも検証します。また、設定に使用されたアクションがルートとして存在するかどうかも検証します。
APIエンドポイント
GraphQL APIは現在、not_owned
に分類されています。今のところ、特別な指定は必要ありません。詳細については、gitlab-com/gl-infra/scalability#583
を参照してください。
Grape API エンドポイントは、Rails コントローラのようにfeature_category
クラスメソッドを使用できます:
module API
class Issues < ::API::Base
feature_category :team_planning
end
end
2番目の引数は、特定のルートにフィーチャーカテゴリを指定するために使うことができます:
module API
class Users < ::API::Base
feature_category :user_profile, ['/users/:id/custom_attributes', '/users/:id/custom_attributes/:key']
end
end
あるいは、アクション自体に特徴カテゴリを指定することもできます:
module API
class Users < ::API::Base
get ':id', feature_category: :user_profile do
end
end
end
Railsコントローラと同様、APIクラスは、そのクラス内のすべてのアクションで同じカテゴリが使われない限り、アクションごとにカテゴリを指定する必要があります。
RSpecの例
各 RSpec サンプルにフィーチャー・カテゴリーのメタデータを設定する必要があります。こ の情報は、 フ レーキ テ ス ト イシューで、 その機能を所有す る グルー プを識別する ために使用 さ れます。
feature_category
にはconfig/feature_categories.yml
の値を指定します。
feature_category
のメタデータを設定できます:
同じファイルに複数のフィーチャカテゴリがある場合は、ファイルの分割を検討してください。
使用例:
RSpec.describe Admin::Geo::SettingsController, :geo, feature_category: :geo_replication do
feature_category
が設定されていない例については、ローカル環境で実行する際に警告を追加します。
この警告を無効にするには、RSpec テストを実行する際にRSPEC_WARN_MISSING_FEATURE_CATEGORY=false
を使用してください:
RSPEC_WARN_MISSING_FEATURE_CATEGORY=false bin/rspec spec/<test_file>
さらに、RSpec/MissingFeatureCategory
RuboCop ルールによって違反にフラグを立てます。
ツール機能カテゴリ
エンジニアリング生産性内部ツールには、feature_category: :tooling
を使用しています。
例えばspec/tooling/danger/specs_spec.rb
。
共有機能カテゴリ
開発者をサポートする機能で、製品グループに固有でないものにはfeature_category: :shared
を使用します。spec/lib/gitlab/job_waiter_spec.rb
管理セクション
機能カテゴリを追加することは、Admin セクションに新しいパーツを追加するときにも同様に重要です。歴史的に、Adminセクションはしばしばコード内でnot_owned
。現在では、Admin セクションに新しく追加される各パーツがfeature_category
記法で適切に注釈されていることを確認する必要があります。