name: Deploy Noval to K3s on: push: branches: - main - master jobs: deploy: runs-on: self-hosted steps: - name: Deploy to K3s run: | set -e APP_NAME="noval" NAMESPACE="noval-roog-code" IMAGE_NAME="noval-app" echo "🚀 开始部署 ${APP_NAME}..." cd /root/k8syaml/NovalRedot echo "📥 拉取最新代码..." BRANCH="${GITHUB_REF_NAME:-master}" git pull origin "${BRANCH}" NEW_COMMIT_SHA=$(git rev-parse --short HEAD) NEW_COMMIT_MSG=$(git log -1 --oneline) pull_with_retry() { local image="$1" local max=5 local n=1 until [ $n -gt $max ]; do echo "尝试拉取 ${image} (${n}/${max})" if docker pull "${image}"; then echo "✅ 拉取成功: ${image}" return 0 fi sleep $((n * 5)) n=$((n + 1)) done echo "❌ 拉取失败: ${image}" return 1 } # 100% 使用 docker-compose.yml 中配置的云端镜像(不再本地构建) COMPOSE_IMAGE=$(docker compose config --images | head -n 1 || true) if [ -z "${COMPOSE_IMAGE}" ]; then echo "❌ docker-compose.yml 未配置 image,无法走云端 pull" exit 1 fi echo "☁️ 使用云端镜像: ${COMPOSE_IMAGE}" pull_with_retry "${COMPOSE_IMAGE}" FULL_IMAGE="${COMPOSE_IMAGE}" if command -v k3s >/dev/null 2>&1; then echo "📤 导入镜像到 k3s containerd..." docker save "${FULL_IMAGE}" | k3s ctr images import - if docker image inspect "${IMAGE_NAME}:latest" >/dev/null 2>&1; then docker save "${IMAGE_NAME}:latest" | k3s ctr images import - fi fi echo "🧱 应用 K8s 基础资源..." kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/cluster-issuer.yaml kubectl apply -f k8s/pvc.yaml kubectl apply -f k8s/service.yaml kubectl apply -f k8s/ingress.yaml if kubectl get deployment "${APP_NAME}" -n "${NAMESPACE}" >/dev/null 2>&1; then echo "🔄 检测到现有 deployment,执行滚动更新..." kubectl set image deployment/${APP_NAME} ${APP_NAME}=${FULL_IMAGE} -n "${NAMESPACE}" else echo "🆕 首次部署,创建 deployment..." kubectl apply -f k8s/deployment.yaml kubectl set image deployment/${APP_NAME} ${APP_NAME}=${FULL_IMAGE} -n "${NAMESPACE}" fi echo "⏳ 等待 rollout 完成..." kubectl rollout status deployment/${APP_NAME} -n "${NAMESPACE}" --timeout=300s echo "✅ 部署完成" echo "📌 版本: ${NEW_COMMIT_SHA} - ${NEW_COMMIT_MSG}" kubectl get pods -n "${NAMESPACE}" -l app=${APP_NAME} -o wide