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"
关键说明
- 避免传递完整JSON:GitHub Actions的输出机制不适合传递多行复杂JSON,提前提取目标字段能避免格式破坏问题。
- 处理无消息场景:jq表达式中的
// empty确保当Messages数组不存在或为空时,返回空字符串,避免jq抛出解析错误。 - 调试辅助:保存原始响应到文件并上传artifact(可添加
actions/upload-artifact步骤),能帮你确认SQS返回的实际JSON结构是否符合预期。
内容的提问来源于stack exchange,提问作者Jesse O
相关产品推荐
相关产品推荐

