name: Docker Build and Push on: push: branches: [ main ] # 只在 main 分支推送时触发 workflow_dispatch: # 支持手动触发 env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} CACHE_FROM_BACKEND: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-backend:buildcache CACHE_TO_BACKEND: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-backend:buildcache,mode=max CACHE_FROM_FRONTEND: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-frontend:buildcache CACHE_TO_FRONTEND: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-frontend:buildcache,mode=max jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Get current time id: time run: echo "TIME=$(date +'%Y%m%d%H%M')" >> $GITHUB_ENV - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 with: platforms: linux/amd64,linux/arm64 # 构建后端镜像 - name: Build and push backend uses: docker/build-push-action@v4 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: | ${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-backend:latest ${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-backend:${{ env.TIME }} cache-from: ${{ env.CACHE_FROM_BACKEND }} cache-to: ${{ env.CACHE_TO_BACKEND }} # 构建前端镜像 - name: Build and push frontend uses: docker/build-push-action@v4 with: context: ./frontend platforms: linux/amd64,linux/arm64 push: true tags: | ${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-frontend:latest ${{ secrets.DOCKERHUB_USERNAME }}/stock-scanner-frontend:${{ env.TIME }} cache-from: ${{ env.CACHE_FROM_FRONTEND }} cache-to: ${{ env.CACHE_TO_FRONTEND }} deploy: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' && github.event_name == 'push' steps: - name: Deploy to server uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd ${{ secrets.DEPLOY_PATH }} # 设置环境变量 export DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }} export TAG=${{ env.TIME }} # 拉取最新代码 git pull # 拉取最新镜像并重启服务 docker compose -f docker-compose.prod.yml pull docker compose -f docker-compose.prod.yml up -d # 清理未使用的镜像和容器 docker system prune -f