Files
NovalRedot/.gitea/workflows/deploy.yml
ROOG 7d5f4640b3
All checks were successful
Deploy Noval to K3s / deploy (push) Successful in 2m35s
fix(deploy): align deployment image/pullPolicy with cloud registry and improve rollout diagnostics
2026-03-22 18:00:25 +08:00

94 lines
3.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
echo "🧱 应用/更新 deployment..."
kubectl apply -f k8s/deployment.yaml
kubectl set image deployment/${APP_NAME} ${APP_NAME}=${FULL_IMAGE} -n "${NAMESPACE}"
# 使用 latest 标签时,强制触发一次重启以拉取新镜像
kubectl rollout restart deployment/${APP_NAME} -n "${NAMESPACE}"
echo "⏳ 等待 rollout 完成..."
if ! kubectl rollout status deployment/${APP_NAME} -n "${NAMESPACE}" --timeout=300s; then
echo "❌ rollout 超时,输出诊断信息"
kubectl get pods -n "${NAMESPACE}" -l app=${APP_NAME} -o wide || true
kubectl describe deployment/${APP_NAME} -n "${NAMESPACE}" || true
kubectl logs -n "${NAMESPACE}" deploy/${APP_NAME} --all-containers=true --tail=200 || true
exit 1
fi
echo "✅ 部署完成"
echo "📌 版本: ${NEW_COMMIT_SHA} - ${NEW_COMMIT_MSG}"
kubectl get pods -n "${NAMESPACE}" -l app=${APP_NAME} -o wide