본문으로 건너뛰기

결과물

잡이 끝난 뒤 돌려받을 파일을 글롭으로 지정하고, 목록을 보고, 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"]
CLIxenocast build --artifacts 'build/*.ipa,build/*.xcarchive'
MCP buildartifacts: ["build/*.ipa"]
GitHub Actionswith: 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 ./dist

MCP에서는 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개면 패턴에 맞는 파일이 없었던 것입니다
  • 결과물 전송이 실패해도 잡의 종료 코드는 바뀌지 않고 로그에만 기록됩니다

다음 단계