fix bug: 任务重复执行 #52
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Push Docker Image | |
| on: | |
| push: | |
| branches: | |
| - master | |
| - dev | |
| tags: | |
| - 'v*' | |
| pull_request: | |
| branches: | |
| - master | |
| - dev | |
| jobs: | |
| build-and-push: | |
| runs-on: ubuntu-latest | |
| steps: | |
| # 1. 检出代码 | |
| - name: Checkout repository | |
| uses: actions/checkout@v3 | |
| # 2. 从 version.yml 读取版本号 (修复版) | |
| - name: Extract version from version.yml | |
| id: version | |
| run: | | |
| # 检查文件是否存在 | |
| if [ ! -f "version.yml" ]; then | |
| echo "❌ 错误:version.yml 文件不存在" | |
| exit 1 | |
| fi | |
| echo "=== version.yml 内容 ===" | |
| cat version.yml | |
| echo "======================" | |
| # 方法1: 使用简单的grep和sed提取(无需安装yq) | |
| RAW_VERSION=$(grep -E '^version:' version.yml | cut -d':' -f2 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') | |
| if [ -z "$RAW_VERSION" ]; then | |
| echo "❌ 错误:无法从 version.yml 读取 version 字段" | |
| exit 1 | |
| fi | |
| # 清理版本号(移除引号和v前缀) | |
| CLEAN_VERSION=$(echo "$RAW_VERSION" | tr -d '\"'"'" | sed 's/^v//') | |
| # 验证版本格式 (x.y.z, x.y.z-dev, 或 dev) | |
| if [[ ! "$CLEAN_VERSION" =~ ^([0-9]+\.[0-9]+\.[0-9]+(-dev)?|dev)$ ]]; then | |
| echo "❌ 错误:版本号格式无效,应为 x.y.z、x.y.z-dev 或 dev(例如 1.0.1、1.0.1-dev 或 dev)" | |
| echo "当前值: '$CLEAN_VERSION'" | |
| exit 1 | |
| fi | |
| # 检查是否为dev版本 | |
| if [[ "$CLEAN_VERSION" == *"dev"* ]]; then | |
| echo "⚠️ 检测到dev版本,将不推送latest标签" | |
| echo "is_dev=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "is_dev=false" >> $GITHUB_OUTPUT | |
| fi | |
| echo "✅ 版本号: $CLEAN_VERSION" | |
| echo "version=$CLEAN_VERSION" >> $GITHUB_OUTPUT | |
| # 3. 登录 Docker Hub | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v2 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| # 4. 设置 Docker Buildx | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v2 | |
| # 5. 构建并推送 Docker 镜像(带版本标签) | |
| - name: Build and push with version tag | |
| uses: docker/build-push-action@v4 | |
| with: | |
| context: . | |
| file: ./Dockerfile | |
| push: true | |
| tags: 7ommymerlin/notify-scheduler:${{ steps.version.outputs.version }} | |
| # 6. 推送 latest 标签(仅非dev版本) | |
| - name: Push latest tag | |
| if: steps.version.outputs.is_dev == 'false' | |
| uses: docker/build-push-action@v4 | |
| with: | |
| context: . | |
| file: ./Dockerfile | |
| push: true | |
| tags: 7ommymerlin/notify-scheduler:latest | |
| # 7. 验证推送结果 | |
| - name: Verify pushed tags | |
| run: | | |
| echo "✅ 镜像已成功推送至 Docker Hub" | |
| echo "📦 镜像标签:" | |
| echo " - 7ommymerlin/notify-scheduler:${{ steps.version.outputs.version }}" | |
| if [ "${{ steps.version.outputs.is_dev }}" == "false" ]; then | |
| echo " - 7ommymerlin/notify-scheduler:latest" | |
| else | |
| echo " ⚠️ dev版本,未推送latest标签" | |
| fi |