# ============================================ # 构建并推送 Docker 镜像到 GitHub Container Registry # ============================================ name: Build and Push Docker Images on: push: branches: - master tags: - 'v*' pull_request: branches: - master workflow_dispatch: env: REGISTRY: ghcr.io NAMESPACE: ${{ github.repository_owner }} BACKEND_IMAGE: idc-backend FRONTEND_IMAGE: idc-frontend jobs: build-backend: name: Build Backend Image runs-on: ubuntu-latest if: github.event_name != 'pull_request' steps: - name: 检出代码 uses: actions/checkout@v4 - name: 登录 GitHub Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: 提取版本号 id: meta run: | if [[ "${{ github.ref_type }}" == "tag" ]]; then VERSION=${GITHUB_REF#refs/tags/} else VERSION=latest fi echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT echo "COMMIT_SHA=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT - name: 设置 Docker Buildx uses: docker/setup-buildx-action@v3 - name: 构建并推送后端镜像 uses: docker/build-push-action@v5 with: context: ./backend file: ./backend/Dockerfile push: true tags: | ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.BACKEND_IMAGE }}:${{ steps.meta.outputs.VERSION }} ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.BACKEND_IMAGE }}:${{ steps.meta.outputs.COMMIT_SHA }} cache-from: type=gha cache-to: type=gha,mode=max build-frontend: name: Build Frontend Image runs-on: ubuntu-latest if: github.event_name != 'pull_request' steps: - name: 检出代码 uses: actions/checkout@v4 - name: 登录 GitHub Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: 提取版本号 id: meta run: | if [[ "${{ github.ref_type }}" == "tag" ]]; then VERSION=${GITHUB_REF#refs/tags/} else VERSION=latest fi echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT echo "COMMIT_SHA=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT - name: 设置 Docker Buildx uses: docker/setup-buildx-action@v3 - name: 构建并推送前端镜像 uses: docker/build-push-action@v5 with: context: ./frontend file: ./frontend/Dockerfile push: true tags: | ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.FRONTEND_IMAGE }}:${{ steps.meta.outputs.VERSION }} ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.FRONTEND_IMAGE }}:${{ steps.meta.outputs.COMMIT_SHA }} cache-from: type=gha cache-to: type=gha,mode=max notify: name: Notify Build Complete runs-on: ubuntu-latest needs: [build-backend, build-frontend] if: always() && github.event_name != 'pull_request' steps: - name: 输出构建结果 run: | echo "=== 构建结果 ===" echo "后端镜像: ${{ needs.build-backend.result }}" echo "前端镜像: ${{ needs.build-frontend.result }}" echo "" echo "ghcr.io 镜像地址:" echo " 后端: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.BACKEND_IMAGE }}:latest" echo " 前端: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.FRONTEND_IMAGE }}:latest" if [[ "${{ needs.build-backend.result }}" == "success" && "${{ needs.build-frontend.result }}" == "success" ]]; then echo "所有镜像构建成功,已推送到 ghcr.io" else echo "部分镜像构建失败" exit 1 fi