사전 요구 사항
시작하기 전에 다음을 준비하세요.SANDBOX_USERID 및 액세스 관리(IAM) 작업 권한이 있는 CoreWeave API 액세스 토큰. API 액세스 토큰 관리를 참조하세요.- 서버리스 샌드박스 액세스 권한 및 CPU 1개와 메모리 2GiB를 사용할 수 있는 용량. 시작하기를 참조하세요.
- Git,
uv, Python 3.11 이상. Python은uv로 설치할 수 있습니다. - 워크플로와 Actions 시크릿을 추가할 수 있는 공개 GitHub 저장소.
- 참고용 AI 리뷰에 사용할 Anthropic API 키(선택 사항).
샘플 실행하기
저장소를 연결하기 전에 번들로 포함된 샘플로 인증, 원격 실행, 정리 작업이 제대로 동작하는지 확인하세요.-
레시피 저장소를 복제하고 잠금 파일에 고정된 의존성을 설치하세요.
-
CoreWeave 토큰을 설정하세요.
[API-ACCESS-TOKEN]을 토큰의 시크릿 값으로 바꾸세요. -
샘플을 실행하고 결과를 확인하세요.
터미널에
Status: passed가 표시되어야 합니다. 결과 파일에는returncode: 0과stopped: true가 기록됩니다. 샘플은 덧셈 연산을 검사하고, 샌드박스 환경에 오케스트레이터의 CoreWeave, GitHub, Anthropic 키가 포함되어 있지 않은지 확인합니다. -
실패 경로를 확인하세요.
이 명령어는 의도적으로 상태 코드
1로 종료됩니다. 결과 파일에는status: failed, 테스트의returncode: 7,stopped: true가 기록됩니다.
저장소 커밋 테스트하기
레시피 디렉터리에서 특정 MarkupSafe 커밋을 가져와 의존성을 설치한 후, 샌드박스 안에서pytest를 실행하세요.
Status: passed가 출력되어야 합니다. 사용 중인 프로젝트에 맞게 저장소, 전체 커밋 해시, 테스트 명령어를 바꾸세요. 의존성 설치가 실패했을 때 검사도 실패로 처리하려면 설치 명령어와 테스트 명령어를 &&로 연결하세요.
이 레시피는 python:3.12-bookworm을 사용합니다. 프로젝트에 다른 툴체인이 필요하면 run.py 파일에서 container_image 설정을 변경하세요.
이 레시피는 헤드 커밋 자체를 체크아웃하며, GitHub가 생성하는 합성 병합 커밋은 테스트하지 않습니다. 오케스트레이션 스크립트는 로컬 머신이나 CI 러너에서 실행되고, 저장소 체크아웃과 테스트 명령어는 샌드박스에서 실행됩니다.
선택 사항: AI 리뷰 추가
오케스트레이터 환경에서ANTHROPIC_API_KEY 환경 변수를 설정한 다음, 저장소 명령어에 --base [BASE-COMMIT-SHA] --review를 추가하세요. [BASE-COMMIT-SHA]는 같은 저장소에 있는 기준 리비전의 40자 전체 커밋 해시로 바꾸세요. 바로 실행할 수 있는 전체 예시는 레시피 README에서 확인할 수 있습니다.
스크립트는 두 리비전을 모두 가져와 git diff BASE...HEAD를 계산합니다. diff, 표준 출력, 표준 오류는 각각 최대 24,000자까지 Anthropic으로 전송됩니다. 모델은 도구를 사용하지 않습니다. 스크립트는 모델의 응답을 사람이 검토할 수 있도록 참고용 텍스트로 저장합니다. 리뷰 요청이 실패하면 review_error 필드에 오류 유형이 기록되며, 테스트 결과는 그대로 유지됩니다.
GitHub Actions 워크플로 추가
이 워크플로는 신뢰할 수 있는 저장소 기여자에게만 사용하세요. 워크플로 정의는 풀 리퀘스트의 병합 ref에서 가져옵니다. 따라서 동일 저장소의 풀 리퀘스트는 워크플로, 테스트 명령어, 체크아웃 ref, 시크릿 사용 방식을 변경할 수 있습니다. 베이스 브랜치의 파일을 체크아웃하더라도 풀 리퀘스트에서 이러한 변경을 할 수 있다는 점은 달라지지 않습니다.pull_request 트리거를 그대로 유지하세요. pull_request_target으로 변경하려면 별도의 보안 설계가 필요합니다.
풀 리퀘스트에서 이러한 검사를 실행하려면 공개 저장소에 레시피를 설치하세요.
-
공개 저장소의 루트에서 런타임 파일과 워크플로를 복사하세요.
[RECIPES-CHECKOUT]은 레시피 클론 경로로 바꾸세요.프로젝트의 테스트 러너가 수집하지 않도록 레시피의tests/및sample/디렉터리는 레시피 클론에 그대로 두세요. 복사한 파일은 저장소 모드를 지원합니다. 번들로 포함된 샘플은 레시피 클론에서 실행하세요. -
.github/workflows/sandbox-ci.yml에 복사한workflow.yml파일을 검토하세요. -
워크플로의
--command를 프로젝트의 의존성 설치 및 테스트 명령어로 설정하세요. -
CoreWeave 토큰을 값으로 하는
CWSANDBOX_API_KEY라는 이름의 Actions 저장소 시크릿을 추가하세요. 자세한 내용은 GitHub Actions에서 시크릿 사용을 참조하세요. -
워크플로와
ci/sandbox/파일을 대상 베이스 브랜치에 병합하세요. 워크플로는 풀 리퀘스트의 베이스 커밋에서 오케스트레이션을 로드하므로, 풀 리퀘스트를 테스트하기 전에 해당 파일이 베이스 커밋에 있어야 합니다. - 동일 저장소의 풀 리퀘스트를 열거나 업데이트하세요.
opened, synchronize, reopened 이벤트가 발생하면 실행됩니다. 제공된 워크플로는 베이스 커밋에서 run.py 파일과 관련 의존성 파일을 체크아웃하고, 풀 리퀘스트의 헤드 커밋 해시를 샌드박스에 전달합니다. 또한 contents: read 권한만 요청하며, 체크아웃 사용자 인증 정보가 유지되지 않도록 비활성화합니다.
제공된 워크플로는 포크 풀 리퀘스트, Dependabot 풀 리퀘스트, 비공개 저장소를 건너뜁니다. GitHub는 포크 또는 Dependabot 풀 리퀘스트 워크플로에 저장소 시크릿을 제공하지 않기 때문입니다. 건너뛴 작업도 필수 상태 검사를 통과한 것으로 처리되므로, 이 검사를 필수로 지정하더라도 건너뛴 풀 리퀘스트에는 테스트가 강제 적용되지 않습니다. 자세한 내용은 건너뛰었지만 필수인 검사 처리를 참조하세요.
Actions에서 AI 리뷰를 선택적으로 사용하려면 레시피의 안내에 따라 테스트 단계에 Anthropic 시크릿을 추가하고 --review를 활성화하세요.
결과 확인하기
작업 summary를 확인하려면 Sandbox CI 검사를 여세요.result.json 및 summary.md 파일은 sandbox-ci-results 아티팩트를 다운로드하여 받을 수 있습니다. 워크플로는 테스트가 실패하더라도 결과를 업로드하며, 아티팩트는 7일 동안 보관됩니다.
결과 파일에는 테스트한 커밋, 샌드박스 ID, 테스트 반환 코드, 캡처된 출력, 정리 작업 결과가 포함됩니다. 스크립트는 표준 출력과 표준 오류를 각각 마지막 24,000자까지 보관하므로 끝부분의 실패 메시지를 확인할 수 있습니다. 반환된 텍스트는 summary에서 이스케이프 처리되며, 테스트 출력은 CI 러너 콘솔에 직접 출력되지 않습니다. 실패하면 작업 summary와 아티팩트를 안내하는 고정 텍스트 오류 어노테이션이 표시됩니다.
테스트 run이 성공하면 0으로 종료됩니다. 테스트 실패, 설정 오류, timeout, 정리 작업 오류가 발생하면 1로 종료됩니다. AI 리뷰는 참고용이며 이 결과를 바꾸지 않습니다. 테스트 스위트를 통과했다고 해서 제출된 코드의 보안이 검증된 것은 아닙니다.
--timeout 옵션에는 1~300초를 지정할 수 있으며, 기본값은 120초입니다. 샌드박스에는 이와 별도로 900초의 수명 제한이 있습니다.
이 레시피는 명령어 출력을 잘라내기 전에 버퍼에 저장하므로, 출력량이 많지 않은 소규모 저장소와 테스트 스위트에 사용하세요. timeout이 발생하면 스크립트는 명령어 출력을 일부도 남기지 않고 status: error 및 error: SandboxTimeoutError를 기록합니다. 설정 timeout 및 기타 제한 사항은 레시피 README를 참조하세요.
정리
스크립트는 run의 성공 여부와 관계없이finally 블록에서 stop(missing_ok=True)를 호출합니다. 정리 작업 전에 오케스트레이터가 종료되더라도 최대 수명에 도달하면 실행이 중단됩니다. 이 레시피는 스냅샷, 볼륨, 샌드박스 러너를 생성하지 않습니다.
결과에 cleanup_error 필드가 있으면 저장해 둔 샌드박스 ID와 동일한 CoreWeave 사용자 인증 정보로 레시피의 정리 명령어를 실행해 샌드박스를 삭제하세요. 다른 패턴은 정리 패턴을 참조하세요.
필요한 결과 파일을 보관한 다음 로컬 outputs/ 디렉터리를 삭제하세요. 풀 리퀘스트로 더 이상 샌드박스를 생성하지 않으려면 워크플로를 삭제하거나 비활성화하세요.