name: Build and Deploy on: push: branches: - main - master pull_request: branches: - main - master jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Build application run: npm run build - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: dist path: dist/ deploy: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' steps: - name: Checkout code uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: dist path: dist/ - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build Docker image run: | docker build -t vue-demo:latest . docker tag vue-demo:latest vue-demo:${{ github.sha }} - name: Save Docker image run: docker save vue-demo:latest | gzip > vue-demo-image.tar.gz # Deploy su server con Traefik via SSH - name: Deploy to server uses: appleboy/scp-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} source: "docker-compose.yml,vue-demo-image.tar.gz" target: "${{ secrets.DEPLOY_PATH }}" - name: Create .env file on server uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd ${{ secrets.DEPLOY_PATH }} echo "DOMAIN=${{ secrets.DOMAIN }}" > .env - name: Deploy with Docker and Traefik uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd ${{ secrets.DEPLOY_PATH }} # Carica l'immagine Docker docker load < vue-demo-image.tar.gz # Crea rete Traefik se non esiste docker network inspect traefik-network >/dev/null 2>&1 || docker network create traefik-network # Ferma e rimuovi container precedente docker-compose down # Avvia nuovo container docker-compose up -d # Cleanup vecchie immagini docker image prune -f