feat: 配置本地 Docker Registry 并使用 self-hosted runner
## 主要更改 ### 本地 Registry 部署 - 添加 docker-compose 配置部署本地 Docker Registry - Registry 地址: localhost:5000 - 包含 Web UI (localhost:8888) - 认证: admin/admin123 ### Workflow 优化 - 将 build-and-push job 改为使用 self-hosted runner - 使用本地 Registry (localhost:5000) 替代远程 Harbor - 简化镜像推送流程,避免网络超时 - 优先读取 .env.local-registry 配置 ### K8s 配置更新 - 更新 ljwx-boot deployment 镜像地址为本地 Registry - 更新镜像拉取密钥配置 - 支持本地开发和 CI/CD 流程 ### 监控工具 - 添加 monitor-deployment.sh 查看部署状态 - 添加 watch-deployment.sh 实时监控 ## 部署流程 推送代码 → 本地 self-hosted runner 构建 → 推送到本地 Registry → 部署到 K3s 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.5
parent
e8ce4cbed9
commit
00a243580f
@@ -0,0 +1,21 @@
|
|||||||
|
# 本地 Docker Registry 配置(用于 CI/CD)
|
||||||
|
# 此文件配置使用本地 Registry 进行镜像构建和部署
|
||||||
|
|
||||||
|
# Registry 配置
|
||||||
|
REGISTRY=localhost:5000
|
||||||
|
HARBOR_HOST=localhost:5000
|
||||||
|
HARBOR_PROJECT=ljwx-health
|
||||||
|
|
||||||
|
# 版本配置
|
||||||
|
LJWX_VERSION=2.0.4
|
||||||
|
|
||||||
|
# 镜像版本(与 LJWX_VERSION 保持一致)
|
||||||
|
LJWX_MYSQL_VERSION=2.0.4
|
||||||
|
LJWX_REDIS_VERSION=2.0.4
|
||||||
|
LJWX_BOOT_VERSION=2.0.4
|
||||||
|
LJWX_BIGSCREEN_VERSION=2.0.4
|
||||||
|
LJWX_ADMIN_VERSION=2.0.4
|
||||||
|
|
||||||
|
# Registry 凭据(用于本地开发)
|
||||||
|
REGISTRY_USERNAME=admin
|
||||||
|
REGISTRY_PASSWORD=admin123
|
||||||
@@ -40,13 +40,19 @@ jobs:
|
|||||||
- name: Load .env configuration
|
- name: Load .env configuration
|
||||||
id: config
|
id: config
|
||||||
run: |
|
run: |
|
||||||
if [ -f .env ]; then
|
# 优先使用本地 Registry 配置
|
||||||
source .env
|
if [ -f .env.local-registry ]; then
|
||||||
|
source .env.local-registry
|
||||||
echo "registry=${REGISTRY}" >> $GITHUB_OUTPUT
|
echo "registry=${REGISTRY}" >> $GITHUB_OUTPUT
|
||||||
echo "harbor_host=${HARBOR_HOST}" >> $GITHUB_OUTPUT
|
echo "harbor_host=${HARBOR_HOST}" >> $GITHUB_OUTPUT
|
||||||
echo "harbor_project=${HARBOR_PROJECT}" >> $GITHUB_OUTPUT
|
echo "harbor_project=${HARBOR_PROJECT}" >> $GITHUB_OUTPUT
|
||||||
|
elif [ -f .env ]; then
|
||||||
|
source .env
|
||||||
|
echo "registry=${REGISTRY:-localhost:5000}" >> $GITHUB_OUTPUT
|
||||||
|
echo "harbor_host=${HARBOR_HOST:-localhost:5000}" >> $GITHUB_OUTPUT
|
||||||
|
echo "harbor_project=${HARBOR_PROJECT:-ljwx-health}" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
echo "registry=harbor.omniverseai.net/health" >> $GITHUB_OUTPUT
|
echo "registry=localhost:5000" >> $GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Determine version
|
- name: Determine version
|
||||||
@@ -80,7 +86,7 @@ jobs:
|
|||||||
build-and-push:
|
build-and-push:
|
||||||
name: Build and Push ${{ matrix.component }}
|
name: Build and Push ${{ matrix.component }}
|
||||||
needs: prepare
|
needs: prepare
|
||||||
runs-on: ubuntu-latest
|
runs-on: self-hosted
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -95,12 +101,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
|
|
||||||
- name: Log in to Harbor
|
- name: Log in to Local Registry
|
||||||
uses: docker/login-action@v3
|
run: |
|
||||||
with:
|
echo "admin123" | docker login localhost:5000 -u admin --password-stdin
|
||||||
registry: ${{ secrets.HARBOR_HOST || 'harbor.omniverseai.net' }}
|
|
||||||
username: ${{ secrets.HARBOR_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Prepare build context
|
- name: Prepare build context
|
||||||
id: context
|
id: context
|
||||||
@@ -191,16 +194,12 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
kubectl create namespace ljwx-health --dry-run=client -o yaml | kubectl apply -f -
|
kubectl create namespace ljwx-health --dry-run=client -o yaml | kubectl apply -f -
|
||||||
|
|
||||||
- name: Create Harbor image pull secret
|
- name: Create Local Registry image pull secret
|
||||||
env:
|
|
||||||
HARBOR_HOST: ${{ secrets.HARBOR_HOST || 'harbor.omniverseai.net' }}
|
|
||||||
HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }}
|
|
||||||
HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }}
|
|
||||||
run: |
|
run: |
|
||||||
kubectl create secret docker-registry harbor-secret \
|
kubectl create secret docker-registry harbor-secret \
|
||||||
--docker-server=${HARBOR_HOST} \
|
--docker-server=localhost:5000 \
|
||||||
--docker-username=${HARBOR_USERNAME} \
|
--docker-username=admin \
|
||||||
--docker-password=${HARBOR_PASSWORD} \
|
--docker-password=admin123 \
|
||||||
--namespace=ljwx-health \
|
--namespace=ljwx-health \
|
||||||
--dry-run=client -o yaml | kubectl apply -f -
|
--dry-run=client -o yaml | kubectl apply -f -
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
admin:$2y$05$DtBHPQ2Xl6BaiRU.W5BZ0uv1Ilcq64LW5oWH4e2jgk/nMQe6ou3GC
|
||||||
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
registry:
|
||||||
|
image: registry:2
|
||||||
|
container_name: local-harbor-registry
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "5000:5000"
|
||||||
|
environment:
|
||||||
|
REGISTRY_AUTH: htpasswd
|
||||||
|
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
|
||||||
|
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
|
||||||
|
REGISTRY_STORAGE_DELETE_ENABLED: "true"
|
||||||
|
volumes:
|
||||||
|
- ./data/registry:/var/lib/registry
|
||||||
|
- ./auth:/auth
|
||||||
|
networks:
|
||||||
|
- harbor
|
||||||
|
|
||||||
|
registry-ui:
|
||||||
|
image: joxit/docker-registry-ui:latest
|
||||||
|
container_name: local-harbor-ui
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "8888:80"
|
||||||
|
environment:
|
||||||
|
- SINGLE_REGISTRY=true
|
||||||
|
- REGISTRY_TITLE=LJWX Health Registry
|
||||||
|
- DELETE_IMAGES=true
|
||||||
|
- SHOW_CONTENT_DIGEST=true
|
||||||
|
- NGINX_PROXY_PASS_URL=http://registry:5000
|
||||||
|
- SHOW_CATALOG_NB_TAGS=true
|
||||||
|
- CATALOG_MIN_BRANCHES=1
|
||||||
|
- CATALOG_MAX_BRANCHES=1
|
||||||
|
- TAGLIST_PAGE_SIZE=100
|
||||||
|
- REGISTRY_SECURED=false
|
||||||
|
- CATALOG_ELEMENTS_LIMIT=1000
|
||||||
|
networks:
|
||||||
|
- harbor
|
||||||
|
depends_on:
|
||||||
|
- registry
|
||||||
|
|
||||||
|
networks:
|
||||||
|
harbor:
|
||||||
|
driver: bridge
|
||||||
Executable
+71
@@ -0,0 +1,71 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "🚀 本地 Docker Registry 部署脚本"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
HARBOR_DIR="/root/codes/ljwx-health/harbor"
|
||||||
|
cd "$HARBOR_DIR"
|
||||||
|
|
||||||
|
# 创建必要的目录
|
||||||
|
echo "📁 创建数据目录..."
|
||||||
|
mkdir -p data/registry
|
||||||
|
mkdir -p auth
|
||||||
|
|
||||||
|
# 生成 htpasswd 文件(admin/admin123)
|
||||||
|
echo "🔐 创建认证文件..."
|
||||||
|
if command -v htpasswd &> /dev/null; then
|
||||||
|
htpasswd -Bbn admin admin123 > auth/htpasswd
|
||||||
|
else
|
||||||
|
# 如果没有 htpasswd 命令,使用 docker 生成
|
||||||
|
docker run --rm --entrypoint htpasswd httpd:2 -Bbn admin admin123 > auth/htpasswd
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ 认证文件已创建"
|
||||||
|
cat auth/htpasswd
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 停止并删除旧容器
|
||||||
|
echo "🧹 清理旧容器..."
|
||||||
|
docker compose down -v 2>/dev/null || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "🐳 启动 Docker Registry..."
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "⏳ 等待 Registry 启动 (10秒)..."
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
# 测试连接
|
||||||
|
echo ""
|
||||||
|
echo "🔍 测试 Registry 连接..."
|
||||||
|
if curl -s -f http://localhost:5000/v2/ > /dev/null; then
|
||||||
|
echo "✅ Registry API 可访问"
|
||||||
|
else
|
||||||
|
echo "⚠️ Registry API 尚未就绪,请稍等片刻"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "========================================="
|
||||||
|
echo "✅ Docker Registry 部署完成!"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
echo "📦 Registry 信息:"
|
||||||
|
echo " - Registry API: http://localhost:5000"
|
||||||
|
echo " - Web UI: http://localhost:8888"
|
||||||
|
echo " - 用户名: admin"
|
||||||
|
echo " - 密码: admin123"
|
||||||
|
echo ""
|
||||||
|
echo "🔧 Docker 登录:"
|
||||||
|
echo " docker login localhost:5000 -u admin -p admin123"
|
||||||
|
echo ""
|
||||||
|
echo "📝 推送镜像示例:"
|
||||||
|
echo " docker tag myimage:latest localhost:5000/ljwx-health/myimage:latest"
|
||||||
|
echo " docker push localhost:5000/ljwx-health/myimage:latest"
|
||||||
|
echo ""
|
||||||
|
echo "🌐 查看所有仓库:"
|
||||||
|
echo " curl -u admin:admin123 http://localhost:5000/v2/_catalog"
|
||||||
|
echo ""
|
||||||
@@ -46,7 +46,7 @@ spec:
|
|||||||
|
|
||||||
containers:
|
containers:
|
||||||
- name: ljwx-boot
|
- name: ljwx-boot
|
||||||
image: harbor.omniverseai.net/ljwx-health/ljwx-boot:latest
|
image: localhost:5000/ljwx-health/ljwx-boot:latest
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
|
|||||||
Executable
+67
@@ -0,0 +1,67 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# 监控 ljwx-health 部署状态
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "📊 LJWX Health 部署状态监控"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 设置颜色
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# 检查 namespace
|
||||||
|
echo -e "${YELLOW}[1/5] 检查 Namespace...${NC}"
|
||||||
|
kubectl get ns ljwx-health -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查 Secrets
|
||||||
|
echo -e "${YELLOW}[2/5] 检查 Secrets...${NC}"
|
||||||
|
kubectl get secrets -n ljwx-health | grep -E "NAME|harbor-secret|ljwx-boot-secret"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查 Deployments
|
||||||
|
echo -e "${YELLOW}[3/5] 检查 Deployments...${NC}"
|
||||||
|
kubectl get deployments -n ljwx-health -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查 Pods
|
||||||
|
echo -e "${YELLOW}[4/5] 检查 Pods...${NC}"
|
||||||
|
kubectl get pods -n ljwx-health -o wide
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 检查最近的 Events
|
||||||
|
echo -e "${YELLOW}[5/5] 最近的 Events (最后 10 条)...${NC}"
|
||||||
|
kubectl get events -n ljwx-health --sort-by='.lastTimestamp' | tail -10
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 健康状态摘要
|
||||||
|
echo "========================================="
|
||||||
|
echo "📈 健康状态摘要"
|
||||||
|
echo "========================================="
|
||||||
|
|
||||||
|
TOTAL_PODS=$(kubectl get pods -n ljwx-health --no-headers 2>/dev/null | wc -l | tr -d ' ')
|
||||||
|
RUNNING_PODS=$(kubectl get pods -n ljwx-health --field-selector=status.phase=Running --no-headers 2>/dev/null | wc -l | tr -d ' ')
|
||||||
|
READY_PODS=$(kubectl get pods -n ljwx-health -o json 2>/dev/null | jq '[.items[] | select(.status.conditions[] | select(.type=="Ready" and .status=="True"))] | length' 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
echo "总 Pods: $TOTAL_PODS"
|
||||||
|
echo "运行中: $RUNNING_PODS"
|
||||||
|
echo "就绪: $READY_PODS"
|
||||||
|
|
||||||
|
if [ "$READY_PODS" = "$TOTAL_PODS" ] && [ "$TOTAL_PODS" -gt 0 ]; then
|
||||||
|
echo -e "${GREEN}✅ 所有 Pods 已就绪!${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠️ 部分 Pods 未就绪,请检查详细信息${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "========================================="
|
||||||
|
echo "💡 实用命令"
|
||||||
|
echo "========================================="
|
||||||
|
echo "查看 ljwx-boot 日志: kubectl logs -f deployment/ljwx-boot -n ljwx-health"
|
||||||
|
echo "查看 ljwx-bigscreen 日志: kubectl logs -f deployment/ljwx-bigscreen -n ljwx-health"
|
||||||
|
echo "查看所有资源: kubectl get all -n ljwx-health"
|
||||||
|
echo "重新运行此脚本: ./monitor-deployment.sh"
|
||||||
|
echo ""
|
||||||
Executable
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# 实时监控 ljwx-health 部署变化
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "🔍 实时监控 ljwx-health 部署 (每 5 秒刷新)"
|
||||||
|
echo "========================================="
|
||||||
|
echo "按 Ctrl+C 停止监控"
|
||||||
|
echo ""
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# 使用 watch 命令实时监控
|
||||||
|
watch -n 5 -c '
|
||||||
|
echo "📊 Deployments:"
|
||||||
|
kubectl get deployments -n ljwx-health -o wide
|
||||||
|
echo ""
|
||||||
|
echo "🐳 Pods:"
|
||||||
|
kubectl get pods -n ljwx-health -o wide
|
||||||
|
echo ""
|
||||||
|
echo "🔑 Secrets:"
|
||||||
|
kubectl get secrets -n ljwx-health | grep -E "NAME|harbor|ljwx"
|
||||||
|
echo ""
|
||||||
|
echo "⏰ 更新时间: $(date +"%Y-%m-%d %H:%M:%S")"
|
||||||
|
'
|
||||||
Reference in New Issue
Block a user