bun

2 개의 포스트

cloudflare

수백만 개 리포지토리의 CI/CD를 실행하세요 — 여러분의 플랫폼에서, Cloudflare에서 (새 탭에서 열림)

Cloudflare는 코드 저장소인 Artifacts를 기반으로 빌드·테스트·배포까지 전 과정을 Cloudflare에서 실행하는 CI/CD 환경을 구축하고 있다. 새 CI SDK는 Cloudflare Workflows와 Sandbox SDK를 결합해 CI 파이프라인을 TypeScript로 정의하고, 코드가 Artifacts에 push될 때 자동으로 실행할 수 있게 한다. 각 단계의 재시도·타임아웃·캐싱·병렬 실행을 지원하며, 성공한 경우에만 자동 배포하거나 AI 에이전트를 통한 자동 수정도 가능하다. ## Cloudflare에서 완성되는 코드 개발 생태계 - Cloudflare는 다음 과정을 하나의 플랫폼으로 통합하려 한다. - 코드 저장: Artifacts - 빌드 및 테스트: CI SDK와 Workflows - 배포: `wrangler deploy` - Artifacts는 수백만 개의 저장소를 저장하고 버전을 관리할 수 있는 코드 저장소다. - `wrangler` 설정의 새로운 `events` 필드를 이용하면 Artifacts의 `push` 이벤트를 Workflow 실행으로 직접 연결할 수 있다. - 별도의 이벤트 구독, 큐, 큐 컨슈머를 구성하지 않아도 코드 push를 CI 작업의 시작점으로 사용할 수 있다. ## CI/CD 파이프라인은 하나의 Workflow - CI/CD는 정해진 순서로 여러 단계를 실행하고, 하나라도 실패하면 이후 단계를 중단하는 프로세스다. - Cloudflare는 이를 본질적으로 Workflow와 동일한 구조로 본다. - 기존 YAML 기반 도구 대신 TypeScript의 `step.do()`와 CI SDK를 사용해 파이프라인을 정의할 수 있다. - TypeScript를 사용하면 YAML보다 다음과 같은 장점이 있다. - 조건문과 동적 설정을 쉽게 적용 - 플랫폼별·저장소별 파이프라인 커스터마이징 - 일반 코드와 동일한 방식의 재사용 및 유지보수 ## 격리된 환경에서 실행되는 CI 단계 - CI SDK는 각 명령을 독립적인 Sandbox 환경에서 실행한다. - 대표적인 단계는 다음과 같다. - 의존성 설치 - 코드 빌드 - 린트 실행 - 타입 검사 - 단위 테스트 - 조건부 배포 - 각 Sandbox 명령은 Workflow의 단계로 실행되므로 Cloudflare Workflows가 제공하는 재시도와 타임아웃 기능을 활용할 수 있다. - 기존에는 Sandbox API를 직접 호출하고 단계 간 상태를 별도로 관리해야 했지만, CI SDK가 이 과정을 추상화한다. ## 의존성 캐싱과 병렬 실행 - `bun install --frozen-lockfile` 같은 설치 단계를 먼저 정의하고, `package.json`과 `bun.lock`을 캐시 입력으로 지정할 수 있다. - 의존성 캐시는 계정의 R2 버킷에 Sandbox 스냅샷 형태로 저장된다. - 이후 린트·테스트·타입 검사·빌드 단계는 의존성 설치를 반복하지 않는다. - 독립적인 단계는 `Promise.all()`로 병렬 실행할 수 있어 전체 CI 시간을 줄인다. - 배포 단계는 모든 검사가 성공한 뒤 실행되도록 마지막에 배치한다. ```ts const deps = await ci.runner({ name: "install", command: "bun install --frozen-lockfile", cache: { inputs: ["package.json", "bun.lock"] }, }); await Promise.all([ deps.runner({ name: "lint", command: "bun run lint" }), deps.runner({ name: "test", command: "bun run test" }), deps.runner({ name: "typecheck", command: "bun run typecheck" }), deps.runner({ name: "build", command: "bun run build" }), ]); await deps.runner({ name: "deploy", command: "bun wrangler deploy", cloudflareCredentials: { accountId: this.env.CLOUDFLARE_DEPLOY_ACCOUNT_ID, }, }); ``` ## 플랫폼 관리 CI와 사용자 정의 CI - 플랫폼 사업자는 고객 애플리케이션을 대신해 CI/CD 파이프라인을 관리할 수 있다. - 하나의 Workflow를 여러 고객 애플리케이션에 공유하면 고객마다 CI 환경을 직접 운영할 필요가 없다. - 반대로 특정 고객이 자체적인 빌드·테스트 규칙을 원한다면 Dynamic Workflows를 이용해 전용 CI를 정의할 수 있다. - 플랫폼이 관리하는 CI와 고객이 직접 작성한 CI는 동일한 namespace 안에서 동시에 실행할 수 있다. - 따라서 모든 고객에게 동일한 파이프라인을 강제하지 않고, 공통 규칙과 개별 요구사항을 함께 지원한다. ## AI 기반 셀프 힐링 CI - CI Workflow에 AI 리뷰 에이전트를 통합할 수 있다. - 빌드 단계가 실패하면 에이전트가 오류를 분석하고 수정 코드를 생성할 수 있다. - 수정 사항을 커밋으로 push해 사람이 검토하고 승인하는 흐름도 구성할 수 있다. - Cloudflare는 이러한 예제를 Project Think의 self-healing CI Workflow로 제공한다. ## 직접 CI Workflow 작성하기 - `@cloudflare/ci`의 `CIWorkflow`를 import해 자체 파이프라인을 작성한다. - 설치 단계에서 Vite, React, esbuild, ESLint, Vitest 등 필요한 패키지와 도구를 설치한다. - lockfile을 지정해 의존성 변경 여부를 검증한다. - 설치 결과를 캐시한 뒤 빌드와 각종 검사를 별도의 격리된 단계에서 실행한다. - 기본적으로 Workflow 단계는 독립적으로 실행되므로 병렬 처리가 가능하다. - 배포 전에 모든 검사가 끝나야 한다면 `Promise.all()`로 여러 검사를 묶어 완료를 기다린다. ## 실용적인 결론 Cloudflare 기반 플랫폼을 운영하거나 고객별 코드를 관리한다면, CI SDK와 Workflows를 이용해 공통 파이프라인을 먼저 만들고 저장소별 예외만 동적으로 추가하는 방식이 적합하다. 설치 단계의 캐싱과 독립 검사의 병렬 실행을 적용하면 CI 지연 시간을 줄일 수 있으며, 배포는 모든 검증 단계가 성공한 뒤에만 실행하도록 구성하는 것이 안전하다.

cloudflare

대규모 AI 코드 리뷰 오케스트레이션 (새 탭에서 열림)

Cloudflare는 기존 AI 코드 리뷰 도구의 유연성 부족과 단순 요약 방식의 한계를 극복하기 위해 오픈소스 에이전트인 OpenCode 기반의 CI 네이티브 오케스트레이션 시스템을 구축했습니다. 이 시스템은 보안, 성능 등 각 분야에 특화된 다수의 전문 에이전트를 코디네이터가 관리하여 노이즈를 줄이고 정확도 높은 리뷰 결과를 제공합니다. 현재 수만 개의 머지 리퀘스트를 처리하며 실제 버그와 보안 취약점을 효과적으로 차단하는 등 엔지니어링 생산성을 획기적으로 개선하고 있습니다. **기존 접근 방식의 한계와 다중 에이전트 전략** * 단순히 Git Diff를 LLM에 입력하는 방식은 환각(Hallucination) 현상과 무의미한 수정 제안 등 노이즈가 많아 실질적인 코드 품질 향상에 한계가 있었음. * Cloudflare는 하나의 거대한 모델 대신 보안, 성능, 코드 품질, 문서화, 릴리스 관리, 내부 규정 준수 등 최대 7개의 전문 에이전트를 동시에 실행하는 구조를 선택함. * '코디네이터 에이전트'가 개별 에이전트의 발견 사항을 취합하여 중복을 제거하고, 문제의 실제 심각도를 판단한 뒤 하나의 구조화된 리뷰 코멘트로 통합함. **플러그인 기반의 유연한 아키텍처** * 다양한 버전 관리 시스템(VCS)과 AI 프로바이더를 지원하기 위해 `ReviewPlugin` 인터페이스 기반의 컴포저블 아키텍처를 채택함. * 리뷰 실행 주기는 세 단계로 나먐: 병렬로 실행되는 `Bootstrap`(비동기 준비), 순차적으로 실행되며 실패 시 중단되는 `Configure`(필수 설정), 그리고 원격 설정 로드 등을 처리하는 `postConfigure` 단계임. * `ConfigureContext` API를 통해 각 플러그인은 독립적으로 에이전트 등록, 프롬프트 주입, 환경 변수 설정을 수행하며, 최종적으로 `opencode.json` 설정 파일로 병합됨. * 이러한 격리 구조 덕분에 GitLab 플러그인이 AI Gateway 설정을 알 필요가 없는 등 컴포넌트 간 결합도를 최소화함. **OpenCode와 Bun을 활용한 기술적 구현** * OpenCode는 오픈소스이며 서버 중심 구조를 가지고 있어 프로그래밍 방식으로 세션을 생성하고 SDK를 통해 결과를 수집하기에 적합함. * 대규모 머지 리퀘스트 처리 시 발생하는 Linux 커널의 `ARG_MAX` 제한(E2BIG 에러)을 해결하기 위해, Bun의 `stdin` 스트림을 통해 대용량 프롬프트를 전달함. * 오케스트레이터는 OpenCode를 자식 프로세스(`Bun.spawn`)로 실행하며, 모든 출력은 JSONL 형식의 `stdout` 이벤트를 통해 실시간으로 모니터링 및 수집됨. Cloudflare의 사례는 단순한 AI 도입을 넘어, 대규모 조직의 복잡한 표준과 요구사항을 충족하기 위해 다중 에이전트와 플러그인 시스템이 왜 필요한지 잘 보여줍니다. 특히 CI/CD 파이프라인의 핵심 경로에 AI를 배치할 때 발생하는 인자 크기 제한이나 도구 간 결합도 문제를 해결한 아키텍처는 대규모 엔지니어링 팀에 실질적인 가이드라인이 될 것입니다.