해결책
Cloudflare Workers에는 이미 특정 업로드 버전을 가리키는 Version URL이 있었지만, 이는 프로덕션 리소스만 가리킬 수 있었고 변경 사항마다 격리된 환경을 만들지 못했습니다. 따라서 더 큰 변경을 안전하게 테스트하려면 공유 스테이징 상태를 위험에 빠뜨리거나 환경마다 별도의 Worker를 세워야 했습니다. 에이전트 지원 개발이 더 많고 더 큰 변경을 파이프라인으로 밀어내면서, 에이전트의 속도를 늦추지 않으면서 병합 전에 더 많은 테스트가 필요해졌습니다.
Worker Previews는 브랜치 모델을 코드 너머로 확장합니다. 어떤 브랜치에서든 npx wrangler preview를 실행하면 자체 URL과 구성을 가진 격리된 환경이 생성되며, 브랜치별로 재정의할 수 있는 기본 구성을 상속합니다. 더 어려운 문제는 상태였습니다. Durable Objects는 하나의 인스턴스가 자체 스토리지를 소유하는 싱글턴 모델을 사용하므로, Preview가 프로덕션의 네임스페이스를 공유하면 실패한 마이그레이션이 라이브 트래픽을 수정할 수 있었습니다. 해결책은 Preview마다 새로운 Durable Object 네임스페이스를 생성하고, ctx.exports를 통해 해석하여 동일한 코드가 프로덕션과 Preview에서 서로 다른 네임스페이스에 도달하도록 하는 것입니다.
Cloudflare는 이 기능을 CloudflareOS에서 직접 사용했습니다. CloudflareOS는 에이전트가 권한 범위가 지정된 'Gatekeepers'를 통해 Google, GitHub, Slack 같은 서비스와 작업할 수 있게 하는 자체 오픈소스 플랫폼입니다. Gatekeeper 버그, OAuth 콜백, 승인 흐름, 권한 상태가 잘못 상호작용하는 문제는 전체 시스템이 함께 실행될 때만 드러나므로, 팀은 검토 중인 모든 변경에 대해 CloudflareOS의 격리된 Preview를 배포하고 병합 전에 전체 워크플로를 실행합니다.
달성한 것
git 브랜칭을 코드에서 환경과 상태로 확장
Preview마다 새로운 Durable Object 네임스페이스와 Container 애플리케이션을 자동으로 프로비저닝하면 Preview가 프로덕션 트래픽을 처리하는 스토리지를 조용히 변경할 수 있는 실패 모드를 차단합니다.
Preview가 상속하고 브랜치별로 재정의할 수 있는 재사용 가능한 기본 구성을 정의하면, 별도 환경이 요구했던 방식처럼 브랜치마다 시크릿과 바인딩을 처음부터 다시 구성할 필요가 없습니다.
CloudflareOS의 Gatekeepers에서 직접 사용한 것은 격리된 컴포넌트 테스트로는 버그를 잡을 수 없는 사례를 겨냥한 것입니다. OAuth, 권한, 승인 흐름이 함께 실행될 때만 버그가 나타나기 때문입니다.
Preview별로 관측성을 범위 지정하면 실패를 프로덕션 트래픽이나 다른 진행 중인 변경에 섞이지 않고 해당 브랜치 자체의 트레이스와 로그에서 진단할 수 있습니다.
'스테이징에서는 작동하지만 프로덕션에서는 깨진다'는 상황이 반복된다면, 대부분의 도구가 공유 상태로 남겨두는 상태 저장 부분을 포함해 모든 환경을 코드 브랜치만큼 저렴하고 격리된 상태로 프로비저닝하게 하십시오.
그 이후
Cloudflare는 출시 시점 기준으로 남은 격차를 다음과 같이 나열합니다. Preview에서 호출된 서비스 바인딩은 여전히 일치하는 Preview가 아니라 바인딩된 Worker의 프로덕션 배포를 호출하고, Preview는 Queues로 메시지를 보낼 수 있지만 아직 소비할 수는 없으며, 영구 스테이징이나 QA 환경을 위한 장기 실행 Preview는 비공개 베타 피드백을 바탕으로 여전히 범위를 정하는 중입니다. Worker Previews는 현재 Workers 플랫폼 전반에서 사용할 수 있으며, 이전 Version URL은 특정 업로드 버전을 가리키는 별도의 더 좁은 메커니즘으로 유지됩니다.
근거 확인하기
출처
- Introducing Worker Previews: isolated preview environments for every change your agent makes The Cloudflare Blog · blog.cloudflare.com ·