94 lines
3.2 KiB
YAML
94 lines
3.2 KiB
YAML
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
|