기능 분류
GitLab v19.4요약
각 Sidekiq 워커, Batched Background 마이그레이션, 컨트롤러 액션, 테스트 예제, API 엔드포인트는 feature_category 속성을 선언해야 합니다. 기능 카테고리 목록은 config/feature_categories.yml 파일에서 확인할 수 있습니다.
각 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
을 가져와 파싱한 뒤 새 버전의 파일을 생성하며, 이 파일을
리포지터리에 커밋해야 합니다.
현재 feature_categories.yml 파일은 Observability 팀이
관리합니다. 파일이 오래되면 이 팀에 Slack으로 자동
알림이 전달됩니다.
Gemfile#
각 Ruby gem 의존성마다 어떤 기능 카테고리가 그 의존성을 필요로 하는지 지정해야 합니다. 이렇게 하면 소유권이 분명해지고, 해당 기능을 소유한 그룹에 업그레이드를 맡길 수 있습니다.
Tooling 기능 카테고리#
Developer Experience 내부 도구에는 feature_category: :tooling을 사용합니다.
예를 들어 knapsack과 gitlab-crystalball은 둘 다 CI에서 RSpec 테스트 스위트를
실행하는 데 쓰이며 어떤 제품 그룹에도 속하지 않습니다.
Test platform 기능 카테고리#
엔드투엔드 테스트 인프라와 관련된 gem은 Development Experience 섹션이 관리합니다. 이때는 feature_category: :test_platform 레이블을 사용합니다.
예를 들어 capybara는 UI가 관여하는 테스트를 실행하기 위해 Gemfile과 qa/Gemfile 양쪽에 정의되어 있습니다. 이러한 gem은 특정 제품 그룹에 속하지 않습니다.
Rails platform 기능 카테고리#
Rails 코어 프레임워크 gem은 주로
Backend Maintainer가 관리합니다.
예를 들어 rails와 zeitwerk는 :rails_platform으로 정의해야 합니다.
Shared 기능 카테고리#
:shared 기능 카테고리는 gem에서 더 이상 지원되지 않습니다.
gem을 잘 관리하기 위한 노력의 일환으로, 모든 gem은
구체적인 기능 카테고리를 사용해야 합니다.
gem의 소유권이 불분명하다면
#backend_maintainers 채널에 문의합니다.
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 워커는 하나의 카테고리에
매핑할 수 없습니다. 이러한 워커는 다음과 같이
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는 메트릭과 로그에서 여러 기능 카테고리를
가질 수 있습니다.
Batched background 마이그레이션#
소요 시간 지침에 따라 오래 걸리는 마이그레이션은
batched background 마이그레이션으로 분리합니다.
이때 다음과 같이 feature_category를 정의해야 합니다.
# Filename: 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
두 번째 인수를 사용하면 기능 카테고리를 특정 액션 목록으로 제한할 수 있습니다.
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
두 번째 인수로 특정 라우트에 대한 기능 카테고리를 지정할 수 있습니다.
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/FeatureCategory RuboCop 규칙으로 위반 사항을 표시합니다.
Tooling 기능 카테고리#
Engineering Productivity 내부 도구에는 feature_category: :tooling을 사용합니다.
예시는 spec/tooling/danger/specs_spec.rb에서 확인할 수 있습니다.
Shared 기능 카테고리#
:shared 기능 카테고리는 테스트에서 더 이상 지원되지 않습니다.
불안정한 테스트와 격리된 테스트의 자동화를 정비하려는 노력의 일환으로, 모든 스펙은 구체적인 기능 카테고리를 사용해야 합니다. 스펙의 소유권이 불분명하다면 #g_test_governance 팀에 문의합니다. shared 소유권을 가진 기존 테스트의 이관에 관한 자세한 내용은 이 이슈를 참고합니다.
Admin 섹션#
Admin 섹션에 새 부분을 추가할 때도 기능 카테고리 지정은 똑같이 중요합니다. 과거에는 Admin 섹션이 코드에서 not_owned로 표시되는 경우가 많았습니다. 이제는
Admin 섹션에 새로 추가하는 항목마다 feature_category 표기로 올바르게 명시해야 합니다.