본문으로 건너뛰기

GitHub Actions

Xeno-CI/build 액션의 입력과 동작, 결과 받는 법, 예시 워크플로

Xeno-CI/build@v1 액션은 GitHub의 ubuntu-latest 러너에서 XenoCI로 잡을 보내고, 로그를 스텝 로그로 흘리며, 잡의 종료 코드를 스텝 종료 코드로 돌려줍니다. GitHub App 설치는 필요 없습니다

준비

  1. 콘솔 API 키에서 권한이 실행과 조회인 키를 만듭니다
  2. 저장소 Settings → Secrets and variables → Actions에 XENOCI_API_KEY로 저장합니다(조직 시크릿도 됩니다)
  3. 워크플로에 아래 스텝을 넣습니다
name: iOS
on:
  push:
  pull_request:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Xeno-CI/build@v1
        with:
          api-key: ${{ secrets.XENOCI_API_KEY }}
          script: ./ci.sh

입력

입력필수기본값설명
api-key예콘솔에서 발급한 xci_live_… 키. ::add-mask::로 가린 뒤 /api/runner/v1을 부릅니다
script예빌드 스크립트 경로(저장소 기준)
sourceuploadupload는 체크아웃한 작업 폴더를 올립니다. git은 VM이 https://github.com/<owner>/<repo>.git을 직접 받으므로 공개 저장소만 됩니다
xcode이미지 기본값Xcode 버전
timeout30제한 시간(분), 1~360
artifacts결과물 경로를 쉼표로 나눠 적습니다. 예: build/*.ipa
api-urlhttps://xenoci.comAPI 주소

token(옛 CI 토큰 방식)은 이 문서의 범위 밖입니다. priority, github-status, notify-url, runner, persist는 API 키에서 쓰지 않으며, 주면 경고 한 줄을 남기고 무시합니다

source: upload일 때는 actions/checkout이 먼저 있어야 합니다. 워크플로 앞 스텝이 만든 파일까지 함께 올라갑니다. source: git일 때는 체크아웃 없이 PR의 head 커밋(github.event.pull_request.head.sha, 없으면 github.sha)을 받습니다

출력

액션은 outputs를 정의하지 않습니다. 결과는 세 가지로 받습니다

  • 스텝 로그에 잡 로그와 마지막 요약 줄(잡 job_… succeeded (종료 코드 0), 실행 125초, 과금 3분, 금액 $0.1188, 남은 잔액 $…)
  • 스텝 종료 코드 = 스크립트 종료 코드. 잔액과 한도 문제는 3
  • 결과물은 XenoCI에 7일 보관되고 콘솔 잡 화면이나 xenocast artifacts로 받습니다

잔액 부족(insufficient_credit), 실행 중 소진(credit_exhausted), 워크스페이스 지출 한도, 티어 월 한도, 동시 실행 한도는 다음과 같은 주석을 남깁니다

::error title=XenoCI 잔액 소진::잔액이 부족해 잡을 시작하지 않았습니다 (사용 가능 $0.0100, 1분 요금 $0.0396). 충전: https://xenoci.com/console/billing

포크 PR과 시크릿

  • pull_request 이벤트는 포크에서 온 PR에 시크릿을 주지 않습니다. 포크 PR의 빌드는 건너뛰어지거나 실패할 뿐 키는 새지 않습니다. 이대로 둡니다
  • pull_request_target에서 PR 코드를 체크아웃하고 XENOCI_API_KEY를 넘기지 마세요. 포크의 코드가 키와 함께 실행됩니다
# 금지: 이렇게 쓰지 않는다
on: pull_request_target
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}
      - uses: Xeno-CI/build@v1
        with:
          api-key: ${{ secrets.XENOCI_API_KEY }}
          script: ./ci.sh
  • 빌드 스크립트에서 XENOCI_API_KEY를 출력하지 않습니다. CLI는 로그에 섞인 키 모양 문자열을 가립니다

예시 워크플로

시뮬레이터 테스트와 결과물

name: Test
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Xeno-CI/build@v1
        with:
          api-key: ${{ secrets.XENOCI_API_KEY }}
          script: ./scripts/test.sh
          xcode: '27.0'
          timeout: '45'
          artifacts: TestResults.xcresult

scripts/test.sh

#!/bin/sh
set -eu
xcodebuild -scheme App \
  -destination 'platform=iOS Simulator,name=iPhone 16' \
  CODE_SIGNING_ALLOWED=NO -resultBundlePath TestResults.xcresult test

Xcode 버전 매트릭스

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        xcode: ['27.0', '26.6']
    steps:
      - uses: actions/checkout@v4
      - uses: Xeno-CI/build@v1
        with:
          api-key: ${{ secrets.XENOCI_API_KEY }}
          script: ./ci.sh
          xcode: ${{ matrix.xcode }}

매트릭스 잡은 동시에 접수됩니다. 조직 티어의 동시 실행 한도를 넘는 잡은 거절되지 않고 대기열에서 차례를 기다립니다

공개 저장소를 VM이 직접 받기

체크아웃 없이 VM이 저장소를 받습니다. 공개 저장소에서만 됩니다

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: Xeno-CI/build@v1
        with:
          api-key: ${{ secrets.XENOCI_API_KEY }}
          source: git
          script: ci.sh

결과물을 GitHub Artifacts로 옮기기

액션 대신 CLI를 직접 쓰면 잡 ID를 받아 결과물을 러너로 내려받고 actions/upload-artifact에 넘길 수 있습니다

jobs:
  archive:
    runs-on: ubuntu-latest
    env:
      XENOCI_API_KEY: ${{ secrets.XENOCI_API_KEY }}
      XENOCAST_NO_SETUP: '1'
    steps:
      - uses: actions/checkout@v4
      - run: curl -fsSL https://github.com/Xeno-CI/xenocast/releases/latest/download/install.sh | sh
      - run: |
          ~/.local/bin/xenocast build --script ./archive.sh --artifacts 'App.xcarchive' --json > result.json
          ~/.local/bin/xenocast artifacts "$(jq -r .id result.json)" --out ./dist
      - uses: actions/upload-artifact@v4
        with:
          name: xcarchive
          path: dist/

--json을 쓰면 로그는 스텝 로그(표준 오류)로 흐르고 표준 출력에는 결과 JSON 하나만 남습니다

일정 실행

on:
  schedule:
    - cron: '0 18 * * 1-5'
jobs:
  nightly:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Xeno-CI/build@v1
        with:
          api-key: ${{ secrets.XENOCI_API_KEY }}
          script: ./scripts/nightly.sh
          timeout: '120'

다른 CI

GitLab CI, Jenkins, CircleCI, Buildkite, Bitrise, Azure Pipelines에서는 비밀 변수 XENOCI_API_KEY를 두고 CLI를 설치해 같은 명령을 실행합니다

curl -fsSL https://github.com/Xeno-CI/xenocast/releases/latest/download/install.sh | sh
~/.local/bin/xenocast build --script ./ci.sh

종료 코드가 빌드 종료 코드이고, 파이프라인이 취소되면(SIGTERM) 잡도 취소됩니다

다음 단계