- 작동 방식
- 기능 플래그 생성
- 기능 플래그의 최대 수
- 기능 플래그 전략
- 코드 참조 검색
- 특정 환경에서 기능 플래그 비활성화
- 모든 환경에서 기능 플래그 비활성화
- 애플리케이션과 기능 플래그 통합하기
- 기능 플래그 관련 문제
- 성능 요소
기능 플래그
기능 플래그를 사용하면 애플리케이션의 새로운 기능을 생산 환경에 더 작은 배치로 배포할 수 있습니다.
사용자 하위 집합에 대해 기능을 켜고 끌 수 있으며, 이를 통해 지속적인 배포를 달성할 수 있습니다.
기능 플래그는 위험을 줄이는 데 도움이 되며, 제어된 테스트를 수행하고 기능 제공을 고객 출시와 분리할 수 있습니다.
기능 플래그의 실제 예시는 기능 플래그로 위험 제거하기를 참조하세요.
클릭 가능한 데모는 기능 플래그를 참조하세요.
이 기능 플래그 콘텐츠를 참조하세요.
작동 방식
GitLab은 기능 플래그를 위한 Unleash-호환 API를 제공합니다.
GitLab에서 플래그를 활성화하거나 비활성화함으로써, 애플리케이션이
어떤 기능을 활성화하거나 비활성화할지를 결정할 수 있습니다.
GitLab에서 기능 플래그를 생성하고 애플리케이션의 API를 사용하여 기능 플래그 목록과 해당 상태를 가져올 수 있습니다.
애플리케이션은 GitLab과 통신하도록 구성되어야 하며, 호환 가능한 클라이언트 라이브러리를 사용하고
애플리케이션에 기능 플래그 통합하기가 개발자에게 달려 있습니다.
기능 플래그 생성
기능 플래그를 생성하고 활성화하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 배포 > 기능 플래그를 선택합니다.
- 새 기능 플래그를 선택합니다.
- 문자로 시작하고 소문자, 숫자, 밑줄(
_
),
또는 대시(-
)만 포함하며 대시(-
)나 밑줄(_
)로 끝나지 않는 이름을 입력합니다. - 선택 사항. 설명을 입력합니다 (최대 255자).
- 기능 플래그 전략을 추가하여 플래그가 적용되는 방식을 정의합니다. 각 전략에 대해 유형(기본값은 모든 사용자)
및 환경(기본값은 모든 환경)을 포함합니다. - 기능 플래그 만들기를 선택합니다.
이 설정을 변경하려면, 목록에서 원하는 기능 플래그 옆에 있는 편집({연필})을 선택하세요.
기능 플래그의 최대 수
자체 관리 GitLab 인스턴스의 프로젝트당 최대 기능 플래그 수는 200입니다.
GitLab SaaS의 경우, 최대 숫자는 Tier에 따라 결정됩니다:
Tier | 프로젝트당 기능 플래그 (SaaS) | 프로젝트당 기능 플래그 (자체 관리) |
---|---|---|
Free | 50 | 200 |
Premium | 150 | 200 |
Ultimate | 200 | 200 |
기능 플래그 전략
여러 환경에 걸쳐 기능 플래그 전략을 적용할 수 있으며,
전략을 여러 번 정의할 필요가 없습니다.
GitLab 기능 플래그는 Unleash를 기반으로 합니다. Unleash에서는
세밀한 기능 플래그 제어를 위한 전략이 있습니다.
GitLab 기능 플래그는 여러 전략을 가질 수 있으며, 지원되는 전략은 다음과 같습니다:
전략은 기능 플래그 생성하기 또는
기능 플래그 생성 후 배포 > 기능 플래그로 이동하여 기존 기능 플래그를 편집하여 추가할 수 있습니다.
모든 사용자
모든 사용자에게 기능을 활성화합니다. 이는 표준(default
) Unleash 활성화 전략을 사용합니다.
백분율 롤아웃
페이지 조회수의 비율에 대해 기능을 활성화하며, 일관된 행동을 설정할 수 있습니다. 이 일관성은 스티키니스로도 알려져 있습니다. 이는 점진 롤아웃(flexibleRollout
) Unleash 활성화 전략을 사용합니다.
일관성을 다음을 기반으로 구성할 수 있습니다:
- 사용자 ID: 각 사용자 ID는 세션 ID를 무시하고 일관된 행동을 가지고 있습니다.
- 세션 ID: 각 세션 ID는 사용자 ID를 무시하고 일관된 행동을 가지고 있습니다.
- 무작위: 일관된 행동이 보장되지 않습니다. 기능은 선택된 페이지 조회수의 비율에 대해 무작위로 활성화됩니다. 사용자 ID와 세션 ID는 무시됩니다.
-
사용 가능한 ID: 사용자 상태에 따라 일관된 행동을 시도합니다:
- 사용자가 로그인하면, 사용자 ID를 기반으로 일관된 행동을 만듭니다.
- 사용자가 익명일 경우, 세션 ID를 기반으로 일관된 행동을 만듭니다.
- 사용자 ID 또는 세션 ID가 없으면, 기능은 선택된 페이지 조회수의 비율에 대해 무작위로 활성화됩니다.
예를 들어, 사용 가능한 ID를 기반으로 15%의 값을 설정하면 페이지 조회수의 15%에 대해 기능이 활성화됩니다. 인증된 사용자는 사용자 ID를 기반으로 하며, 세션 ID가 있는 익명 사용자는 사용자 ID가 없으므로 세션 ID를 기반으로 합니다. 세션 ID가 제공되지 않으면 무작위로 돌아갑니다.
롤아웃 비율은 0%에서 100%까지 가능합니다.
사용자 ID를 기반으로 일관성을 선택하는 것은 사용자 비율 롤아웃과 동일하게 작동합니다.
경고: 무작위를 선택하면 개별 사용자에 대한 일관되지 않은 애플리케이션 행동을 제공합니다.
사용자 비율
인증된 사용자의 비율에 대해 기능을 활성화합니다. 이는 Unleash 활성화 전략 gradualRolloutUserId
을 사용합니다.
예를 들어 15%의 값을 설정하면 인증된 사용자의 15%에 대해 기능이 활성화됩니다.
롤아웃 비율은 0%에서 100%까지 가능합니다.
스티키니스(같은 사용자에 대한 일관된 애플리케이션 행동)는 인증된 사용자에게 보장되지만, 익명 사용자에게는 보장되지 않습니다.
사용자 ID를 기반으로 한 백분율 롤아웃은 같은 행동을 합니다. 우리는 비율 롤아웃을 사용하는 것이 사용자 비율보다 유연하기 때문에 권장합니다.
경고: 사용자 비율 전략이 선택되면, Unleash 클라이언트는 기능이 활성화되기 위해 사용자 ID를 반드시 제공해야 합니다. 아래 루비 예제를 참조하세요.
사용자 ID
대상 사용자 목록에 대해 기능을 활성화합니다. 이는 Unleash UserIDs(userWithId
) 활성화 전략을 사용하여 구현됩니다.
사용자 ID를 쉼표로 구분된 목록으로 입력합니다(예: user@example.com, user2@example.com
또는 username1,username2,username3
등).
사용자 ID는 애플리케이션 사용자의 식별자입니다. GitLab 사용자가 아니어도 됩니다.
경고: 대상 사용자에게 기능이 활성화되기 위해 Unleash 클라이언트는 사용자 ID를 반드시 제공해야 합니다. 아래 루비 예제를 참조하세요.
사용자 목록
사용자 목록 기능을 활성화합니다 기능 플래그 UI에서, 또는 기능 플래그 사용자 목록 API를 통해.
사용자 ID와 유사하게, Unleash UsersIDs (userWithId
) 활성화 전략을 사용합니다.
특정 기능을 사용자에게 비활성화할 수는 없지만, 사용자 목록에 대해 활성화하여 유사한 결과를 달성할 수 있습니다.
예를 들어:
-
전체 사용자 목록
=User1A, User1B, User2A, User2B, User3A, User3B, ...
-
B 사용자를 제외한 전체 사용자 목록
=User1A, User2A, User3A, ...
사용자 목록 만들기
사용자 목록을 만들려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 배포 > 기능 플래그를 선택합니다.
- 사용자 목록 보기를 선택합니다.
- 새 사용자 목록을 선택합니다.
- 목록의 이름을 입력합니다.
- 생성을 선택합니다.
목록의 사용자 ID는 해당 목록 옆에 있는 편집 ({연필})을 선택하여 확인할 수 있습니다.
목록을 볼 때 편집 ({연필})을 선택하여 이름을 변경할 수 있습니다.
사용자 목록에 사용자 추가하기
사용자 목록에 사용자를 추가하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 배포 > 기능 플래그를 선택합니다.
- 사용자를 추가할 목록 옆에 있는 편집 ({연필})을 선택합니다.
- 사용자 추가를 선택합니다.
- 사용자 ID를 콤마로 구분된 값 목록으로 입력합니다. 예:
user@example.com, user2@example.com
, 또는username1,username2,username3
등. - 추가를 선택합니다.
사용자 목록에서 사용자 제거하기
사용자 목록에서 사용자를 제거하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 배포 > 기능 플래그를 선택합니다.
- 변경할 목록 옆에 있는 편집 ({연필})을 선택합니다.
- 제거할 ID 옆에 있는 제거 ({제거})를 선택합니다.
코드 참조 검색
청소 중 코드에서 기능 플래그를 제거하려면, 해당 기능에 대한 프로젝트 참조를 찾습니다.
기능 플래그의 코드 참조를 검색하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 배포 > 기능 플래그를 선택합니다.
- 제거할 기능 플래그를 편집합니다.
- 추가 작업 ()을 선택합니다.
- 코드 참조 검색을 선택합니다.
특정 환경에서 기능 플래그 비활성화
특정 환경에서 기능 플래그를 비활성화하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 배포 > 기능 플래그를 선택합니다.
- 비활성화할 기능 플래그에 대해 편집 ({연필})을 선택합니다.
- 플래그를 비활성화하려면:
- 해당하는 각 전략에 대해 환경 아래에서 환경을 삭제합니다.
- 변경 사항 저장을 선택합니다.
모든 환경에서 기능 플래그 비활성화
모든 환경에서 기능 플래그를 비활성화하려면:
-
왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
-
Deploy > Feature flags를 선택합니다.
-
비활성화하려는 기능 플래그의 상태 토글을 Disabled로 슬라이드합니다.
기능 플래그는 Disabled 탭에 표시됩니다.
애플리케이션과 기능 플래그 통합하기
애플리케이션과 기능 플래그를 사용하려면 GitLab에서 액세스 자격 증명을 받습니다.
그런 다음 클라이언트 라이브러리로 애플리케이션을 준비합니다.
액세스 자격 증명 받기
애플리케이션이 GitLab과 통신하는 데 필요한 액세스 자격 증명을 받으려면:
-
왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
-
Deploy > Feature flags를 선택합니다.
-
Configure를 선택하여 다음을 확인합니다:
- API URL: 클라이언트(애플리케이션)가 기능 플래그 목록을 가져오기 위해 연결하는 URL입니다.
- Instance ID: 기능 플래그 검색을 승인하는 고유 토큰입니다.
-
Application name: 애플리케이션이 실행되는 environment의 이름입니다
(애플리케이션 자체의 이름이 아님).예를 들어, 애플리케이션이 프로덕션 서버에서 실행된다면, Application name은
production
또는 유사한 이름일 수 있습니다. 이 값은 환경 사양 평가에 사용됩니다.
이 필드의 의미는 시간이 지남에 따라 변경될 수 있습니다. 예를 들어, Instance ID가 단일 토큰인지 여러 토큰인지 확실하지 않습니다. Environment에 할당됩니다. 또한 Application name은 실행 환경 대신 애플리케이션 버전을 설명할 수 있습니다.
클라이언트 라이브러리 선택하기
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))
}
Ruby 애플리케이션 예제
Ruby 애플리케이션에서 기능 플래그를 통합하는 방법의 예는 다음과 같습니다.
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
# "123"을 인증된 사용자의 ID로 교체합니다.
# 컨텍스트의 사용자 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 |
프로젝트의 Instance ID입니다. 자세한 내용은 액세스 자격 증명 가져오기를 참고하세요. |
UNLEASH_APP_NAME |
애플리케이션이 실행되는 환경의 이름입니다. 자세한 내용은 액세스 자격 증명 가져오기를 참고하세요. |
UNLEASH_API_TOKEN |
Unleash Proxy를 시작하는 데 필요하지만 GitLab에 연결하는 데는 사용되지 않습니다. 아무 값으로 설정할 수 있습니다. |
Unleash Proxy를 사용할 때의 제한 사항은 각 프록시 인스턴스가 UNLEASH_APP_NAME
에 명명된 환경에 대해서만 플래그를 요청할 수 있다는 것입니다. 프록시는 클라이언트를 대신하여 GitLab에 이를 전송하므로, 클라이언트에서 이를 재정의할 수 없습니다.
기능 플래그 관련 문제
기능 플래그에 관련 문제를 연결할 수 있습니다. 기능 플래그 연결된 문제 섹션에서, +
버튼을 선택하고 문제 참조 번호 또는 문제의 전체 URL을 입력하세요. 그러면 문제가 관련 기능 플래그에 나타나며 그 반대도 마찬가지입니다.
이 기능은 연결된 문제 기능과 유사합니다.
성능 요소
GitLab 기능 플래그는 모든 애플리케이션에서 사용할 수 있습니다. 대규모 애플리케이션은 사전 구성이 필요할 수 있습니다.
이 섹션에서는 기능을 사용하기 전에 수행해야 할 작업을 식별하는 데 도움이 되는 성능 요소를 설명합니다. 자세한 내용을 보기 전에 작동 방식 섹션을 읽어보세요.
애플리케이션 노드에서 지원되는 최대 클라이언트 수
GitLab은 요율 제한에 도달할 때까지 가능한 많은 클라이언트 요청을 수락합니다. 기능 플래그 API는 (주어진 IP 주소에서) 인증되지 않은 트래픽으로 간주됩니다. GitLab.com을 위한 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 아키텍처를 사용하므로 많은 동시 요청을 처리할 수 있습니다. 하지만 성능이 떨어지는 머신에서의 셀프 관리형 인스턴스는 유사한 성능을 제공하지 않을 것입니다.
자세한 정보는 참조 아키텍처를 참조하세요.