45. LaunchDarkly와 Azure Devops로 기능 플래그 관리
<참조> https://azuredevopslabs.com/labs/vstsextend/launchdarkly/
이번 실습은 5번을 시도해 봤으나 에러가 없었음에도 불구하고 최종적으로 기능 플래그가 적용되지 않았다. 혹시 진행과정에서 잘못된 부분을 발견하시는 분이 있다면 바로잡아 주시길~~~^
개요
LaunchDarkly는 기능 플래그를 서비스로 제공하고 개발자가 빠르고 안전하게 반복할 수 있도록 해주는 지속적인 전달 플랫폼이다. LaunchDarkly는 코드 배포에서 기능 롤아웃을 분리하고 기능 플래그를 대규모로 관리할 수 있는 권한을 제공한다. LaunchDarkly와 Azure DevOps 서비스의 통합을 통해 개발자는 적은 위험으로 자신 있게 릴리즈 할 수 있다. 기능 플래그 롤아웃을 Azure DevOps 작업 항목에 묶어서 누가 언제 무엇을 보는지 완전히 제어할 수 있다. Azure DevOps 릴리즈 파이프라인의 컨텍스트에서 피쳐 플래그를 관리함으로써 DevOps의 진정한 힘을 드러낸다.
이 랩에서 다루는 내용
이번 랩에서는 다음을 다루게 될 것이다.
- ASP.NET MVC 애플리케이션 대한 매우 간단한 기능 플래그를 구현하는 방법
- LaunchDarkly를 Azure DevOps와 통합하는 방법
- Azure DevOps 릴리스 파이프 라인에서 LaunchDarkly 기능 플래그를 롤아웃하는 방법
시작하기 전에
- 다음 실습을 시작하기 전에 시작하기 페이지를 참조한다.
- LaunchDarkly 계정 : LaunchDarkly 계정이 필요하다. 아직 평가판 계정이 없는 경우 여기에서 등록한다.
- .Net Core SDK가 설치된 Visual Studio 2017 버전 15.4 이상
- Azure DevOps 데모 생성기를 사용하여 Azure DevOps 조직에 프로젝트를 프로비전한다. 이 URL은 데모 생성기에서 LaunchDarkly 템플릿을 자동으로 선택한다. 다른 프로젝트를 시도하려면 대신 https://azuredevopsdemogenerator.azurewebsites.net/ URL을 사용한다.
간단한 연습을 따라 Azure DevOps 데모 생성기를 사용하는 방법을 알아본다.
실습 1: LaunchDarkly에서 기능 플래그 생성
1. LaunchDarkly 계정에 로그인한다. 그런 다음 첫 번째 기능 플래그를 만들 수있는 포털로 이동한다. CREATE FLAG를 클릭한다.
2. 기능 플래그 만들기 창에서 기능 플래그 이름으로 Member Portal을 입력하고 Save Flag를 클릭한다.
3, Member Portal이라는 플래그를 만들었다. 이 플래그를 사용하여 ASP.NET MVC 웹앱에서 Member Portal 기능의 가시성을 결정한다고 가정한다.
4. LaunchDarkly를 애플리케이션에 통합하려면 SDK 키가 필요하다. 포털의 Account settings을 실행하면 미리 정의된 두 가지 환경이 있음을 알 수 있다. 이 프로젝트에는 프로덕션 환경 SDK 키를 사용할 수 있다. SDK 키를 복사하여 메모장에 붙여 넣는다. 다음 실습에서 이 키가 필요하다.
실습 2: 웹 애플리케이션에 LaunchDarkly 통합
1. 아래 표시된대로 LaunchDarkly 프로젝트에서 Commit mention linking 토글이 켜져 있는지 확인한다. 커밋 주석에 언급된 작업 항목에 대한 링크가 자동으로 생성된다.
2. 이제 프로젝트 포털 내의 Repos로 이동하여 Clone을 선택한 다음 Clone in Visual Studio를 선택한다.
3. Azure DevOps Services에 로그인하라는 메시지가 표시되면 Visual Studio에서 코드가 열리면 (위에서 azure devops 프로젝트를 만드는 데 사용한) 동일한 자격 증명 을 사용하고 로컬 경로를 선택하여 리포지토리를 복제하고 Clone을 선택한다.
4. Team Explorer에서 Branches를 선택하고 launch-darkly branch를 마우스 오른쪽 버튼으로 클릭하고 checkout을 선택한다.
(Home 버튼을 클릭하고) PartsUnlimited.sln을 선택하여 프로젝트를 연다.
5. LaunchDarkly를 .NET 애플리케이션과 통합하려면 LaunchDarkly client와 함께 NuGet 패키지를 설치해야 한다. 현재 프로젝트에서는 사용 편의성을 위해 이미 추가했다.
6. 애플리케이션을 로컬로 한 번 실행한다. 애플리케이션의 오른쪽 모서리에서 Member Portal을 볼 수 있다.
이 Member Portal 모듈이 새로운 기능이고 LaunchDarkly 기능 플래그를 사용하여 이 기능을 제어하고 싶다고 가정하여 LaunchDarkly에서 플래그를 켤 때 이 기능만 사용자에게 표시되지 않도록 한다.
7. \PartsUnlimitedWebsite\Controllers 경로에서 HomeController.cs를 열고 다음 코드 조각으로 코드를 바꾼다.
8. \PartsUnlimitedWebsite\Controllers 경로에서 AccountController.cs를 열고 다음 코드 조각으로 코드를 바꾼다.
9. PartsUnlimitedWebsite\Views\Shared 경로에서 _Layout.chtml을 열고 55 행 `@await Html.PartialAsync(“_Login”)`을 아래 코드로 바꾼다.
@if (ViewBag.togglevalue == true) { @await Html.PartialAsync("_Login") } |
10. Home Controller.cs 및 AccountController.cs에서 __YourLaunchDarklySDKKey__를 이전 실습에서 복사한 LaunchDarkly 계정 SDK 키로 바꾼다. 이는 환경별 SDK 키로 새 LDClient를 생성하는 것이다.
static LdClient client = new LdClient("__YourLaunchDarklySDKKey__"); |
참고: 그래서 우리는 무엇을 했는가? HomeController는 정적 LaunchDarkly 클라이언트를 초기화하는 것으로 시작한다. 그리고 MemberPortal을 보는 방법은 LaunchDarkly에서 기능 플래그 토글이 켜져 있는지 또는 꺼져 있는지 확인하기 위해 수정된다. 마지막으로 _Layout.cshtml 페이지는 토글값을 확인하고 플래그가 켜지면 회원 포털 링크를 렌더링 한다.
11. HomeController.cs에서 57 행에서 74 행까지 코드를 살펴보면
//LaunchDarkly start
User user = LaunchDarkly.Client.User.WithKey("administrator@test.com");
bool value = client.BoolVariation("member-portal", user, false);
if (value)
{
ViewBag.Message = "Your application description page.";
ViewData["togglevalue"] = value;
return View(viewModel);
}
else
{
return View(viewModel);
}
// return View(viewModel);
}
//LaunchDarkly End
기능 플래그를 요청할 때 사용자 개체를 전달해야 한다. 그래서 우리는 처음에 사용자 객체를 초기화하고 있다. LaunchDarkly에 지정된 키를 가진 사용자가 존재하는지 여부를 확인하는 데 사용된다. 이 샘플에서는 사용자 값을 하드 코딩했다. 실시간으로 로그인 한 사용자, 데이터베이스 등에서 발생할 수 있다.
그리고 나서 우리는 LaunchDarkly에서 특징 플래그 값을 확인하기 위해 BoolVariation 메소드를 호출하고 있다. 플래그가 사실인 경우 _Layout.chtml에서 멤버 포털 모듈을 보기 위해 사용되는 [ViewData[“togglevalue”]를 참으로 설정한다. 만약 그것이 거짓이라면 그것은 회원 포털 모듈을 보여주지 않을 것이다.
마찬가지로 AccountController.cs에서도 Member portal 아이콘을 클릭하면 로그인 페이지를 표시하는 책임을 지는 Login() 방법에 LaunchDarkly 코드를 추가했다. LaunchDarkly의 플래그가 거짓인 경우 HttpNotFound 오류가 로그인 페이지에 반환된다.
12. 이제 모든 변경사항을 저장하고 애플리케이션을 로컬로 시작한다. 생성한 MemberPortal 플래그가 꺼져 있으므로 아래와 같이 Member portal 링크를 볼 수 없다.
그래서 LaunchDarkly를 이용하여 기능 플래그 제어를 구현하였다. 이 랩에서 수동으로 LaunchDarkly 포털에서 토글을 사용할 수 있지만 LaunchDarkly 확장을 사용하여 Azure DevOps 릴리즈 파이프 라인의 기능 플래그를 켜도록 시도할 것이다. 릴리즈 프로세스의 일부로 피쳐 플래그를 포함하려면 이 변경사항을 Azure DevOps 작업 항목과 연관시켜 완전한 제어를 해야 한다.
13. Azure DevOps - Board에서 Implement로 조회하여 Implement FeatureFlag Management using LauchDarkly를 선택하고 자신에게 Assign하고 할당된 작업 항목 ID를 기록해 둔다. (프로젝트 자동 생성 시 자신에게 할당이 안되어 있으므로 원문처럼 Visual Studio에서 작업 항목 ID를 자동으로 조회할 수 없다. Azure 보드에서 수동으로 확인한다.)
14. 이제 Team Explorer의 Changes 탭으로 이동하고 해시 태그가 있는 작업 항목 ID (예 : LaunchDarkly 통합 #1692)가 붙은 주석을 입력하고 Commit All and Push를 선택하여 모든 변경사항을 리포지토리에 푸시한다.
실습 3: 릴리즈 중 자동 LaunchDarkly 기능 플래그 롤아웃
1. Azure DevOps 서비스와 통합하려면 LaunchDarkly 액세스 토큰이 필요하다. LaunchDarkly의 계정 설정 페이지에 있는 액세스 토큰 탭을 방문한다. 없는 경우 하나를 만들고 액세스 토큰을 클립보드에 복사한다. 토큰에 적어도 Write 액세스 권한이 있는지 확인한다.
2. Azure DevOps 프로젝트에서 Project Settings → Pipelines → Service connections로 이동하여 Create service connection을 선택하고 LaunchDarkly를 선택한다.
3. Add LaunchDarkly service connection 창에서 연결 이름을 지정하고 첫 번째 단계에서 복사 한 액세스 토큰을 붙여넣고 확인을 클릭한다.
4. 할당된 작업 항목을 열고 LaunchDarkly 탭에서 MemberPortal 기능 플래그 옆의 라디오 버튼을 선택하고 변경사항을 저장한다.
5. 파이프라인 아래의 Releases로 이동한다. LaunchDarkly_CD 파이프라인을 선택하고 Edit을 클릭한다.
6. Stage 1을 선택하여 파이프라인의 태스크를 확인한다.
7. 아래와 같이 세 가지 태스크가 표시된다.
- Azure Resource Group Deployment : 이 태스크는 ARM 템플릿을 사용하여 PartsUnlimited 웹 사이트에 대한 Azure 앱 서비스를 배포하는 데 도움을 준다.
- LaunchDarkly Rollout : 이 태스크는 LaunchDarkly 구독에서 기능 플래그를 롤아웃 및 켜도록 돕는다.
- Azure App Service Deploy : 이 태스크는 첫 번째 태스크에서 만든 앱 서비스에 PartsUnlimited 웹앱을 배포한다.
8. Azure Resource Group Deployment 태스크를 선택하고 Azure 구독을 선택한다. 그런 다음 권한 부여를 클릭하여 Azure 서비스 연결을 구성한다.
9. LaunchDarkly 태스크를 선택하고 계정 드롭 다운에서 LaunchDarkly 서비스 연결을 선택한다.
10. Azure App Service Deploy 태스크를 선택하고 Azure 구독을 선택한다.
11. Variables를 선택하고 launchdarkly-pat 변수에 대해 Personal Access Token (PAT)을 입력한다. Azure DevOps 서비스에 대한 개인 액세스 토큰을 만드는 방법을 알고 싶다면 여기를 클릭한다. 또한 launchdarkly-account-name 및 launchdarkly-project-name 변수를 Azure DevOps 계정 이름과 프로젝트 이름으로 기입한다 (이미 되어 있다). 변경사항을 Save한다.
12. 이제 릴리즈 파이프라인을 구성하는 작업을 완료한다. Pipelines → Pipelines에서 LaunchDarkly-CI를 선택하여 빌드를 수행한다. 이 CI 파이프라인에는 .Net Core 프로젝트를 컴파일하는 태스크가 있다. .Net Core 프로젝트를 빌드하는 방법에 대한 자세한 지침은 여기를 참조한다. 빌드가 성공적으로 완료되면 LaunchDarkly에서 앱 및 원격 설치 기능 플래그를 배포하기 위해 릴리즈가 트리거된다.
13. 릴리즈가 성공적으로 완료되면 LaunchDarkly 대시 보드에서 MemberPortal 기능 플래그가 켜져있는 것을 볼 수 있다.
14. Azure Portal로 이동하여 릴리즈 파이프라인으로 배포된 애플리케이션을 찾는다.
웹 사이트에서 Member Portal이 활성화 된 것을 확인할 수 있다.