결과물
잡이 끝난 뒤 돌려받을 파일을 글롭으로 지정하고, 목록을 보고, 15분짜리 링크로 내려받는 방법과 한도, 보관 기간을 설명합니다
잡 요청의 artifacts에 경로 글롭을 적으면 스크립트가 끝난 뒤 그 경로에 맞는 파일과 폴더를 모아 7일 동안 보관합니다
지정하기
{
"script": "bash ci.sh",
"artifacts": ["build/*.ipa", "build/App.xcarchive", "TestResults.xcresult", "logs/*.txt"],
"source": { "upload_id": "upl_Q2xk7MnP0a" }
}| 진입점 | 방법 |
|---|---|
| API | "artifacts": ["build/*.ipa"] |
| CLI | xenocast build --artifacts 'build/*.ipa,build/*.xcarchive' |
MCP build | artifacts: ["build/*.ipa"] |
| GitHub Actions | with: artifacts: build/*.ipa (쉼표로 구분) |
| 콘솔 플레이그라운드 | 폼의 결과물 경로 |
글롭 규칙
- 작업 폴더(소스 루트) 기준 상대 경로이고
*와?만 씁니다,*는/를 넘지 않습니다 **,.., 공백은 쓸 수 없고 패턴 하나는 200자 이하입니다- 패턴은 최대 50개이고 모은 파일과 폴더는 합쳐서 최대 20개, 총 2GiB입니다 20개를 넘는 나머지는 버립니다
- 폴더에 맞으면
ditto로 zip 하나로 묶습니다,.xcarchive와.xcresult가 여기 해당합니다 - 스크립트가 실패해도 결과물은 모읍니다, 실패한 테스트의
.xcresult를 그대로 받을 수 있습니다
잘못된 패턴은 잡을 만들기 전에 400 invalid_request와 details.fields: ["artifacts"]로 거절합니다
목록 보기
curl -s https://xenoci.com/api/runner/v1/jobs/job_7Kp2QmX9bT4vR1sLwZ3n/artifacts \
-H "Authorization: Bearer $XENOCI_API_KEY"{
"data": [
{ "id": "art_N8wq2Lp5Zr", "name": "1-App.ipa", "path": "build/App.ipa", "bytes": 23811072, "sha256": "4c0e…", "expires_at": "2026-10-19T03:12:46.000Z" },
{ "id": "art_Tf3mX9Kd1u", "name": "2-TestResults.xcresult.zip", "path": "TestResults.xcresult", "bytes": 1947210, "sha256": "a71b…", "expires_at": "2026-10-19T03:12:46.000Z" }
]
}name은 순번이 붙은 저장 이름이고 path는 작업 폴더 안의 원래 경로입니다
sha256으로 내려받은 파일을 검증할 수 있습니다
내려받기
curl -s -L -o App.ipa https://xenoci.com/api/runner/v1/jobs/job_7Kp2QmX9bT4vR1sLwZ3n/artifacts/art_N8wq2Lp5Zr \
-H "Authorization: Bearer $XENOCI_API_KEY"이 요청은 302로 15분 동안만 유효한 다운로드 URL(/api/runner/downloads/<토큰>)을 돌려줍니다
그 URL에는 인증 헤더가 필요 없으므로 다른 도구에 넘겨도 API 키가 새지 않습니다
curl -L이 리다이렉트를 따라갑니다
CLI는 한 번에 모두 받습니다
xenocast artifacts job_7Kp2QmX9bT4vR1sLwZ3n --out ./distMCP에서는 logs 도구에 artifacts: true를 주면 로그와 함께 지정한 폴더에 저장됩니다
보관과 삭제
- 잡이 끝난 시각부터 7일 뒤 자동으로 지웁니다,
expires_at이 그 시각입니다 - 콘솔 빌드 → 파일 메뉴와
GET /v1/files?kind=artifact에서 워크스페이스의 모든 결과물을 보고DELETE /v1/files/{artifact_id}로 바로 지울 수 있습니다 - 만료되거나 지운 결과물은
404 not_found입니다
결과물이 비어 있을 때
- 패턴이 작업 폴더 기준인지 확인하세요,
xcodebuild의 기본 산출물은DerivedData아래에 있으므로-archivePath나-resultBundlePath로 작업 폴더 안에 두어야 합니다 - 로그 끝의
[xenoci]줄에 모은 개수가 남습니다 0개면 패턴에 맞는 파일이 없었던 것입니다 - 결과물 전송이 실패해도 잡의 종료 코드는 바뀌지 않고 로그에만 기록됩니다