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 <[email protected]>
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
|
||||
id: config
|
||||
run: |
|
||||
if [ -f .env ]; then
|
||||
source .env
|
||||
# 优先使用本地 Registry 配置
|
||||
if [ -f .env.local-registry ]; then
|
||||
source .env.local-registry
|
||||
echo "registry=${REGISTRY}" >> $GITHUB_OUTPUT
|
||||
echo "harbor_host=${HARBOR_HOST}" >> $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
|
||||
echo "registry=harbor.omniverseai.net/health" >> $GITHUB_OUTPUT
|
||||
echo "registry=localhost:5000" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Determine version
|
||||
@@ -80,7 +86,7 @@ jobs:
|
||||
build-and-push:
|
||||
name: Build and Push ${{ matrix.component }}
|
||||
needs: prepare
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: self-hosted
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -95,12 +101,9 @@ jobs:
|
||||
with:
|
||||
platforms: linux/amd64,linux/arm64
|
||||
|
||||
- name: Log in to Harbor
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ secrets.HARBOR_HOST || 'harbor.omniverseai.net' }}
|
||||
username: ${{ secrets.HARBOR_USERNAME }}
|
||||
password: ${{ secrets.HARBOR_PASSWORD }}
|
||||
- name: Log in to Local Registry
|
||||
run: |
|
||||
echo "admin123" | docker login localhost:5000 -u admin --password-stdin
|
||||
|
||||
- name: Prepare build context
|
||||
id: context
|
||||
@@ -191,16 +194,12 @@ jobs:
|
||||
run: |
|
||||
kubectl create namespace ljwx-health --dry-run=client -o yaml | kubectl apply -f -
|
||||
|
||||
- name: Create Harbor image pull secret
|
||||
env:
|
||||
HARBOR_HOST: ${{ secrets.HARBOR_HOST || 'harbor.omniverseai.net' }}
|
||||
HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }}
|
||||
HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }}
|
||||
- name: Create Local Registry image pull secret
|
||||
run: |
|
||||
kubectl create secret docker-registry harbor-secret \
|
||||
--docker-server=${HARBOR_HOST} \
|
||||
--docker-username=${HARBOR_USERNAME} \
|
||||
--docker-password=${HARBOR_PASSWORD} \
|
||||
--docker-server=localhost:5000 \
|
||||
--docker-username=admin \
|
||||
--docker-password=admin123 \
|
||||
--namespace=ljwx-health \
|
||||
--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:
|
||||
- name: ljwx-boot
|
||||
image: harbor.omniverseai.net/ljwx-health/ljwx-boot:latest
|
||||
image: localhost:5000/ljwx-health/ljwx-boot:latest
|
||||
imagePullPolicy: Always
|
||||
|
||||
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