feat: 新增條件式容器重建邏輯,減少 502 停機時間
All checks were successful
Koori-ERP-Deploy-System / deploy-demo (push) Successful in 53s
Koori-ERP-Deploy-System / deploy-production (push) Has been skipped

This commit is contained in:
2026-01-12 10:22:29 +08:00
parent 7c1ee40882
commit d736bf9802

View File

@@ -48,8 +48,26 @@ jobs:
docker exec koori-erp-laravel php artisan down --refresh=15 --retry=60 || true docker exec koori-erp-laravel php artisan down --refresh=15 --retry=60 || true
fi fi
# 2. 啟動或重建容器502 最容易發生在這裡的瞬間 # 2. 檢查是否需要重建容器(只有 Dockerfile 或 compose.yaml 變動時才重建
- name: Step 2 - Container Up & Health Check - name: Step 2 - Check if Rebuild Needed
id: check_rebuild
uses: appleboy/ssh-action@master
with:
host: 192.168.0.103
port: 22
username: amba
key: ${{ secrets.DEMO_SSH_KEY }}
script: |
cd /home/amba/koori-erp
# 檢查最近的 commit 是否包含 Dockerfile 或 compose.yaml 的變更
if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|docker-compose\.yaml)'; then
echo "REBUILD_NEEDED=true"
else
echo "REBUILD_NEEDED=false"
fi
# 3. 啟動或重建容器(根據檢查結果決定是否加 --build
- name: Step 3 - Container Up & Health Check
uses: appleboy/ssh-action@master uses: appleboy/ssh-action@master
with: with:
host: 192.168.0.103 host: 192.168.0.103
@@ -59,11 +77,20 @@ jobs:
script: | script: |
cd /home/amba/koori-erp cd /home/amba/koori-erp
chown -R 1000:1000 . chown -R 1000:1000 .
# 檢查是否需要重建
if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|docker-compose\.yaml)'; then
echo "🔄 偵測到 Docker 相關檔案變更,執行完整重建..."
WWWGROUP=1000 WWWUSER=1000 docker compose up -d --build --wait WWWGROUP=1000 WWWUSER=1000 docker compose up -d --build --wait
else
echo "⚡ 無 Docker 檔案變更,僅重新啟動容器..."
WWWGROUP=1000 WWWUSER=1000 docker compose up -d --wait
fi
echo "容器狀態:" && docker ps --filter "name=koori-erp-laravel" echo "容器狀態:" && docker ps --filter "name=koori-erp-laravel"
- name: Step 3 - Composer & NPM Build - name: Step 4 - Composer & NPM Build
run: | run: |
docker exec -u 1000:1000 -w /var/www/html koori-erp-laravel sh -c " docker exec -u 1000:1000 -w /var/www/html koori-erp-laravel sh -c "
# 1. 後端依賴 (Demo 環境建議加上 --no-interaction 避免卡住) # 1. 後端依賴 (Demo 環境建議加上 --no-interaction 避免卡住)
@@ -81,8 +108,8 @@ jobs:
" "
docker exec koori-erp-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache docker exec koori-erp-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
# 4. 關閉維護模式(部署完成,恢復服務) # 5. 關閉維護模式(部署完成,恢復服務)
- name: Step 4 - Disable Maintenance Mode - name: Step 5 - Disable Maintenance Mode
uses: appleboy/ssh-action@master uses: appleboy/ssh-action@master
with: with:
host: 192.168.0.103 host: 192.168.0.103
@@ -132,8 +159,26 @@ jobs:
docker exec koori-erp-laravel php artisan down --refresh=15 --retry=60 || true docker exec koori-erp-laravel php artisan down --refresh=15 --retry=60 || true
fi fi
# 2. 啟動或重建容器502 最容易發生在這裡的瞬間 # 2. 檢查是否需要重建容器(只有 Dockerfile 或 compose.yaml 變動時才重建
- name: Step 2 - Container Up & Health Check - name: Step 2 - Check if Rebuild Needed
id: check_rebuild_prod
uses: appleboy/ssh-action@master
with:
host: erp.koori.tw
port: 2224
username: root
key: ${{ secrets.PROD_SSH_KEY }}
script: |
cd /var/www/koori-erp-prod
# 檢查最近的 commit 是否包含 Dockerfile 或 compose.yaml 的變更
if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|docker-compose\.yaml)'; then
echo "REBUILD_NEEDED=true"
else
echo "REBUILD_NEEDED=false"
fi
# 3. 啟動或重建容器(根據檢查結果決定是否加 --build
- name: Step 3 - Container Up & Health Check
uses: appleboy/ssh-action@master uses: appleboy/ssh-action@master
with: with:
host: erp.koori.tw host: erp.koori.tw
@@ -143,7 +188,16 @@ jobs:
script: | script: |
cd /var/www/koori-erp-prod cd /var/www/koori-erp-prod
chown -R 1000:1000 . chown -R 1000:1000 .
# 檢查是否需要重建
if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|docker-compose\.yaml)'; then
echo "🔄 偵測到 Docker 相關檔案變更,執行完整重建..."
WWWGROUP=1000 WWWUSER=1000 docker compose up -d --build --wait WWWGROUP=1000 WWWUSER=1000 docker compose up -d --build --wait
else
echo "⚡ 無 Docker 檔案變更,僅重新啟動容器..."
WWWGROUP=1000 WWWUSER=1000 docker compose up -d --wait
fi
echo "容器狀態:" && docker ps --filter "name=koori-erp-laravel" echo "容器狀態:" && docker ps --filter "name=koori-erp-laravel"
docker exec -u 1000:1000 -w /var/www/html koori-erp-laravel sh -c " docker exec -u 1000:1000 -w /var/www/html koori-erp-laravel sh -c "
@@ -158,8 +212,8 @@ jobs:
" "
docker exec koori-erp-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache docker exec koori-erp-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
# 3. 關閉維護模式(部署完成,恢復服務) # 4. 關閉維護模式(部署完成,恢復服務)
- name: Step 3 - Disable Maintenance Mode - name: Step 4 - Disable Maintenance Mode
uses: appleboy/ssh-action@master uses: appleboy/ssh-action@master
with: with:
host: erp.koori.tw host: erp.koori.tw