소스 올리기
잡에 소스를 넘기는 두 가지 방법인 폴더 업로드와 공개 git 저장소, 업로드 한도와 보관 기간, 작업 폴더 규칙을 설명합니다
소스는 폴더를 tar.gz로 올리거나 공개 git 저장소 URL을 주는 두 가지 방법으로 넘기고, 두 경우 모두 스크립트는 소스 루트를 작업 폴더로 삼아 시작합니다
두 가지 소스
| 방법 | source 값 | 쓰는 때 |
|---|---|---|
| 업로드 | { "upload_id": "upl_…" } | 비공개 저장소, 로컬 작업 중인 폴더, CI가 만든 파일까지 포함할 때 |
| git | { "git_url": "https://…", "ref": "main" } | 공개 저장소를 VM이 직접 받을 때 |
source를 비우면 빈 작업 폴더에서 스크립트만 돕니다
xcodebuild -version 같은 확인용 잡에 씁니다
git 소스는 VM이 인증 없이 받으므로 공개 저장소만 됩니다
비공개 저장소는 업로드를 쓰세요
ref는 브랜치, 태그, 커밋 중 하나이고 없으면 HEAD입니다
1. 폴더 업로드
tar -czf - -C ./app . | curl -s https://xenoci.com/api/runner/v1/uploads \
-H "Authorization: Bearer $XENOCI_API_KEY" \
-H "Content-Type: application/octet-stream" \
--data-binary @-{ "id": "upl_Q2xk7MnP0a", "bytes": 48213990, "sha256": "9f1c…", "expires_at": "2026-10-13T03:10:00.000Z", "files": 1284 }받은 id를 잡의 source.upload_id에 넣습니다
curl -s https://xenoci.com/api/runner/v1/jobs \
-H "Authorization: Bearer $XENOCI_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "script": "bash ci.sh", "source": { "upload_id": "upl_Q2xk7MnP0a" } }'업로드 한도와 보관
| 항목 | 값 |
|---|---|
| 크기 | 2GiB 이하, 넘으면 413 invalid_request와 details.max_bytes |
| 파일 수 | 200,000개 이하 |
| 형식 | gzip으로 압축한 tar (tar.gz) 아니면 400 invalid_request |
| 보관 | 24시간 그 안에 잡이 쓰지 않으면 지움 |
| 사용 횟수 | 잡 하나 잡이 끝나면 업로드도 지움 |
업로드 목록은 콘솔 빌드 → 파일 메뉴와 GET /v1/files?kind=upload에서 보고 DELETE /v1/files/{upload_id}로 바로 지울 수 있습니다
잡이 쓰는 중이면 409 conflict입니다
2. CLI로 올리기
CLI build는 현재 폴더(또는 --dir)를 묶어 올리고 잡을 제출한 뒤 로그를 따라갑니다
xenocast build --script ./ci.sh
xenocast build --script ./ci.sh --dir ./app묶을 파일은 git 저장소면 git이 보는 파일(추적 중인 파일과 .gitignore에 걸리지 않은 파일)이고, git이 없으면 .gitignore를 읽으며 폴더를 훑습니다
다음 이름은 항상 뺍니다
.git DerivedData Pods node_modules .build .swiftpm xcuserdata .DS_Store .xeno xenoci device.keyPods와 node_modules를 빼기 때문에 스크립트 안에서 pod install이나 npm ci를 다시 실행해야 합니다
CLI는 업로드 뒤 업로드: 파일 1284개 (46.0MB) 한 줄을 표준 오류로 알립니다
3. 공개 git 저장소
xenocast build --script ./ci.sh --repo acme/app --ref main
xenocast build --script ./ci.sh --repo-url https://gitlab.com/acme/app.git --ref v2.1.0--repo owner/name은 https://github.com/owner/name.git을 받습니다
git 소스일 때 --script가 저장소 안 파일이면 VM에서 bash ci.sh로 실행합니다
API로는 다음과 같습니다
{ "script": "bash ci.sh", "source": { "git_url": "https://github.com/acme/app.git", "ref": "main" } }VM은 해당 ref만 얕게 받습니다
받는 시간은 스크립트 시작 전이 아니라 작업 폴더 준비의 일부이며 과금 구간에 포함됩니다
4. GitHub Actions
xeno-ci/build 액션은 api-key를 쓰면 source를 비웠을 때 체크아웃한 작업 폴더를 업로드합니다
비공개 저장소도 이 방식이면 됩니다
steps:
- uses: actions/checkout@v4
- uses: xeno-ci/build@v2
with:
api-key: ${{ secrets.XENOCI_API_KEY }}
script: ./ci.shsource: git을 지정하면 VM이 https://github.com/<owner>/<name>.git을 직접 받으므로 공개 저장소에서만 동작합니다
작업 폴더 규칙
- 스크립트는 소스 루트에서 시작합니다,
pwd가 업로드한 폴더 또는 저장소 루트입니다 - 업로드 소스는 빈 폴더에 풀리므로 이전 잡의 흔적이 없습니다
- 결과물 글롭(
artifacts)도 이 폴더를 기준으로 찾습니다 - 잡마다 새 VM이고 잡 사이에 남는 캐시는 없습니다, 의존성을 받는 시간을 줄이려면 받은 결과를 소스에 포함해 올리는 방법이 있습니다
배치와 업로드
배치는 조합마다 잡을 만들기 때문에 잡 하나에만 쓰이는 업로드를 받지 않습니다
배치에는 git 소스만 쓸 수 있습니다
다음 단계
- 결과물: 빌드 산출물 돌려받기
- 환경 변수와 비밀값: 비공개 의존성 토큰 넘기기
- Jobs API 사용하기: 잡 제출 본문 전체