star-cloud/.gitea/workflows/deploy-demo.yaml
sky121113 d3cb9b4fee [FIX] 根因修復 - 共享 Volume 下不需對每個容器重複同步
根因:三個容器 (laravel, queue, mqtt-worker) 共享同一份
volume mount (.:/var/www/html)。對 laravel 容器做 tar 同步時,
queue/mqtt-worker 會同時看到檔案變動,導致它們 crash → restart。
接著對 queue 容器做冗餘同步時就會撞上 restarting 狀態。

修復:
1. 只對主容器 (star-cloud-laravel) 同步一次即可
2. 同步完成後等待 worker 容器從短暫重啟中恢復
3. 移除對 queue/mqtt-worker 的冗餘 tar 同步
2026-04-21 16:54:45 +08:00

108 lines
4.6 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: star-cloud-deploy-demo
on:
push:
branches:
- demo
jobs:
deploy-demo:
runs-on: ubuntu-latest # 使用機器人預設宣告的標籤
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Step 0 - Prepare Environment & Sync Configs
run: |
# 1. 確保 Runner 暫存區結構正確 (清理可能因先前失敗誤建的目錄)
if [ -d "docker/emqx/acl.conf" ]; then
echo "Removing docker/emqx/acl.conf directory in runner..."
rm -rf "docker/emqx/acl.conf"
fi
mkdir -p docker/emqx
# 2. 檢查並清理宿主機 (Host) 上被 Docker 誤建為目錄的檔案
docker run --rm -v /workspace/mama/star-cloud:/target busybox sh -c "
if [ -d /target/.env ]; then echo 'Removing .env directory on host'; rm -rf /target/.env; fi
if [ -d /target/docker/emqx/acl.conf ]; then echo 'Removing acl.conf directory on host'; rm -rf /target/docker/emqx/acl.conf; fi
"
# 3. 從宿主機載入持久化的 .env 檔案 (若無則複製 .env.example)
docker run --rm -v /workspace/mama/star-cloud:/data:ro busybox cat /data/.env > .env || cp .env.example .env
# 4. 將 Runner 最新 Checkout 的設定檔同步至宿主機持久區,確保後續 compose 掛載正確
docker run --rm -v /workspace/mama/star-cloud:/target busybox mkdir -p /target/docker/emqx
cat docker/emqx/acl.conf | docker run -i --rm -v /workspace/mama/star-cloud:/target busybox sh -c "cat > /target/docker/emqx/acl.conf"
- name: Step 1 - Build & Deploy Containers
run: |
WWWGROUP=1000 WWWUSER=1000 docker compose -f compose.yaml up -d --build --wait
- name: Step 2 - Deploy Code
shell: bash
run: |
# 等待容器進入 running 狀態 (最多 30 秒)
wait_for_container() {
local container=$1
local max_attempts=15
local attempt=0
while [ $attempt -lt $max_attempts ]; do
local state=$(docker inspect --format='{{.State.Status}}' "$container" 2>/dev/null)
if [ "$state" = "running" ]; then
return 0
fi
attempt=$((attempt + 1))
echo " Waiting for $container (state=$state, attempt $attempt/$max_attempts)..."
sleep 2
done
echo "!!! Error: $container did not reach running state (last state=$state)"
return 1
}
echo ">>> Syncing code to star-cloud-laravel..."
# 三個容器共享同一份 volume (.:/var/www/html)
# 只需同步至主容器一次queue/mqtt-worker 會自動看到變更。
tar --exclude='.git' --exclude='node_modules' --exclude='vendor' --exclude='storage' --exclude='bootstrap/cache' -cf - . \
| docker exec -i star-cloud-laravel tar -xf - -C /var/www/html/
local_tar=${PIPESTATUS[0]} local_docker=${PIPESTATUS[1]}
echo " Result: tar=$local_tar, docker=$local_docker"
if [ "$local_tar" -gt 1 ] || [ "$local_docker" -ne 0 ]; then
echo "!!! Error: Sync failed (tar=$local_tar, docker=$local_docker)"
exit 1
fi
# 程式碼同步後queue/mqtt-worker 可能因檔案變動而短暫重啟,等待它們恢復
echo ">>> Waiting for worker containers to stabilize..."
wait_for_container star-cloud-queue || exit 1
wait_for_container star-cloud-mqtt-worker || exit 1
echo ">>> All containers are running."
# 設定權限
docker exec star-cloud-laravel sh -c "
chown -R 1000:1000 /var/www/html &&
mkdir -p /.npm && chown -R 1000:1000 /.npm &&
rm -rf /var/www/html/node_modules
"
- name: Step 3 - Composer & NPM & Initialization
run: |
docker exec -u 1000:1000 -w /var/www/html star-cloud-laravel sh -c "
composer install --no-dev --optimize-autoloader --no-interaction &&
npm install &&
npm run build &&
php artisan migrate --force &&
php artisan storage:link &&
php artisan optimize:clear &&
php artisan optimize &&
php artisan view:cache &&
php artisan queue:restart &&
php artisan db:seed --class=RoleSeeder --force &&
php artisan db:seed --class=AdminUserSeeder --force
"
docker exec star-cloud-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
- name: Step 4 - Cleanup
run: docker image prune -f