diff --git a/.gitea/workflows/deploy-demo.yaml b/.gitea/workflows/deploy-demo.yaml index 8816231..6a9a2bc 100644 --- a/.gitea/workflows/deploy-demo.yaml +++ b/.gitea/workflows/deploy-demo.yaml @@ -7,90 +7,37 @@ on: jobs: deploy-demo: - runs-on: ubuntu-latest + runs-on: ubuntu-latest # 使用機器人預設宣告的標籤 steps: - name: Checkout Code uses: actions/checkout@v3 - with: - github-server-url: https://gitea.taiwan-star.com.tw - repository: ${{ github.repository }} - - name: Step 1 - Push Code to Demo + - name: Step 0 - Prepare Environment run: | - apt-get update && apt-get install -y rsync openssh-client - mkdir -p ~/.ssh - echo "${{ secrets.DEMO_SSH_KEY }}" > ~/.ssh/id_rsa_demo - chmod 600 ~/.ssh/id_rsa_demo - rsync -avz --delete \ - --exclude='/.git' \ - --exclude='/node_modules' \ - --exclude='/vendor' \ - --exclude='/storage' \ - --exclude='/.env' \ - --exclude='/public/build' \ - -e "ssh -p 2227 -i ~/.ssh/id_rsa_demo -o StrictHostKeyChecking=no" \ - ./ root@220.132.7.82:/var/www/star-cloud-demo/ - rm ~/.ssh/id_rsa_demo + # 從宿主機固定路徑把持久化的 .env 移回當前工作目錄,供 docker compose 使用 + docker run --rm -v /workspace/mama/star-cloud/.env:/tmp/.env:ro busybox cat /tmp/.env > .env - - name: Step 2 - Check if Rebuild Needed - id: check_rebuild - uses: appleboy/ssh-action@master - with: - host: 220.132.7.82 - port: 2227 - username: root - key: ${{ secrets.DEMO_SSH_KEY }} - script: | - cd /var/www/star-cloud-demo - if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|compose\.demo\.yaml|docker-compose\.yaml)'; then - echo "REBUILD_NEEDED=true" - else - echo "REBUILD_NEEDED=false" - fi + - name: Step 1 - Build & Deploy Containers + run: | + WWWGROUP=1000 WWWUSER=1000 docker compose -f compose.yaml up -d --build --wait - - name: Step 3 - Container Up & Health Check - uses: appleboy/ssh-action@master - with: - host: 220.132.7.82 - port: 2227 - username: root - key: ${{ secrets.DEMO_SSH_KEY }} - script: | - cd /var/www/star-cloud-demo - chown -R 1000:1000 . - - if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|compose\.demo\.yaml|docker-compose\.yaml)'; then - echo "🔄 偵測到 Docker 相關檔案變更,執行完整重建..." - WWWGROUP=1000 WWWUSER=1000 docker compose -f compose.yaml -f compose.demo.yaml up -d --build --wait - else - echo "⚡ 無 Docker 檔案變更,僅重載服務..." - if ! docker ps --format '{{.Names}}' | grep -q 'star-cloud-demo-laravel'; then - echo "容器未運行,正在啟動..." - WWWGROUP=1000 WWWUSER=1000 docker compose -f compose.yaml -f compose.demo.yaml up -d --wait - else - echo "容器已運行,跳過 docker compose,直接進行程式碼部署..." - fi - fi - - echo "容器狀態:" && docker ps --filter "name=star-cloud-demo" + - name: Step 2 - Deploy Code + run: | + # Runner 容器模式下,volume mount 無法正確對應宿主機路徑 + # 使用 docker cp 直接將程式碼注入容器(透過 Docker socket) + docker cp . star-cloud-laravel:/var/www/html/ + 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 4 - Composer & NPM Build - uses: appleboy/ssh-action@master - with: - host: 220.132.7.82 - port: 2227 - username: root - key: ${{ secrets.DEMO_SSH_KEY }} - script: | - docker exec -u 1000:1000 -w /var/www/html star-cloud-demo-laravel sh -c " - # 1. 後端依賴 + - 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 && - - # 2. 前端編譯 npm install && npm run build && - - # 3. Laravel 初始化與優化 php artisan migrate --force && php artisan storage:link && php artisan optimize:clear && @@ -100,18 +47,7 @@ jobs: php artisan db:seed --class=RoleSeeder --force && php artisan db:seed --class=AdminUserSeeder --force " - docker exec star-cloud-demo-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache - - - name: Step 5 - Auto Sync workflows to main - run: | - git config --global user.email "bot@taiwan-star.com.tw" - git config --global user.name "CICD Bot" - git fetch origin main - git checkout main - git checkout ${{ github.ref_name }} -- .gitea/workflows/ - if ! git diff --cached --quiet; then - git commit -m "[AUTO] Sync workflows from ${{ github.ref_name }} to main" - GIT_SSH_COMMAND="ssh -p 3222 -o StrictHostKeyChecking=no" git push origin main - fi - git checkout ${{ github.ref_name }} + 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 diff --git a/.gitea/workflows/deploy-remote-template.yaml b/.gitea/workflows/deploy-remote-template.yaml new file mode 100644 index 0000000..39da520 --- /dev/null +++ b/.gitea/workflows/deploy-remote-template.yaml @@ -0,0 +1,114 @@ +name: star-cloud-deploy-demo + +on: + workflow_dispatch: + +jobs: + deploy-demo: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v3 + with: + github-server-url: https://gitea.taiwan-star.com.tw + repository: ${{ github.repository }} + + - name: Step 1 - Push Code to Demo + run: | + apt-get update && apt-get install -y rsync openssh-client + mkdir -p ~/.ssh + echo "${{ secrets.DEMO_SSH_KEY }}" > ~/.ssh/id_rsa_demo + chmod 600 ~/.ssh/id_rsa_demo + rsync -avz --delete \ + --exclude='/.git' \ + --exclude='/node_modules' \ + --exclude='/vendor' \ + --exclude='/storage' \ + --exclude='/.env' \ + --exclude='/public/build' \ + -e "ssh -p 2227 -i ~/.ssh/id_rsa_demo -o StrictHostKeyChecking=no" \ + ./ root@220.132.7.82:/var/www/star-cloud-demo/ + rm ~/.ssh/id_rsa_demo + + - name: Step 2 - Check if Rebuild Needed + id: check_rebuild + uses: appleboy/ssh-action@master + with: + host: 220.132.7.82 + port: 2227 + username: root + key: ${{ secrets.DEMO_SSH_KEY }} + script: | + cd /var/www/star-cloud-demo + if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|compose\.demo\.yaml|docker-compose\.yaml)'; then + echo "REBUILD_NEEDED=true" + else + echo "REBUILD_NEEDED=false" + fi + + - name: Step 3 - Container Up & Health Check + uses: appleboy/ssh-action@master + with: + host: 220.132.7.82 + port: 2227 + username: root + key: ${{ secrets.DEMO_SSH_KEY }} + script: | + cd /var/www/star-cloud-demo + chown -R 1000:1000 . + + if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|compose\.demo\.yaml|docker-compose\.yaml)'; then + echo "🔄 偵測到 Docker 相關檔案變更,執行完整重建..." + WWWGROUP=1000 WWWUSER=1000 docker compose -f compose.yaml -f compose.demo.yaml up -d --build --wait + else + echo "⚡ 無 Docker 檔案變更,僅重載服務..." + if ! docker ps --format '{{.Names}}' | grep -q 'star-cloud-demo-laravel'; then + echo "容器未運行,正在啟動..." + WWWGROUP=1000 WWWUSER=1000 docker compose -f compose.yaml -f compose.demo.yaml up -d --wait + else + echo "容器已運行,跳過 docker compose,直接進行程式碼部署..." + fi + fi + + echo "容器狀態:" && docker ps --filter "name=star-cloud-demo" + + - name: Step 4 - Composer & NPM Build + uses: appleboy/ssh-action@master + with: + host: 220.132.7.82 + port: 2227 + username: root + key: ${{ secrets.DEMO_SSH_KEY }} + script: | + docker exec -u 1000:1000 -w /var/www/html star-cloud-demo-laravel sh -c " + # 1. 後端依賴 + composer install --no-dev --optimize-autoloader --no-interaction && + + # 2. 前端編譯 + npm install && + npm run build && + + # 3. Laravel 初始化與優化 + 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-demo-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache + + - name: Step 5 - Auto Sync workflows to main + run: | + git config --global user.email "bot@taiwan-star.com.tw" + git config --global user.name "CICD Bot" + git fetch origin main + git checkout main + git checkout ${{ github.ref_name }} -- .gitea/workflows/ + if ! git diff --cached --quiet; then + git commit -m "[AUTO] Sync workflows from ${{ github.ref_name }} to main" + GIT_SSH_COMMAND="ssh -p 3222 -o StrictHostKeyChecking=no" git push origin main + fi + git checkout ${{ github.ref_name }} diff --git a/compose.yaml b/compose.yaml index 91f9b07..6b1f9aa 100644 --- a/compose.yaml +++ b/compose.yaml @@ -11,7 +11,7 @@ services: extra_hosts: - 'host.docker.internal:host-gateway' ports: - - '${APP_PORT:-80}:8080' + - '${APP_PORT:-80}:80' - '${VITE_PORT:-5173}:${VITE_PORT:-5173}' environment: WWWUSER: '${WWWUSER}' @@ -63,7 +63,6 @@ services: TZ: 'Asia/Taipei' volumes: - 'sail-mysql:/var/lib/mysql' - - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' networks: - sail healthcheck: diff --git a/docker/8.5/Dockerfile b/docker/8.5/Dockerfile index 701b834..e152eeb 100644 --- a/docker/8.5/Dockerfile +++ b/docker/8.5/Dockerfile @@ -17,14 +17,15 @@ ENV PLAYWRIGHT_BROWSERS_PATH=0 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone -RUN echo "Acquire::http::Pipeline-Depth 0;" > /etc/apt/apt.conf.d/99custom && \ - echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \ - echo "Acquire::BrokenProxy true;" >> /etc/apt/apt.conf.d/99custom +RUN if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then \ + sed -i 's/\(archive.ubuntu.com\|security.ubuntu.com\)/tw.archive.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources; \ + else \ + sed -i 's/\(archive.ubuntu.com\|security.ubuntu.com\)/tw.archive.ubuntu.com/g' /etc/apt/sources.list; \ + fi -RUN apt-get update && apt-get upgrade -y \ - && mkdir -p /etc/apt/keyrings \ - && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python3 dnsutils librsvg2-bin fswatch ffmpeg nano \ - && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xb8dc7e53946656efbce4c1dd71daeaab4ad4cab6' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \ +RUN apt-get update && apt-get upgrade -y && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python3 dnsutils librsvg2-bin fswatch ffmpeg nano + +RUN curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xb8dc7e53946656efbce4c1dd71daeaab4ad4cab6' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \ && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu noble main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \ && apt-get update \ && apt-get install -y php8.4-cli php8.4-dev \ @@ -33,26 +34,28 @@ RUN apt-get update && apt-get upgrade -y \ php8.4-imap php8.4-mysql php8.4-mbstring \ php8.4-xml php8.4-zip php8.4-bcmath php8.4-soap \ php8.4-intl php8.4-readline \ - php8.4-ldap \ php8.4-msgpack php8.4-igbinary php8.4-redis php8.4-swoole \ - php8.4-memcached php8.4-pcov php8.4-imagick php8.4-xdebug \ - && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \ - && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + php8.4-memcached php8.4-pcov php8.4-imagick php8.4-xdebug + +RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ + && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \ + && php -r "unlink('composer-setup.php');" + +RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \ && apt-get update \ - && apt-get install -y nodejs \ - && npm install -g npm \ - && npm install -g pnpm \ - && npm install -g bun \ - && npx playwright install-deps \ + && apt-get install -y nodejs + +RUN npm install -g pnpm +RUN npm install -g bun + +RUN npx playwright install-deps \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \ && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \ && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt noble-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ && apt-get update \ - && apt-get install -y yarn \ - && apt-get install -y $MYSQL_CLIENT \ - && apt-get install -y postgresql-client-$POSTGRES_VERSION \ + && apt-get install -y yarn $MYSQL_CLIENT postgresql-client-$POSTGRES_VERSION \ && apt-get -y autoremove \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*