특징 플래그

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

특징 플래그를 사용하면 응용 프로그램의 새로운 기능을 작은 배치로 프로덕션에 배포할 수 있습니다. 특징을 일부 사용자 그룹에 대해 켜고 끌 수 있어 지속적인 전달을 달성하는 데 도움이 됩니다. 특징 플래그는 제어된 테스트를 수행하고 기능을 출시에서 분리하여 리스크를 줄이는 데 도움이 됩니다.

특징 플래그가 적용된 실제 예시를 보려면 특징 플래그로 위험 제거를 참조하세요.

클릭하여 데모를 보려면 특징 플래그를 참조하세요.

note
GitLab 제품의 개발에 기여하려면 이 특징 플래그 콘텐츠를 확인하세요.

작동 방식

GitLab은 특징 플래그를 위해 Unleash 호환 API를 제공합니다.

GitLab에서 플래그를 활성화 또는 비활성화하여 응용 프로그램에서 활성화 또는 비활성화해야 할 기능을 결정할 수 있습니다.

GitLab에서 특징 플래그를 생성하고 응용 프로그램에서 해당 플래그 목록과 상태를 가져 오기 위해 API를 사용할 수 있습니다. 응용 프로그램은 GitLab과 통신하도록 구성되어야 하므로 호환되는 클라이언트 라이브러리를 사용하고 응용 프로그램에 특징 플래그 통합을 개발자가 사용할 것입니다.

특징 플래그 생성

특징 플래그를 생성하고 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. Deploy > 특징 플래그를 선택합니다.
  3. 새 특징 플래그를 선택합니다.
  4. 첫 글자로 시작하고 소문자, 숫자, 밑줄(_), 또는 대시(-)만 포함하고 대시(-) 또는 밑줄(_)로 끝나지 않는 이름을 입력합니다.
  5. 선택 사항입니다. 설명 (최대 255자).
  6. 특징 플래그에 전략을 추가하여 플래그 적용 방법을 정의합니다. 각 전략에는 유형 (기본값은 모든 사용자) 및 환경 (기본값은 모든 환경)을 포함합니다.
  7. 특징 플래그 생성을 선택합니다.

이러한 설정을 변경하려면 목록에서 특징 플래그 옆의 편집()을 선택합니다.

최대 특징 플래그 수

자체 관리 GitLab 인스턴스의 프로젝트 당 최대 특징 플래그 수는 200입니다. GitLab SaaS의 최대 수는 티어에 따라 결정됩니다:

티어 프로젝트당 특징 플래그(사람의 고정 기간) 프로젝트당 특징 플래그(자체 관리)
Free 50 200
Premium 150 200
Ultimate 200 200

특징 플래그 전략

하나의 전략을 여러 환경에 적용할 수 있습니다. GitLab 특징 플래그는 Unleash를 기반으로 하며, 세분화된 특징 플래그 제어를 위한 전략가 있습니다. GitLab 특징 플래그에는 여러 전략이 있을 수 있으며, 지원되는 전략은 다음과 같습니다:

전략은 특징 플래그를 생성하거나 플래그 생성 후 Deploy > 특징 플래그로 이동하여 기존 특징 플래그를 편집하여 추가할 수 있습니다. 편집()을 선택합니다.

퍼센트 롤아웃

페이지 뷰의 퍼센트에 대한 기능을 활성화하며, 구성 가능한 일관성을 가지고 있습니다. 이 일관성은 스티키니스(Stickiness)로도 불립니다. 이는 Gradual Rollout (flexibleRollout) Unleash 활성화 전략을 사용합니다.

다음을 기반으로 일관성을 구성할 수 있습니다:

  • 사용자 ID: 각 사용자 ID는 세션 ID를 무시하고 일관된 동작을 합니다.
  • 세션 ID: 각 세션 ID는 사용자 ID를 무시하고 일관된 동작을 합니다.
  • 랜덤: 일관된 동작이 보장되지 않습니다. 선택된 페이지 뷰의 퍼센트에 따라 기능이 무작위로 활성화됩니다. 사용자 ID와 세션 ID는 무시됩니다.
  • 가능한 ID: 사용자 상태에 기반하여 일관성 있는 동작을 시도합니다:
    • 사용자가 로그인한 경우, 사용자 ID를 기반으로 일관된 동작을 합니다.
    • 사용자가 익명인 경우, 세션 ID를 기반으로 일관된 동작을 합니다.
    • 사용자 ID나 세션 ID가 없는 경우에는 선택된 페이지 뷰의 퍼센트에 따라 기능이 무작위로 활성화됩니다.

예를 들어, 가능한 ID를 기반으로 15%의 값을 설정하여 15% 페이지 뷰에 대해 기능을 활성화할 수 있습니다. 인증된 사용자에 대해서는 사용자 ID를 기반으로, 익명 사용자의 경우에는 세션 ID를 기반으로 하여 활성화됩니다. 그리고 세션 ID가 제공되지 않는 경우에는 무작위로 기능이 활성화됩니다.

롤아웃 퍼센트는 0%에서 100%까지 설정할 수 있습니다.

사용자 ID를 기반으로 한 일관성을 선택하는 것은 사용자의 퍼센트 롤아웃과 동일한 방식으로 작동합니다.

경고: 랜덤을 선택하면 개별 사용자에 대한 일관되지 않은 애플리케이션 동작을 제공합니다.

사용자의 퍼센트

인증된 사용자의 퍼센트에 대한 기능을 활성화합니다. Unleash 활성화 전략인 gradualRolloutUserId를 사용합니다.

예를 들어, 15%의 값을 설정하여 15%의 인증된 사용자에 대한 기능을 활성화할 수 있습니다.

롤아웃 퍼센트는 0%에서 100%까지 설정할 수 있습니다.

인증된 사용자에 대해 일관된 애플리케이션 동작이 보장됩니다.

사용자 ID를 기반으로 한 퍼센트 롤아웃은 동일한 동작을 제공합니다. 파라미터 기반으로 프로를 선호하는 이유는 사용자의 퍼센트 보다 유연하기 때문입니다.

경고: 사용자의 퍼센트 전략이 선택된 경우, Unleash 클라이언트는 기능이 활성화되기 위해 사용자 ID를 반드시 제공해야 합니다. 루비 예제를 참조하세요.

사용자 ID

  • GitLab 12.2에서 도입되었습니다.
  • GitLab 12.6에서 환경별로 정의되도록 업데이트되었습니다.

대상 사용자 목록을 활성화합니다. Unleash UserIDs (userWithId) 활성화 전략를 사용하여 구현되었습니다.

사용자 ID를 쉼표로 구분된 값들의 목록으로 입력합니다(예를 들어, user@example.com, user2@example.com, 또는 username1,username2,username3 등). 사용자 ID는 애플리케이션 사용자의 식별자입니다. 이는 꼭 GitLab 사용자일 필요는 없습니다.

경고: 대상 사용자에 대해 기능을 활성화하기 위해 Unleash 클라이언트는 반드시 사용자 ID를 제공받아야 합니다. 루비 예제를 참조하세요.

사용자 목록

피처 플래그 UI에서 사용자 목록을 생성하거나 피처 플래그 사용자 목록 API를 사용하여 사용자 목록에 대한 기능을 활성화합니다. 사용자 ID와 유사하게, Unleash UserIDs (userWithId) 활성화 전략을 사용합니다.

특정 사용자에 대한 기능을 비활성화할 수 없지만, 사용자 목록을 기준으로 기능을 활성화하여 유사한 결과를 얻을 수 있습니다.

예를 들어:

  • 풀 사용자 목록 = 사용자1A, 사용자1B, 사용자2A, 사용자2B, 사용자3A, 사용자3B, ...
  • B 사용자를 제외한 풀 사용자 목록 = 사용자1A, 사용자2A, 사용자3A, ...

사용자 목록 생성

사용자 목록을 생성하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 배포 > 피처 플래그를 선택합니다.
  3. 사용자 목록 보기를 선택합니다.
  4. 새 사용자 목록을 선택합니다.
  5. 목록의 이름을 입력합니다.
  6. 생성을 선택합니다.

목록을 보려면 편집 ()을 선택하여 해당 목록의 사용자 ID를 볼 수 있습니다. 목록을 보는 동안 편집 ()을 선택하여 목록의 이름을 변경할 수 있습니다.

사용자를 사용자 목록에 추가

사용자를 사용자 목록에 추가하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 배포 > 기능 플래그를 선택합니다.
  3. 사용자를 추가하려는 목록 옆의 편집( )을 선택합니다.
  4. 사용자 추가를 선택합니다.
  5. 사용자 ID를 쉼표로 구분된 값 목록으로 입력합니다. 예를 들어, user@example.com, user2@example.com, 또는 username1,username2,username3 등입니다.
  6. 추가를 선택합니다.

사용자를 사용자 목록에서 제거

사용자를 사용자 목록에서 제거하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 배포 > 기능 플래그를 선택합니다.
  3. 변경하려는 목록 옆의 편집( )을 선택합니다.
  4. 제거하려는 ID 옆의 제거( )를 선택합니다.

코드 참조 검색

Tier: 프리미엄, 얼티밋 Offering: GitLab.com, Self-managed, GitLab Dedicated

코드 정리 중에 코드에서 기능 플래그를 제거하려면 해당 프로젝트에 대한 코드 참조를 찾습니다.

기능 플래그의 코드 참조를 검색하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 배포 > 기능 플래그를 선택합니다.
  3. 제거하려는 기능 플래그를 편집합니다.
  4. 더 많은 작업( )을 선택합니다.
  5. 코드 참조 검색을 선택합니다.

특정 환경에 대한 기능 플래그 비활성화

GitLab 13.0 및 이전 버전에서, 특정 환경에 대한 기능 플래그를 비활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 배포 > 기능 플래그를 선택합니다.
  3. 비활성화하려는 기능 플래그를 선택합니다.
  4. 상태 토글을 활성화하려면 GitLab 13.0 및 이전 버전에서: 환경에 대한 상태 토글을 슬라이드합니다. 또는 환경 사양을 삭제하려면 오른쪽에서 제거(X)를 선택합니다. GitLab 13.1 이상에서: 적용되는 각 전략에 대해 환경 아래에서 환경을 삭제합니다.
  5. 변경 사항 저장을 선택합니다.

모든 환경에 대한 기능 플래그 비활성화

모든 환경에 대한 기능 플래그를 비활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 배포 > 기능 플래그를 선택합니다.
  3. 비활성화하려는 기능 플래그의 상태 토글을 비활성화로 슬라이드합니다.

기능 플래그는 비활성화 탭에 표시됩니다.

응용 프로그램과 기능 플래그 통합

귀하의 응용 프로그램에 기능 플래그를 사용하려면 GitLab에서 액세스 자격 증명을 가져옵니다. 그런 다음 클라이언트 라이브러리로 응용 프로그램을 준비합니다.

액세스 자격 증명 가져오기

GitLab과 통신하기 위해 응용 프로그램이 필요로 하는 액세스 자격 증명을 가져오려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 배포 > 기능 플래그를 선택합니다.
  3. 다음을 보려면 구성을 선택합니다:
    • API URL: 응용 프로그램이 기능 플래그 목록을 가져오기 위해 연결하는 URL입니다.
    • 인스턴스 ID: 기능 플래그를 검색하는 데 권한을 부여하는 고유 토큰입니다.
    • 응용 프로그램 이름: 응용 프로그램이 실행되는 환경의 이름 (응용 프로그램 자체의 이름이 아님).

      예를 들어, 응용 프로그램이 프로덕션 서버에서 실행되는 경우 응용 프로그램 이름production 또는 비슷한 값일 수 있습니다. 이 값은 환경 사양 평가에 사용됩니다.

이러한 필드의 의미는 시간이 지남에 따라 변경될 수 있습니다. 예를 들어, 인스턴스 ID가 단일 토큰인지 여러 토큰인지, 환경에 할당된 토큰인지 확실하지 않습니다. 또한 응용 프로그램 이름은 실행 환경의 응용 프로그램 버전을 설명할 수도 있고, 실제로는 응용 프로그램 자체의 이름일 수도 있습니다.

클라이언트 라이브러리 선택

GitLab은 Unleash 클라이언트와 호환되는 단일 백엔드를 구현합니다.

Unleash 클라이언트를 사용하면 개발자는 응용 프로그램 코드에서 플래그의 기본 값을 정의할 수 있습니다. 각 기능 플래그 평가는 제공된 구성 파일에 플래그가 없는 경우 원하는 결과를 표현할 수 있습니다.

Unleash는 현재 다양한 언어 및 프레임워크에 대해 많은 SDK를 제공합니다.

기능 플래그 API 정보

API 콘텐츠는 다음을 참조하세요:

Go 어플리케이션 예제

Go 어플리케이션에서 기능 플래그를 통합하는 방법 예시입니다:

package main

import (
    "io"
    "log"
    "net/http"

    "github.com/Unleash/unleash-client-go/v3"
)

type metricsInterface struct {
}

func init() {
    unleash.Initialize(
        unleash.WithUrl("https://gitlab.com/api/v4/feature_flags/unleash/42"),
        unleash.WithInstanceId("29QmjsW6KngPR5JNPMWx"),
        unleash.WithAppName("production"), // 어플리케이션의 실행 환경에 맞게 설정
        unleash.WithListener(&metricsInterface{}),
    )
}

func helloServer(w http.ResponseWriter, req *http.Request) {
    if unleash.IsEnabled("my_feature_name") {
        io.WriteString(w, "기능이 활성화됨\n")
    } else {
        io.WriteString(w, "안녕, 세상!\n")
    }
}

func main() {
    http.HandleFunc("/", helloServer)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

루비 어플리케이션 예제

루비 어플리케이션에서 기능 플래그를 통합하는 방법 예시입니다.

Unleash 클라이언트에는 Percent rollout (logged in users) 롤아웃 전략이나 Target Users 목록을 사용하기 위한 사용자 ID가 제공됩니다.

#!/usr/bin/env ruby

require 'unleash'
require 'unleash/context'

unleash = Unleash::Client.new({
  url: 'http://gitlab.com/api/v4/feature_flags/unleash/42',
  app_name: 'production', # 어플리케이션의 실행 환경에 맞게 설정
  instance_id: '29QmjsW6KngPR5JNPMWx'
})

unleash_context = Unleash::Context.new
# 인증된 사용자의 ID로 "123"을 대체하세요.
# 문맥의 사용자 ID는 문자열이어야 합니다:
# https://unleash.github.io/docs/unleash_context
unleash_context.user_id = "123"

if unleash.is_enabled?("my_feature_name", unleash_context)
  puts "기능이 활성화됨"
else
  puts "안녕, 세상!"
end

Unleash Proxy 예제

Unleash Proxy 버전 0.2부터 프록시는 기능 플래그와 호환됩니다.

GitLab.com의 프로덕션 환경에서는 Unleash Proxy를 사용해야 합니다. 자세한 내용은 성능 노트를 참조하세요.

프로젝트의 기능 플래그에 연결하려면 다음 명령을 실행하여 Docker 컨테이너를 시작하세요:

docker run \
  -e UNLEASH_PROXY_SECRETS=<secret> \
  -e UNLEASH_URL=<project feature flags URL> \
  -e UNLEASH_INSTANCE_ID=<project feature flags instance ID> \
  -e UNLEASH_APP_NAME=<project environment> \
  -e UNLEASH_API_TOKEN=<tokenNotUsed> \
  -p 3000:3000 \
  unleashorg/unleash-proxy
변수
UNLEASH_PROXY_SECRETS Unleash Proxy 클라이언트를 구성하는 데 사용되는 공유 비밀.
UNLEASH_URL 프로젝트의 API URL. 자세한 내용은 액세스 자격 취득을 참조하세요.
UNLEASH_INSTANCE_ID 프로젝트의 인스턴스 ID. 자세한 내용은 액세스 자격 취득을 참조하세요.
UNLEASH_APP_NAME 어플리케이션이 실행되는 환경의 이름. 자세한 내용은 액세스 자격 취득을 참조하세요.
UNLEASH_API_TOKEN Unleash Proxy 시작에 필요하지만 GitLab에 연결하는 데는 사용되지 않습니다. 임의의 값을 설정할 수 있습니다.

Unleash Proxy 사용 시 주의해야 할 점은 각 프록시 인스턴스가 UNLEASH_APP_NAME에 지정된 환경의 플래그만 요청할 수 있다는 제한입니다. 프록시는 클라이언트를 대표하여 이를 GitLab에 전송하므로 클라이언트가 이를 무시할 수 없게 됩니다.

기능 플래그 관련 이슈

자세한 내용: Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

관련된 이슈를 기능 플래그에 연결할 수 있습니다. 기능 플래그의 Linked issues 섹션에서 + 버튼을 클릭하고 이슈 참조 번호 또는 전체 이슈 URL을 입력하세요. 그러면 이슈가 관련 기능 플래그 및 그 반대로 표시됩니다.

이 기능은 관련된 이슈 기능과 유사합니다.

성능 요소

GitLab 기능 플래그는 모든 응용 프로그램에서 사용할 수 있습니다. 대규모 애플리케이션은 고급 구성이 필요할 수 있습니다. 이 섹션에서는 조직이 기능을 사용하기 전에 무엇을 해야 하는지를 파악하는 데 도움이 되는 성능 요소에 대해 설명합니다. 자세한 내용을 살펴보기 전에 작동 방식 섹션을 읽어보세요.

응용 프로그램 노드에서 지원되는 최대 클라이언트

GitLab은 속도 제한에 도달할 때까지 가능한한 많은 클라이언트 요청을 수락합니다. 기능 플래그 API는 인증되지 않은 트래픽(특정 IP 주소에서)으로 간주됩니다. GitLab.com의 경우 특정 제한 사항을 참조하십시오.

SDK에서 폴링 속도는 구성할 수 있습니다. 모든 클라이언트가 동일한 IP에서 요청하는 경우:

  • 1분당 한 번 요청… 500개의 클라이언트를 지원할 수 있습니다.
  • 15초당 한 번 요청… 125개의 클라이언트를 지원할 수 있습니다.

더 확장 가능한 솔루션을 찾는 응용 프로그램의 경우 Unleash Proxy를 사용해야 합니다. GitLab.com에서는 Unleash Proxy를 사용하여 엔드포인트 전체에 대한 속도 제한이 걸릴 확률을 줄여야 합니다. 이 프록시 서버는 서버와 클라이언트 사이에 위치하며, 클라이언트 그룹을 대신하여 서버에 요청을 보냅니다. 따라서 발신 요청의 수를 크게 줄일 수 있습니다. 여전히 429 응답을 받는다면 Unleash Proxy의 UNLEASH_FETCH_INTERVAL 값을 늘리세요.

현재 속도 제한에 더 많은 처리량을 부여하기 위한 이슈도 있습니다.

네트워크 오류로부터 복구

일반적으로 Unleash 클라이언트에는 서버가 오류 코드를 반환할 때 폴백 메커니즘이 있습니다. 예를 들어, unleash-ruby-client는 응용 프로그램이 현재 상태에서 계속 실행할 수 있도록 로컬 백업에서 플래그 데이터를 읽습니다.

자세한 내용은 SDK 프로젝트의 문서를 참조하세요.

자체 관리형 GitLab

기능적으로는 차이가 없습니다. SaaS와 자체 관리형은 동일하게 작동합니다.

확장성 측면에서는 GitLab 인스턴스의 사양에 따라 다릅니다. 예를 들어, GitLab.com은 HA(High Availability) 아키텍처를 사용하여 많은 동시 요청을 처리할 수 있습니다. 그러나 성능이 유사하지 않은 기기에 있는 자체 관리형 인스턴스는 비교할 수 없는 성능을 제공하지 않을 수 있습니다. 자세한 내용은 참조 아키텍처를 참조하세요.