yakcloud-starter: 배포 기반(스타터 앱+CI+매니페스트) + Claude Code 스킬 yakcloud-deploy
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
58
.claude/skills/yakcloud-deploy/assets/workflows/deploy.yml
Normal file
58
.claude/skills/yakcloud-deploy/assets/workflows/deploy.yml
Normal file
@ -0,0 +1,58 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user