# Gitea Actions — 릴리스 태그(v*) push 시 이미지 빌드/푸시 후 YakCloud 에 리컨실 배포. # 매니페스트 구동형: yakcloud.yaml 의 각 workload.build 를 빌드해 image 로 push → yakcloud_deploy.py. # 프로젝트마다 수정 불필요(레포명은 GITHUB_REPOSITORY 로 자동). # 필요 secrets: REGISTRY_TOKEN, YAKCLOUD_URL, YAKCLOUD_TOKEN, YAKCLOUD_CLUSTER # 러너: 전용 host act_runner, 라벨 ci-polyglot(잡 컨테이너에 host docker.sock 마운트). name: deploy on: push: tags: ["v*"] jobs: build-and-deploy: runs-on: ci-polyglot env: REGISTRY: gitea.yakenator.io steps: - name: Build, push images & deploy env: REG_USER: ${{ github.actor }} REG_TOKEN: ${{ secrets.REGISTRY_TOKEN }} YAKCLOUD_URL: ${{ secrets.YAKCLOUD_URL }} YAKCLOUD_TOKEN: ${{ secrets.YAKCLOUD_TOKEN }} YAKCLOUD_CLUSTER: ${{ secrets.YAKCLOUD_CLUSTER }} run: | set -eo pipefail TAG="${GITHUB_REF_NAME}" echo "▸ tag=$TAG repo=$GITHUB_REPOSITORY registry=$REGISTRY" # 1) 소스 체크아웃(git clone — JS 액션 미사용, 견고) git clone --depth 1 -b "$TAG" \ "https://${REG_USER}:${REG_TOKEN}@${REGISTRY}/${GITHUB_REPOSITORY}.git" src cd src # 2) 레지스트리 로그인 echo "$REG_TOKEN" | docker login "$REGISTRY" -u "$REG_USER" --password-stdin # 3) PyYAML 준비(yakcloud-runner 이미지엔 이미 있음) python3 -c "import yaml" 2>/dev/null \ || python3 -m pip install --quiet --break-system-packages pyyaml 2>/dev/null \ || pip3 install --quiet pyyaml # 4) 매니페스트의 각 workload.build → image 빌드/푸시(${TAG} 치환) python3 - "$TAG" <<'PY' import subprocess, sys, yaml tag = sys.argv[1] m = yaml.safe_load(open("yakcloud.yaml")) for w in m.get("workloads", []): ctx = w.get("build") if not ctx: continue # build 없으면 외부 이미지로 간주(빌드 스킵) img = w["image"].replace("${TAG}", tag) print(f"▸ build {w['name']}: {ctx} -> {img}", flush=True) subprocess.check_call(["docker", "build", "-t", img, ctx]) subprocess.check_call(["docker", "push", img]) PY # 5) YakCloud 리컨실 배포(콘솔 API, PAT 인증) TAG="$TAG" python3 scripts/yakcloud_deploy.py yakcloud.yaml