如何在Cloud Build YAML中获取GCP Pub/Sub主题推送的消息
Pub/Sub触发Cloud Build时读取消息并做条件分支的实现方案
前置配置:绑定触发器与消息变量
第二个仓库的Cloud Build触发器不要使用代码推送类触发源,新建触发器时选择Pub/Sub消息作为事件类型,绑定第一个仓库发消息的目标主题。
在触发器的替换变量配置区新增自定义变量,例如命名为_RECEIVED_MSG,变量值填写事件路径$(body.message.data)。该路径对应Pub/Sub事件中已经自动完成base64解码的消息正文,无需额外做解码处理。
如果发送的消息是结构化JSON,例如
{"env":"prod","tag":"v1.0.0"},可以直接配置多个变量映射具体字段,比如新增_MSG_ENV变量,值填$(body.message.data.env),构建时可以直接拿到对应字段值,无需额外解析全量消息。
YAML中读取消息与条件执行逻辑
配置完成后,即可在构建配置中通过${_RECEIVED_MSG}(你自定义的变量名)直接引用消息内容,结合Cloud Build原生的步骤条件规则,按消息值执行不同构建步骤。
参考配置示例:
steps: # 调试步骤:打印接收到的消息,排查问题时用 - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - echo "接收到Pub/Sub消息内容:${_RECEIVED_MSG}" # 消息值为prod时执行生产环境部署 - name: 'gcr.io/cloud-builders/gcloud' id: deploy-production entrypoint: 'bash' args: - '-c' - | echo "开始执行生产环境部署流程" # 此处填写生产部署的具体构建、部署命令 when: - _RECEIVED_MSG == 'prod' # 消息值为staging时执行预发环境部署 - name: 'gcr.io/cloud-builders/gcloud' id: deploy-staging entrypoint: 'bash' args: - '-c' - | echo "开始执行预发环境部署流程" # 此处填写预发部署的具体构建、部署命令 when: - _RECEIVED_MSG == 'staging' # 声明自定义替换变量,避免非Pub/Sub触发场景下构建校验报错 substitutions: _RECEIVED_MSG: 'default'
注意事项
- 如果接收到的消息为乱码,检查第一个仓库发布消息时的编码格式,使用
gcloud pubsub topics publish命令直接传入字符串默认使用UTF-8编码,不会有编码问题;如果发送JSON内容,建议先做转义避免格式错误。 - 如果变量取值为空,先到Cloud Build的构建日志中查看触发事件的原始payload,确认
body.message.data路径下存在目标内容,避免变量映射路径写错。 - 如果需要在构建步骤中解析JSON格式的全量消息,可以直接在bash步骤中用
jq工具提取字段,例如TARGET_BRANCH=$(echo ${_RECEIVED_MSG} | jq -r '.branch')即可拿到消息中branch字段的值。
内容的提问来源于stack exchange,提问作者ysdev
相关产品推荐
相关产品推荐

