You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Cloud Build使用POM版本标记Docker镜像推送失败求助

问题描述

我的Google Cloud Build需要完成以下操作:

  • 构建Maven项目
  • 通过Maven插件构建Docker镜像
  • 重新标记Docker镜像,使其符合Google Cloud Artifact Registry的命名规范
  • 将镜像推送至Artifact Registry

我想把POM版本作为镜像标签的后缀,通过Maven目标提取版本。尝试按照文档建议把版本写入文件后,在images字段里用$(cat /workspace/version.txt)读取时触发构建失败,提示镜像名称解析错误。

当前构建配置:

steps:
  - name: 'maven:3.9.1'
    id: Extract project version from pom
    args:
      - '-c'
      - >
        mvn help:evaluate -Dexpression=project.version -q -DforceStdout > /workspace/version.txt
    entrypoint: bash
  - name: 'maven:3.9.1'
    args:
      - '-c'
      - >
        mvn -version

        mvn clean install -DskipTests

        mvn -B -f ./my-module/pom.xml org.springframework.boot:spring-boot-maven-plugin:build-image -DskipTests
    id: Build all applications and create docker images
    entrypoint: bash
  - name: gcr.io/cloud-builders/docker
    id: Retag my module image
    entrypoint: bash
    args:
      - - '-c'
      - >
        docker tag my-module:$(cat /workspace/version.txt) europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$(cat /workspace/version.txt)
  - name: gcr.io/cloud-builders/docker
    args:
      - image
      - list
images:
  - >-
    europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$(cat /workspace/version.txt)

触发构建时的错误:

Failed to trigger build: invalid build: invalid image name "europe-west4-docker.pkg.dev/my-project/my-repo/my-module:$(cat /workspace/version.txt)": could not parse reference: europe-west4-docker.pkg.dev/my-project/my-repo/my-module:$(cat /workspace/version.txt)

最新构建日志:

starting build "21bf9cc4-a3b2-4fa5-9f4a-227251418f69"

FETCHSOURCE
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint:   git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint:   git branch -m <name>
Initialized empty Git repository in /workspace/.git/
From https://github.com/*****************************************
 * branch            c67f9196c83cb979375e56c20fdf1b74c000b6fb -> FETCH_HEAD
HEAD is now at c67f919 up the pom
BUILD
Starting Step #0 - "Extract project version from pom"
Step #0 - "Extract project version from pom": Pulling image: maven:3.9.1
Step #0 - "Extract project version from pom": 3.9.1: Pulling from library/maven
Step #0 - "Extract project version from pom": 1bc677758ad7: Already exists
Step #0 - "Extract project version from pom": 0d0e0ecb256a: Already exists
Step #0 - "Extract project version from pom": f2771a8876bc: Already exists
Step #0 - "Extract project version from pom": b345cc3cb9aa: Already exists
Step #0 - "Extract project version from pom": cbe2c70538c6: Already exists
Step #0 - "Extract project version from pom": 2dfc9d99b05b: Already exists
Step #0 - "Extract project version from pom": cfed619e8a87: Already exists
Step #0 - "Extract project version from pom": 26665a7643b2: Already exists
Step #0 - "Extract project version from pom": e5e3e15e6256: Already exists
Step #0 - "Extract project version from pom": Digest: sha256:2dee414ad9997352b313031ce3ef2c10b119a333fba743f456ec4b1915081173
Step #0 - "Extract project version from pom": Status: Downloaded newer image for maven:3.9.1
Step #0 - "Extract project version from pom": docker.io/library/maven:3.9.1
Finished Step #0 - "Extract project version from pom"
Starting Step #1 - "Build all applications and create docker images"
Step #1 - "Build all applications and create docker images": Already have image (with digest): maven:3.9.1
Step #1 - "Build all applications and create docker images": 0.0.0.0
Finished Step #1 - "Build all applications and create docker images"
PUSH
DONE
问题原因

Cloud Build的顶层images字段是在构建初始化阶段就被解析的,此时还没有执行任何构建步骤,/workspace/version.txt文件根本不存在,所以无法解析$(cat /workspace/version.txt)这个命令替换,直接把它当成了标签的一部分,导致镜像名称格式错误。

解决方案

去掉顶层的images字段,改用docker push命令在构建步骤里完成推送,这样就能读取到之前步骤生成的版本文件。同时修复Retag步骤里的参数错误(多了一个多余的-)。

修改后的完整配置:

steps:
  - name: 'maven:3.9.1'
    id: Extract project version from pom
    args:
      - '-c'
      - >
        mvn help:evaluate -Dexpression=project.version -q -DforceStdout > /workspace/version.txt
    entrypoint: bash
  - name: 'maven:3.9.1'
    args:
      - '-c'
      - >
        mvn -version &&
        mvn clean install -DskipTests &&
        mvn -B -f ./my-module/pom.xml org.springframework.boot:spring-boot-maven-plugin:build-image -DskipTests
    id: Build all applications and create docker images
    entrypoint: bash
  - name: gcr.io/cloud-builders/docker
    id: Retag my module image
    entrypoint: bash
    args:
      - '-c'
      - >
        VERSION=$(cat /workspace/version.txt) &&
        docker tag my-module:$VERSION europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$VERSION
  - name: gcr.io/cloud-builders/docker
    id: Push my module image to Artifact Registry
    entrypoint: bash
    args:
      - '-c'
      - >
        VERSION=$(cat /workspace/version.txt) &&
        docker push europe-west4-docker.pkg.dev/$PROJECT_ID/my-repo/my-module:$VERSION
  - name: gcr.io/cloud-builders/docker
    args:
      - image
      - list
关键调整说明
  1. 移除顶层images字段:避免初始化阶段的解析错误,改用步骤内的docker push完成推送。
  2. 修复Retag步骤的参数:原配置里args的第一个元素是- - '-c',多了一个多余的-,改为'-c'。
  3. 提取版本到变量复用:在Retag和Push步骤里把版本读取到VERSION变量,避免重复执行cat命令,提升可读性。
  4. 合并构建步骤的命令:用&&连接多个Maven命令,确保前一个命令执行成功才会继续下一个,避免某个命令失败后后续步骤仍执行。

内容的提问来源于stack exchange,提问作者Dimitris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:39:58