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

GitHub Actions中存储SQS JSON输出并提取ReceiptHandle报错解决

解决GitHub Actions中SQS消息ReceiptHandle提取的JSON解析错误

问题原因

你遇到的JSON解析错误,核心原因是GitHub Actions的::set-output会自动将输出内容中的换行符替换为空格,导致你传递的完整SQS响应JSON格式被破坏,jq无法正确解析结构。另外,如果SQS队列中没有消息,返回的JSON会缺少Messages数组,直接访问.Messages[0]也会触发jq报错。

修复方案

步骤1:修改接收消息的步骤,提前解析并输出ReceiptHandle

在接收消息的步骤中直接用jq提取ReceiptHandle,避免传递完整JSON:

- name: Receive Message from SQS Queue
  id: receive_message
  run: |
    RESPONSE=$(aws sqs receive-message --queue-url https://sqs.us-east-1.amazonaws.com/my-queue.fifo \
    --attribute-names All \
    --message-attribute-names All --max-number-of-messages 10 --output json)
    
    # 使用jq提取首个消息的ReceiptHandle,无消息时返回空字符串
    RECEIPT_HANDLE=$(echo "$RESPONSE" | jq -r '.Messages[0].ReceiptHandle // empty')
    
    # 输出提取后的ReceiptHandle
    echo "::set-output name=receipt_handle::$RECEIPT_HANDLE"
    
    # 可选:保存原始响应到文件,用于调试(可配合上传artifact)
    echo "$RESPONSE" > sqs_response.json

步骤2:简化ReceiptHandle检查步骤

直接使用上一步输出的结果,无需再次解析JSON:

- name: Check ReceiptHandle
  id: check_receipt_handle
  run: |
    RECEIPT_HANDLE="${{ steps.receive_message.outputs.receipt_handle }}"
    if [ -z "$RECEIPT_HANDLE" ]; then
      echo "ReceiptHandle is empty. Failing the workflow."
      exit 1
    else
      echo "ReceiptHandle: $RECEIPT_HANDLE"
    fi
    echo "::set-output name=receipt_handle::$RECEIPT_HANDLE"

关键说明

  1. 避免传递完整JSON:GitHub Actions的输出机制不适合传递多行复杂JSON,提前提取目标字段能避免格式破坏问题。
  2. 处理无消息场景:jq表达式中的// empty确保当Messages数组不存在或为空时,返回空字符串,避免jq抛出解析错误。
  3. 调试辅助:保存原始响应到文件并上传artifact(可添加actions/upload-artifact步骤),能帮你确认SQS返回的实际JSON结构是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:42:27