name: Build and Push to GHCR & ACR # 此工作流仅在推送标签 (v*) 时触发,用于构建和推送 Docker 镜像 on: push: tags: - 'v*' workflow_dispatch: jobs: build-and-push: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 # 设置 Docker Buildx(支持多架构构建) - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # 设置 QEMU(用于模拟不同架构) - name: Set up QEMU uses: docker/setup-qemu-action@v3 # 检查 ACR 是否启用 - name: Check if ACR registry is set id: check-acr run: | if [ -n "${{ secrets.ACR_REGISTRY }}" ]; then echo "acr_enabled=true" >> $GITHUB_OUTPUT else echo "acr_enabled=false" >> $GITHUB_OUTPUT fi # 登录 ACR(仅在启用时) - name: Log in to Aliyun ACR if: steps.check-acr.outputs.acr_enabled == 'true' uses: docker/login-action@v3 with: registry: ${{ secrets.ACR_REGISTRY }} username: ${{ secrets.ACR_USERNAME }} password: ${{ secrets.ACR_PASSWORD }} # 登录 GitHub Container Registry - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # 获取仓库所有者小写形式 - name: Get lowercase repository owner id: lowercase run: echo "repository_owner_lowercase=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT # 准备镜像 tag(包括 latest 和版本 tag) - name: Prepare tags id: tags run: | REPO_LOWERCASE="ghcr.io/${{ steps.lowercase.outputs.repository_owner_lowercase }}/open-web-search" VERSION_TAG="${GITHUB_REF##*/}" TAGS="${REPO_LOWERCASE}:latest,${REPO_LOWERCASE}:${VERSION_TAG}" if [ "${{ steps.check-acr.outputs.acr_enabled }}" == "true" ] && [ -n "${{ secrets.ACR_IMAGE_NAME }}" ]; then ACR_REPO="${{ secrets.ACR_REGISTRY }}/${{ secrets.ACR_IMAGE_NAME }}" TAGS="${TAGS},${ACR_REPO}:latest,${ACR_REPO}:${VERSION_TAG}" fi # 输出 tags 结果 echo "tags<> $GITHUB_OUTPUT echo "$TAGS" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT # 构建并推送多架构镜像 - name: Build and Push Multi-Platform Docker Image uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 # 🎯 这里添加了多平台支持 push: true tags: ${{ steps.tags.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=max