如何使用GitHub Action中Semantic Release生成的版本号标记Docker镜像
问题原因
${{ github.ref_name }} 取的是触发工作流的分支名(这里是master),因为你的工作流是在push到master分支时触发的,所以它不会自动引用Semantic Release生成的版本号。要实现用发布版本号打镜像标签,需要在release任务中捕获版本号,再传递给build任务。
解决方案
修改你的工作流,分两步:在release任务中提取并输出版本号,然后在build任务中引用这个版本号。同时优化Docker构建步骤避免重复构建。
修改后的完整工作流
name: Release on: push: branches: [ master ] jobs: release: permissions: contents: write issues: write pull-requests: write runs-on: ubuntu-latest # 定义release任务的输出变量,供build任务调用 outputs: release_version: ${{ steps.get_version.outputs.version }} steps: - uses: actions/checkout@v2 with: fetch-depth: 0 # 确保能获取完整提交历史,Semantic Release需要这个 - uses: actions/setup-node@v2 with: node-version: 18 - run: npm ci - run: npm run build - run: npx semantic-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 提取Semantic Release更新后的版本号,输出为任务变量 - name: 获取发布版本号 id: get_version run: echo "version=$(npm pkg get version | tr -d '"')" >> $GITHUB_OUTPUT build: needs: release runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: fetch-depth: 0 # 获取包含版本更新的最新代码 - name: 登录容器注册表 uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} # 一次构建并推送多个标签(latest和版本号),避免重复构建 - name: 构建并推送Docker镜像 uses: docker/build-push-action@v2 with: push: true tags: | ghcr.io/ioncoder/gitflow-test-gui:latest ghcr.io/ioncoder/gitflow-test-gui:${{ needs.release.outputs.release_version }}
关键修改点
- 捕获版本号:在release任务最后添加步骤,从更新后的
package.json中提取版本号,通过GITHUB_OUTPUT输出为任务变量release_version。 - 传递版本号:在release任务的
outputs中声明变量,build任务通过needs.release.outputs.release_version引用。 - 优化Docker构建:将两次
docker/build-push-action合并为一次,同时推送latest和版本号标签,节省构建时间。 - 完整代码拉取:给
actions/checkout添加fetch-depth: 0,确保能获取到Semantic Release提交的版本更新和CHANGELOG。
内容的提问来源于stack exchange,提问作者PrestonDocks
相关产品推荐
相关产品推荐

