name: Docker Image CI Dev on: push: tags: - 'v*' # 仅在推送 v 开头的 tag 时触发打包 jobs: # tag 推送时官方不评估 paths,用门禁 job 对比上一 v* tag changes: runs-on: ubuntu-latest outputs: docker: ${{ steps.check.outputs.docker }} steps: - name: 准备代码 uses: actions/checkout@v4 with: fetch-depth: 0 - name: 检查 desktop-client 以外是否有变更 id: check run: | CURRENT="${{ github.ref_name }}" PREV=$(git tag -l 'v*' --sort=-v:refname | grep -vxF "$CURRENT" | head -n1 || true) if [ -z "$PREV" ]; then echo "No previous v* tag; will build docker." echo "docker=true" >> "$GITHUB_OUTPUT" exit 0 fi echo "Comparing $PREV..$GITHUB_SHA (excluding desktop-client/)" # 仅当 desktop-client 以外有改动时才打包容器 if git diff --quiet "$PREV" "$GITHUB_SHA" -- . ':(exclude)desktop-client'; then echo "No changes outside desktop-client/; skip docker build." echo "docker=false" >> "$GITHUB_OUTPUT" else echo "Files outside desktop-client/ changed; will build docker." echo "docker=true" >> "$GITHUB_OUTPUT" fi build: needs: changes if: needs.changes.outputs.docker == 'true' runs-on: ubuntu-latest steps: - name: 准备代码 uses: actions/checkout@v4 - name: 查看文件和目录结构 run: ls -lha - name: 准备生产环境文件 run: | mkdir -p dist/etc # 复制源代码 cp -rf src dist/ cp -rf config dist/ cp -rf template dist/ # 复制依赖配置文件 cp pyproject.toml dist/ cp *.py dist/ cp uv.lock dist/ echo "${{ github.sha }}" > dist/etc/commit_hash - name: 查看文件和目录结构 run: ls -lha dist -R - name: 准备打包Docker镜像的环境 uses: docker/setup-buildx-action@v3 # 登录到Docker Hub - name: 登录Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} # 提取标签信息 - 使用与登录相同的Secret变量名 - name: 提取镜像标签 id: meta uses: docker/metadata-action@v5 with: images: | ${{ secrets.DOCKERHUB_USERNAME }}/capcut-mate # 统一使用DOCKERHUB_USERNAME(无下划线) tags: | type=ref,event=tag type=sha,format=short type=raw,value=latest # 调试步骤:检查生成的标签 - name: 显示生成的镜像标签 run: | echo "生成的标签: ${{ steps.meta.outputs.tags }}" # 检查标签是否包含正确的用户名格式 if [[ ! "${{ steps.meta.outputs.tags }}" == *"${{ secrets.DOCKERHUB_USERNAME }}/capcut-mate:"* ]]; then echo "错误:标签格式不正确,应为 ${secrets.DOCKERHUB_USERNAME}/capcut-mate:标签" exit 1 fi # 构建并推送Docker镜像 - name: 构建并推送Docker镜像 uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=max