본문으로 건너뛰기

소스 올리기

잡에 소스를 넘기는 두 가지 방법인 폴더 업로드와 공개 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.key

Pods와 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.sh

source: git을 지정하면 VM이 https://github.com/<owner>/<name>.git을 직접 받으므로 공개 저장소에서만 동작합니다

작업 폴더 규칙

  • 스크립트는 소스 루트에서 시작합니다, pwd가 업로드한 폴더 또는 저장소 루트입니다
  • 업로드 소스는 빈 폴더에 풀리므로 이전 잡의 흔적이 없습니다
  • 결과물 글롭(artifacts)도 이 폴더를 기준으로 찾습니다
  • 잡마다 새 VM이고 잡 사이에 남는 캐시는 없습니다, 의존성을 받는 시간을 줄이려면 받은 결과를 소스에 포함해 올리는 방법이 있습니다

배치와 업로드

배치는 조합마다 잡을 만들기 때문에 잡 하나에만 쓰이는 업로드를 받지 않습니다

배치에는 git 소스만 쓸 수 있습니다

다음 단계