name: Backend CI/CD Pipeline on: push: branches: [main, develop] paths: - 'backend/**' pull_request: branches: [main, develop] paths: - 'backend/**' jobs: test: name: 测试 runs-on: ubuntu-latest strategy: matrix: node-version: [20.x] steps: - name: 检出代码 uses: actions/checkout@v3 - name: 设置Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' cache-dependency-path: backend/package-lock.json - name: 安装依赖 working-directory: ./backend run: npm ci - name: 代码检查 working-directory: ./backend run: npm run lint - name: 运行单元测试 working-directory: ./backend run: npm test -- --coverage --watchAll=false - name: 上传测试覆盖率报告 uses: codecov/codecov-action@v3 with: file: ./backend/coverage/lcov.info flags: backend name: backend-coverage build: name: 构建 needs: test runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v3 - name: 设置Node.js uses: actions/setup-node@v3 with: node-version: '20' cache: 'npm' cache-dependency-path: backend/package-lock.json - name: 安装依赖 working-directory: ./backend run: npm ci - name: 构建应用 working-directory: ./backend run: npm run build - name: 上传构建产物 uses: actions/upload-artifact@v3 with: name: dist path: backend/dist docker: name: Docker镜像 needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: 检出代码 uses: actions/checkout@v3 - name: 设置Docker Buildx uses: docker/setup-buildx-action@v2 - name: 登录Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: 构建并推送Docker镜像 uses: docker/build-push-action@v4 with: context: ./backend file: ./backend/Dockerfile push: true tags: | ${{ secrets.DOCKER_USERNAME }}/ecommerce-backend:latest ${{ secrets.DOCKER_USERNAME }}/ecommerce-backend:${{ github.sha }} cache-from: type=registry,ref=${{ secrets.DOCKER_USERNAME }}/ecommerce-backend:buildcache cache-to: type=registry,ref=${{ secrets.DOCKER_USERNAME }}/ecommerce-backend:buildcache,mode=max