GitLab Duo에 대한 커스텀 리뷰 지침 구성
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
GitLab Duo가 프로젝트에 일관되고 구체적인 코드 리뷰 표준을 적용할 수 있도록 커스텀 머지 리퀘스트 리뷰 지침을 생성합니다. 예를 들어, Ruby 파일에만 Ruby 스타일 규칙을 적용하고, Go 파일에는 Go 스타일 규칙을 적용할 수 있습니다.
히스토리
GitLab Duo가 프로젝트에 일관되고 구체적인 코드 리뷰 표준을 적용할 수 있도록 커스텀 머지 리퀘스트 리뷰 지침을 생성합니다.
예를 들어, Ruby 파일에만 Ruby 스타일 규칙을 적용하고, Go 파일에는 Go 스타일 규칙을 적용할 수 있습니다.
GitLab Duo는 커스텀 리뷰 지침을 기본 리뷰 기준을 대체하지 않고 추가합니다.
GitLab Duo Code Review는 특정 프로젝트 또는 그룹 내 모든 프로젝트에 대해 설정된 커스텀 리뷰 지침을 지원합니다.
프로젝트에 대한 커스텀 리뷰 지침 구성#
커스텀 머지 리퀘스트 리뷰 지침을 구성하려면:
-
저장소의 루트에
.gitlab/duo디렉토리가 없으면 생성합니다. -
.gitlab/duo디렉토리에mr-review-instructions.yaml이라는 파일을 생성합니다. -
다음 형식을 사용하여 커스텀 지침을 추가합니다:
instructions: - name: <instruction_group_name> fileFilters: - <glob_pattern_1> - <glob_pattern_2> - !<exclude_pattern> # Exclude files matching this pattern instructions: | <your_custom_review_instructions>fileFilters섹션은 필수입니다. 이 섹션에서 glob 패턴을 사용하여 커스텀 리뷰 규칙에 적용할 특정 파일을 지정합니다.예를 들어:
instructions: - name: Ruby Style Guide fileFilters: - "*.rb" # Ruby files in the root directory - "lib/**/*.rb" # Ruby files in lib and its subdirectories - "!spec/**/*.rb" # Exclude test files instructions: | 1. Ensure all methods have proper documentation 2. Follow Ruby style guide conventions 3. Prefer symbols over strings for hash keys - name: TypeScript Source Files fileFilters: - "**/*.ts" # Typescript files in any directory - "!**/*.test.ts" # Exclude test files - "!**/*.spec.ts" # Exclude spec files instructions: | 1. Ensure proper TypeScript types (avoid 'any') 2. Follow naming conventions 3. Document complex functions - name: All Files Except Tests fileFilters: - "!**/*.test.*" # Exclude all test files - "!**/*.spec.*" # Exclude all spec files - "!test/**/*" # Exclude test directories - "!spec/**/*" # Exclude spec directories instructions: | 1. Follow consistent code style 2. Add meaningful comments for complex logic 3. Ensure proper error handling - name: Test Coverage fileFilters: - "spec/**/*_spec.rb" # Ruby test files in spec directory instructions: | 1. Test both happy paths and edge cases 2. Include error scenarios 3. Use shared examples to reduce duplication - name: All Files fileFilters: - "**/*" # All files in the repository instructions: | 1. Explain the "why" behind each suggestionglob 구문 예시는 파일 패턴 참조를 참조하세요.
-
선택 사항:
mr-review-instructions.yaml파일 변경을 보호하기 위해 코드 소유자 항목을 추가합니다.[GitLab Duo] .gitlab/duo @default-owner @tech-lead -
변경 사항을 검토하고 머지하기 위해 머지 리퀘스트를 생성합니다:
-
파일 패턴이 일치하면 GitLab Duo가 자동으로 커스텀 지침을 적용합니다.
-
하나의 파일에 여러 지침 그룹이 적용될 수 있습니다.
-
커스텀 지침으로 트리거된 리뷰 코멘트의 경우 GitLab Duo는 다음 형식을 사용합니다:
According to custom instructions in '[instruction_name]': [feedback comments]instruction_name값은.gitlab/duo/mr-review-instructions.yaml파일의name속성에 해당합니다. 표준 GitLab Duo 코멘트는 이 형식을 사용하지 않습니다.
GitLab Duo가 문제를 발견하지 못하면 리뷰 요약 코멘트를 남깁니다. 커스텀 지침은 이 요약 코멘트에는 적용되지 않습니다.
-
-
선택 사항:
- 피드백을 검토하고 필요에 따라 지침을 수정합니다.
- 패턴이 의도한 파일과 일치하는지 테스트합니다.
그룹에 대한 커스텀 리뷰 지침 구성#
히스토리
- GitLab 19.0에서 도입되었습니다.
템플릿으로 사용할 프로젝트를 지정하여 그룹에 대한 커스텀 리뷰 지침을 정의할 수 있습니다.
템플릿 프로젝트에는 그룹 및 하위 그룹의 모든 프로젝트에 적용되는 리뷰 지침이 포함된 .gitlab/duo/mr-review-instructions.yaml 파일이 있어야 합니다.
GitLab Duo가 코드 리뷰를 수행할 때 최상위 그룹의 지침과 개별 프로젝트에 정의된 지침을 결합합니다.
사전 요구 사항:
-
최상위 그룹에 대한 Owner 역할.
-
그룹의 프로젝트에 템플릿으로 사용하려는 커스텀 리뷰 지침이 포함되어 있어야 합니다.
그룹에 대한 커스텀 리뷰 지침을 구성하려면:
-
상단 표시줄에서 검색 또는 이동을 선택하고 최상위 그룹을 찾습니다.
-
왼쪽 사이드바에서 설정 > GitLab Duo를 선택합니다.
-
그룹에 대한 커스텀 리뷰 지침 아래에서 그룹 내 프로젝트를 선택합니다.
-
변경 사항 저장을 선택합니다.
모범 사례#
커스텀 리뷰 지침을 작성할 때:
- 구체적이고 실행 가능하게 작성합니다.
- 명확성을 위해 지침에 번호를 매깁니다.
- 가장 중요한 표준에 집중합니다.
- 도움이 될 때 "왜"를 설명합니다.
- 간단한 지침으로 시작하여 필요에 따라 복잡성을 추가합니다.
예를 들어:
instructions: |
1. All public functions must include docstrings with parameter descriptions
2. Use parameterized queries to prevent SQL injection
3. Validate user input before processing (check type, length, format)
4. Include error handling for all external API calls
5. Avoid hardcoded credentials - use environment variables
언어별 예시는 사용 사례 예시를 참조하세요.
파일 패턴 참조#
fileFilters에서 glob 패턴을 사용하여 특정 파일을 지정합니다.
예를 들어, Ruby 파일이 포함된 프로젝트의 경우:
| 패턴 | 일치 |
|---|---|
**/*.rb |
모든 디렉토리의 모든 Ruby 파일 |
*.rb |
루트 디렉토리의 Ruby 파일만 |
lib/**/*.rb |
lib 디렉토리와 하위 디렉토리의 Ruby 파일 |
!**/*.test.rb |
모든 Ruby 테스트 파일 제외 |
!spec/**/*.rb |
spec 디렉토리와 하위 디렉토리의 모든 Ruby 파일 제외 |
!tests/**/* |
tests 디렉토리와 하위 디렉토리의 모든 파일 제외 |
**/*.{js,jsx} |
모든 디렉토리의 JavaScript 및 JSX 파일 |
다음 예시는 **/*.rb와 *.rb의 차이점을 보여줍니다:
project/
├── app.rb ← matched by both *.rb and **/*.rb
├── lib/
│ └── helper.rb ← matched only by **/*.rb
└── app/
└── models/
└── user.rb ← matched only by **/*.rb
*.rb는 app.rb만 일치합니다.**/*.rb는 세 파일 모두 일치합니다.
mr-review-instructions.yaml 파일에서 **/*.rb는 루트 디렉토리뿐만 아니라 프로젝트 구조의 어느 곳에 있는 Ruby 파일에도 리뷰 지침이 적용되도록 합니다.
사용 사례 예시#
instructions:
- name: Assembly Style Guide
fileFilters:
- "**/*.asm"
- "**/*.s"
- "**/*.S"
instructions: |
1. Document the target architecture (x86-64, ARM, RISC-V, AVR, etc.) at the top
2. Use meaningful labels and comment all non-obvious instructions
3. Document register usage and calling conventions
4. Align code sections properly for readability
5. Include memory layout and stack usage documentation
instructions:
- name: C Style Guide
fileFilters:
- "**/*.c"
- "**/*.h"
instructions: |
1. goto is not allowed
2. Avoid using global variables
3. Use meaningful variable names
4. Add comments for complex logic
instructions:
- name: C++ Style Guide
fileFilters:
- "**/*.cpp"
- "**/*.{h,hpp}"
instructions: |
1. Ensure all methods have proper documentation
2. Use smart pointers for dynamic memory management
3. Avoid raw pointers
instructions:
- name: C# Style Guide
fileFilters:
- "**/*.cs"
instructions: |
1. Follow Microsoft C# coding conventions
2. Use XML documentation comments for public APIs
3. Prefer async/await for asynchronous operations
4. Use nullable reference types appropriately
5. Follow .NET naming conventions (PascalCase for public members)
instructions:
- name: COBOL Style Guide
fileFilters:
- "**/*.CBL"
- "**/*.cbl"
- "**/*.COB"
- "**/*.cob"
instructions: |
1. Use clear and meaningful names for variables and procedures
2. Prefer COBOL-85 syntax where possible
3. Use proper division structure (IDENTIFICATION, ENVIRONMENT, DATA, PROCEDURE)
4. Document all paragraphs and sections with meaningful comments
5. Use 88-level condition names for boolean flags and status codes
6. Avoid GO TO statements, prefer PERFORM for structured programming
7. Use proper error handling with declaratives or status code checking
8. Define working storage variables with appropriate PICTURE clauses
9. Use meaningful paragraph names that describe the operation
10. For mainframe integration, document JCL dependencies and file layouts
instructions:
- name: Go Style Guide
fileFilters:
- "**/*.go"
instructions: |
1. Use idiomatic Go practices
2. Ensure all public functions and types have documentation
3. Prefer standard library packages over third-party ones when possible
instructions:
- name: Java Style Guide
fileFilters:
- "**/*.java"
instructions: |
1. Do not modernize Java 8 code to Java 11+ features, unless there is a GitLab issue or task specifically requesting modernization
2. All public classes must have Javadoc describing purpose and usage
3. All public methods must have Javadoc with @param and @return tags
4. Include code examples in main class Javadoc
5. All public methods must have at least one test case
instructions:
- name: JavaScript/TypeScript Files
fileFilters:
- "src/**/*.js"
- "src/**/*.jsx"
- "src/**/*.ts"
- "src/**/*.tsx"
- "!**/*.test.js"
- "!**/*.test.ts"
- "!**/*.spec.js"
- "!**/*.spec.ts"
instructions: |
1. Use const/let instead of var
2. Prefer async/await over promise chains
3. Add JSDoc comments for complex functions
4. Ensure proper error handling in async code
5. Avoid any 'any' types in TypeScript
instructions:
- name: Kotlin Style Guide
fileFilters:
- "**/*.kt"
- "**/*.kts"
instructions: |
1. Follow Kotlin coding conventions
2. Prefer immutability (val over var)
3. Use coroutines for asynchronous operations
4. Leverage Kotlin's null safety features
5. Document public APIs with KDoc
instructions:
- name: MATLAB Style Guide
fileFilters:
- "**/*.m"
instructions: |
1. Use descriptive variable and function names with camelCase convention
2. Vectorize operations instead of using loops where possible
3. Document functions with H1 line and help text comments
4. Preallocate arrays before loops to improve performance
5. Use proper error handling with try-catch blocks and error() function
instructions:
- name: Perl Style Guide
fileFilters:
- "**/*.pl"
- "**/*.pm"
instructions: |
1. Follow idiomatic Perl practices
2. Ensure proper module documentation
3. Use strict and warnings pragmas
instructions:
- name: PHP Style Guide
fileFilters:
- "**/*.php"
instructions: |
1. Follow PSR-12 coding standard
2. Use type declarations for function parameters and return types
3. Ensure compatibility with PHP 8+
4. Use proper error handling and exceptions
5. Document classes and methods with PHPDoc
instructions:
- name: Python Source Files
fileFilters:
- "**/*.py"
- "!tests/**/*.py"
- "!test_*.py"
instructions: |
1. All functions must have docstrings with parameters and return types
2. Use type hints for function signatures
3. Follow PEP 8 style conventions
4. Ensure proper exception handling
5. Avoid using bare 'except' clauses
- name: Python Tests
fileFilters:
- "tests/**/*.py"
- "test_*.py"
instructions: |
1. Use pytest fixtures for common setup
2. Test names should clearly describe the scenario being tested
3. Include assertions for both expected outcomes and edge cases
4. Mock external dependencies appropriately
instructions:
- name: Ruby Style Guide
fileFilters:
- "*.rb"
- "lib/**/*.rb"
- "!spec/**/*.rb" # Exclude test files
instructions: |
1. Follow Ruby style guide conventions
2. Prefer symbols over strings for hash keys
3. Use snake_case for methods/variables, SCREAMING_SNAKE_CASE for constants, CamelCase for classes
4. Prefer Ruby 3.0+ features (pattern matching, endless methods) where appropriate
5. Use proper error handling - raise exceptions over returning nil for errors
6. Write idiomatic Ruby - use blocks, enumerables, and Ruby idioms over procedural patterns
7. Use meaningful method names - use ? for predicates, ! for dangerous methods
8. Prefer keyword arguments for methods with multiple parameters
9. All public methods should have corresponding RSpec/Minitest tests
10. Manage dependencies with Gemfile and ensure version compatibility
11. Document thread-safe code and use proper synchronization for concurrent operations
12. Handle signals (SIGTERM, SIGINT) properly for daemon processes
instructions:
- name: R Style Guide
fileFilters:
- "**/*.r"
- "**/*.R"
instructions: |
1. Follow tidyverse style guide conventions
2. Use snake_case for variable and function names
3. Document functions with roxygen2 comments
4. Prefer vectorized operations over loops
5. Use proper error handling with tryCatch and stop()
instructions:
- name: Rust Style Guide
fileFilters:
- "**/*.rs"
instructions: |
1. Follow Rust idioms and conventions
2. Use proper error handling with Result and Option types
3. Avoid unsafe code unless absolutely necessary and well-documented
4. Ensure all public items have documentation comments
instructions:
- name: Scala Style Guide
fileFilters:
- "**/*.scala"
instructions: |
1. Follow Scala style guide conventions
2. Prefer immutable data structures (val over var)
3. Use pattern matching effectively for control flow
4. Document public APIs with ScalaDoc
5. Use proper error handling with Try, Either, or Option types
instructions:
- name: Shell Script Style Guide
fileFilters:
- "**/*.sh"
- "**/*.bash"
- "**/*.zsh"
- "**/*.ksh"
instructions: |
1. Always quote variables to prevent word splitting ("$var" not $var)
2. Use proper error handling with set -euo pipefail at script start
3. Document script purpose, parameters, and exit codes in header comments
4. Prefer [[ ]] over [ ] for conditional tests
5. Use meaningful function names and avoid complex one-liners
instructions:
- name: SQL Style Guide
fileFilters:
- "**/*.sql"
instructions: |
1. Use uppercase for SQL keywords (SELECT, FROM, WHERE, JOIN)
2. Always specify column names explicitly instead of using SELECT *
3. For PostgreSQL use SERIAL/RETURNING, for MySQL use AUTO_INCREMENT, for Oracle use SEQUENCE
4. For NoSQL (MongoDB) use proper indexing and aggregation pipelines to avoid N+1 queries
5. Document database-specific features and expected performance characteristics
6. Use proper indentation for complex queries and subqueries
instructions:
- name: VHDL Style Guide
fileFilters:
- "**/*.vhd"
- "**/*.vhdl"
instructions: |
1. Follow IEEE VHDL coding standards
2. Use meaningful signal and entity names with clear prefixes
3. Document all entities, architectures, and processes with comments
4. Use synchronous design practices with proper clock and reset handling
5. Avoid combinational loops and ensure proper timing constraints
instructions:
- name: Configuration Files
fileFilters:
- "*.yaml"
- "*.yml"
- "*.json"
- "config/**/*"
- "!.gitlab/**/*"
instructions: |
1. Do not include sensitive data (passwords, API keys)
2. Use environment variables for environment-specific values
3. Document all configuration options
4. Validate configuration schema if possible
instructions:
- name: Ansible Style Guide
fileFilters:
- "*.yaml"
- "*.yml"
- "playbooks/**/*.yaml"
- "roles/**/*.yaml"
instructions: |
1. Use meaningful play and task names that describe the action
2. Prefer modules over shell/command tasks when possible
3. Use variables and defaults for reusability across environments
4. Implement idempotency - tasks should be safe to run multiple times
5. Use handlers for service restarts and notifications
6. Document playbook purpose, required variables, and dependencies
- name: Dockerfile Style Guide
fileFilters:
- "Dockerfile"
- "*.dockerfile"
- "Dockerfile.*"
instructions: |
1. Use specific base image tags, avoid 'latest'
2. Minimize layers by combining RUN commands with && where logical
3. Use multi-stage builds to reduce final image size
4. Run containers as non-root user for security
5. Use .dockerignore to exclude unnecessary files
6. Document exposed ports, volumes, and environment variables
- name: GitLab CI/CD Style Guide
fileFilters:
- ".gitlab-ci.yml"
- "**/.gitlab-ci.yml"
instructions: |
1. Use job extends instead of YAML anchors for reusability
2. Always use rules instead of only/except for job conditions
3. Define appropriate caching strategies for dependencies
4. Use stages to organize pipeline workflow logically
5. Include security scanning templates (SAST, dependency scanning, secret detection)
6. Document job purpose, required variables, and dependencies in comments
- name: Helm Chart Style Guide
fileFilters:
- "Chart.yaml"
- "values.yaml"
- "templates/**/*.yaml"
instructions: |
1. Use semantic versioning for chart versions
2. Provide sensible defaults in values.yaml with comments
3. Use template functions for conditional logic and loops
4. Include NOTES.txt with post-installation instructions
5. Validate charts with helm lint before committing
6. Document all configurable values and their purpose
- name: Kubernetes Style Guide
fileFilters:
- "*.yaml"
- "*.yml"
- "k8s/**/*.yaml"
- "kubernetes/**/*.yaml"
instructions: |
1. Use explicit API versions and avoid deprecated APIs
2. Always define resource limits and requests for containers
3. Use namespaces to organize resources logically
4. Define liveness and readiness probes for all deployments
5. Use ConfigMaps and Secrets instead of hardcoded values
6. Document resource purpose and dependencies in metadata annotations
- name: Terraform/OpenTofu Style Guide
fileFilters:
- "*.tf"
- "*.tfvars"
instructions: |
1. Use consistent naming conventions for resources (environment_service_resource)
2. Organize code into modules for reusability
3. Use variables with descriptions and validation rules
4. Define outputs for important resource attributes
5. Use remote state with locking for team collaboration
6. Document module purpose, inputs, outputs, and provider requirements
예제 프로젝트#
더 많은 커스텀 리뷰 지침 사용 사례는 다음 실제 예시를 참조하세요:
