Compare commits
3 Commits
2ee249f6f7
...
cicd
| Author | SHA1 | Date | |
|---|---|---|---|
| bd4091524e | |||
| 5b7f778551 | |||
| 38f64f770d |
+149
-66
@@ -404,16 +404,34 @@ jobs:
|
|||||||
docker push ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }}
|
docker push ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: SSH连接预检查
|
||||||
|
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
|
||||||
|
uses: appleboy/ssh-action@v1.0.3
|
||||||
|
with:
|
||||||
|
host: ${{ env.SSH_HOST }}
|
||||||
|
username: ${{ env.SSH_USER }}
|
||||||
|
password: ${{ env.SSH_PASSWORD }}
|
||||||
|
port: ${{ env.SSH_PORT }}
|
||||||
|
timeout: 300s
|
||||||
|
command_timeout: 600s
|
||||||
|
debug: true
|
||||||
|
script: |
|
||||||
|
echo "=== SSH连接测试 ==="
|
||||||
|
echo "连接时间: $(date)"
|
||||||
|
echo "服务器主机名: $(hostname)"
|
||||||
|
echo "当前用户: $(whoami)"
|
||||||
|
echo "系统信息: $(uname -a)"
|
||||||
|
echo "Docker版本: $(docker --version 2>/dev/null || echo 'Docker未安装')"
|
||||||
|
echo "✅ SSH连接成功"
|
||||||
|
|
||||||
- name: 部署管理面板到服务器
|
- name: 部署管理面板到服务器
|
||||||
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both'
|
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both'
|
||||||
uses: appleboy/ssh-action@v1.0.3
|
uses: appleboy/ssh-action@v1.0.3
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.HOST }}
|
host: ${{ env.SSH_HOST }}
|
||||||
username: ${{ secrets.USERNAME }}
|
username: ${{ env.SSH_USER }}
|
||||||
key: ${{ secrets.KEY }}
|
password: ${{ env.SSH_PASSWORD }}
|
||||||
port: ${{ secrets.PORT }}
|
port: ${{ env.SSH_PORT }}
|
||||||
timeout: 300s
|
timeout: 300s
|
||||||
command_timeout: 600s
|
command_timeout: 600s
|
||||||
script: |
|
script: |
|
||||||
@@ -480,24 +498,53 @@ jobs:
|
|||||||
|
|
||||||
# 安全停止和移除容器
|
# 安全停止和移除容器
|
||||||
echo "检查现有容器状态..."
|
echo "检查现有容器状态..."
|
||||||
if docker ps -q -f name=ppanel-admin-web | grep -q .; then
|
CONTAINER_NAME="ppanel-admin-web"
|
||||||
echo "停止运行中的容器..."
|
|
||||||
docker stop ppanel-admin-web --time=10 || true
|
|
||||||
sleep 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
if docker ps -aq -f name=ppanel-admin-web | grep -q .; then
|
# 检查容器是否存在
|
||||||
echo "移除现有容器..."
|
if docker ps -aq -f name=$CONTAINER_NAME | grep -q .; then
|
||||||
# 等待容器完全停止
|
echo "发现现有容器,开始清理..."
|
||||||
for i in {1..10}; do
|
|
||||||
if docker rm ppanel-admin-web 2>/dev/null; then
|
# 检查容器是否正在运行
|
||||||
echo "容器移除成功"
|
if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then
|
||||||
|
echo "停止运行中的容器..."
|
||||||
|
docker stop $CONTAINER_NAME --time=15 || true
|
||||||
|
sleep 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查容器是否正在被移除
|
||||||
|
echo "检查容器移除状态..."
|
||||||
|
for i in {1..15}; do
|
||||||
|
# 尝试获取容器状态
|
||||||
|
CONTAINER_STATUS=$(docker inspect $CONTAINER_NAME --format='{{.State.Status}}' 2>/dev/null || echo "not_found")
|
||||||
|
|
||||||
|
if [ "$CONTAINER_STATUS" = "not_found" ]; then
|
||||||
|
echo "✅ 容器已不存在"
|
||||||
break
|
break
|
||||||
|
elif [ "$CONTAINER_STATUS" = "removing" ]; then
|
||||||
|
echo "⏳ 容器正在移除中,等待完成... $i/15"
|
||||||
|
sleep 3
|
||||||
else
|
else
|
||||||
echo "等待容器停止... $i/10"
|
echo "尝试移除容器... $i/15"
|
||||||
|
if docker rm -f $CONTAINER_NAME 2>/dev/null; then
|
||||||
|
echo "✅ 容器移除成功"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "⚠️ 容器移除失败,重试..."
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 最后一次尝试强制清理
|
||||||
|
if [ $i -eq 15 ]; then
|
||||||
|
echo "🔧 执行强制清理..."
|
||||||
|
docker kill $CONTAINER_NAME 2>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
docker rm -f $CONTAINER_NAME 2>/dev/null || true
|
||||||
sleep 2
|
sleep 2
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
else
|
||||||
|
echo "✅ 未发现现有容器"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "启动新容器..."
|
echo "启动新容器..."
|
||||||
@@ -529,12 +576,13 @@ jobs:
|
|||||||
if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
|
if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
|
||||||
uses: appleboy/ssh-action@v1.0.3
|
uses: appleboy/ssh-action@v1.0.3
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.HOST }}
|
host: ${{ env.SSH_HOST }}
|
||||||
username: ${{ secrets.USERNAME }}
|
username: ${{ env.SSH_USER }}
|
||||||
key: ${{ secrets.KEY }}
|
password: ${{ env.SSH_PASSWORD }}
|
||||||
port: ${{ secrets.PORT }}
|
port: ${{ env.SSH_PORT }}
|
||||||
timeout: 300s
|
timeout: 300s
|
||||||
command_timeout: 600s
|
command_timeout: 600s
|
||||||
|
debug: true
|
||||||
script: |
|
script: |
|
||||||
echo "=== SSH变量调试信息 ==="
|
echo "=== SSH变量调试信息 ==="
|
||||||
echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}"
|
echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}"
|
||||||
@@ -599,24 +647,53 @@ jobs:
|
|||||||
|
|
||||||
# 安全停止和移除容器
|
# 安全停止和移除容器
|
||||||
echo "检查现有容器状态..."
|
echo "检查现有容器状态..."
|
||||||
if docker ps -q -f name=ppanel-user-web | grep -q .; then
|
CONTAINER_NAME="ppanel-user-web"
|
||||||
echo "停止运行中的容器..."
|
|
||||||
docker stop ppanel-user-web --time=10 || true
|
|
||||||
sleep 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
if docker ps -aq -f name=ppanel-user-web | grep -q .; then
|
# 检查容器是否存在
|
||||||
echo "移除现有容器..."
|
if docker ps -aq -f name=$CONTAINER_NAME | grep -q .; then
|
||||||
# 等待容器完全停止
|
echo "发现现有容器,开始清理..."
|
||||||
for i in {1..10}; do
|
|
||||||
if docker rm ppanel-user-web 2>/dev/null; then
|
# 检查容器是否正在运行
|
||||||
echo "容器移除成功"
|
if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then
|
||||||
|
echo "停止运行中的容器..."
|
||||||
|
docker stop $CONTAINER_NAME --time=15 || true
|
||||||
|
sleep 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查容器是否正在被移除
|
||||||
|
echo "检查容器移除状态..."
|
||||||
|
for i in {1..15}; do
|
||||||
|
# 尝试获取容器状态
|
||||||
|
CONTAINER_STATUS=$(docker inspect $CONTAINER_NAME --format='{{.State.Status}}' 2>/dev/null || echo "not_found")
|
||||||
|
|
||||||
|
if [ "$CONTAINER_STATUS" = "not_found" ]; then
|
||||||
|
echo "✅ 容器已不存在"
|
||||||
break
|
break
|
||||||
|
elif [ "$CONTAINER_STATUS" = "removing" ]; then
|
||||||
|
echo "⏳ 容器正在移除中,等待完成... $i/15"
|
||||||
|
sleep 3
|
||||||
else
|
else
|
||||||
echo "等待容器停止... $i/10"
|
echo "尝试移除容器... $i/15"
|
||||||
|
if docker rm -f $CONTAINER_NAME 2>/dev/null; then
|
||||||
|
echo "✅ 容器移除成功"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "⚠️ 容器移除失败,重试..."
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 最后一次尝试强制清理
|
||||||
|
if [ $i -eq 15 ]; then
|
||||||
|
echo "🔧 执行强制清理..."
|
||||||
|
docker kill $CONTAINER_NAME 2>/dev/null || true
|
||||||
|
sleep 2
|
||||||
|
docker rm -f $CONTAINER_NAME 2>/dev/null || true
|
||||||
sleep 2
|
sleep 2
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
else
|
||||||
|
echo "✅ 未发现现有容器"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "启动新容器..."
|
echo "启动新容器..."
|
||||||
@@ -644,39 +721,45 @@ jobs:
|
|||||||
docker logs ppanel-user-web || true
|
docker logs ppanel-user-web || true
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: 发送成功通知到Telegram
|
# 步骤5: TG通知 (成功)
|
||||||
|
- name: 📱 发送成功通知到Telegram
|
||||||
if: success()
|
if: success()
|
||||||
run: |
|
uses: chapvic/telegram-notify@master
|
||||||
MESSAGE="✅ 部署成功!
|
with:
|
||||||
|
bot_token: ${{ env.TELEGRAM_BOT_TOKEN }}
|
||||||
📦 项目: ${{ github.repository }}
|
chat_id: ${{ env.TELEGRAM_CHAT_ID }}
|
||||||
🌿 分支: ${{ github.ref_name }}
|
message: |
|
||||||
🔖 版本: ${{ env.VERSION }}
|
✅ **部署成功!**
|
||||||
🎯 构建目标: ${{ env.BUILD_TARGET }}
|
|
||||||
🔗 API地址: ${{ env.NEXT_PUBLIC_API_URL }}
|
📦 **项目**: ${{ github.repository }}
|
||||||
|
🌿 **分支**: ${{ github.ref_name }}
|
||||||
🕐 时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
🔖 **版本**: ${{ env.VERSION }}
|
||||||
|
🎯 **构建目标**: ${{ env.BUILD_TARGET }}
|
||||||
curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
|
🔗 **API地址**: ${{ env.NEXT_PUBLIC_API_URL }}
|
||||||
-d chat_id="${{ secrets.TELEGRAM_CHAT_ID }}" \
|
📝 **提交**: ${{ github.sha }}
|
||||||
-d text="$MESSAGE" \
|
👤 **提交者**: ${{ github.actor }}
|
||||||
-d parse_mode="HTML"
|
🕐 **时间**: ${{ github.event.head_commit.timestamp }}
|
||||||
|
|
||||||
|
🚀 **服务已成功部署到生产环境**
|
||||||
|
parse_mode: Markdown
|
||||||
|
|
||||||
- name: 发送失败通知到Telegram
|
# 步骤5: TG通知 (失败)
|
||||||
|
- name: 📱 发送失败通知到Telegram
|
||||||
if: failure()
|
if: failure()
|
||||||
run: |
|
uses: chapvic/telegram-notify@master
|
||||||
MESSAGE="❌ 部署失败!
|
with:
|
||||||
|
bot_token: ${{ env.TELEGRAM_BOT_TOKEN }}
|
||||||
📦 项目: ${{ github.repository }}
|
chat_id: ${{ env.TELEGRAM_CHAT_ID }}
|
||||||
🌿 分支: ${{ github.ref_name }}
|
message: |
|
||||||
🔖 版本: ${{ env.VERSION }}
|
❌ **部署失败!**
|
||||||
🎯 构建目标: ${{ env.BUILD_TARGET }}
|
|
||||||
|
📦 **项目**: ${{ github.repository }}
|
||||||
🕐 时间: $(date '+%Y-%m-%d %H:%M:%S')
|
🌿 **分支**: ${{ github.ref_name }}
|
||||||
|
🔖 **版本**: ${{ env.VERSION }}
|
||||||
请检查构建日志获取详细信息。"
|
🎯 **构建目标**: ${{ env.BUILD_TARGET }}
|
||||||
|
📝 **提交**: ${{ github.sha }}
|
||||||
curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
|
👤 **提交者**: ${{ github.actor }}
|
||||||
-d chat_id="${{ secrets.TELEGRAM_CHAT_ID }}" \
|
🕐 **时间**: ${{ github.event.head_commit.timestamp }}
|
||||||
-d text="$MESSAGE" \
|
|
||||||
-d parse_mode="HTML"
|
⚠️ **请检查构建日志获取详细信息**
|
||||||
|
parse_mode: Markdown
|
||||||
|
|||||||
Reference in New Issue
Block a user