GitLab CI:向DynamoDB插入阶段运行时遇YAML语法错误求助
我之前在GitLab CI里处理DynamoDB插入时也踩过类似的YAML语法坑,尤其是在script里写复杂命令和JSON的时候,给你几个亲测可行的解决方案:
方案1:用YAML块标量写多行脚本(最推荐)
YAML的|符号可以完整保留换行和缩进,能完美避开因缩进、引号冲突导致的did not find expected key错误。直接把所有命令放在块里,不用纠结转义:
record_runtime: script: - | # 先计算时间相关参数(这里用UTC时间示例,你可以替换成自己的逻辑) START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") # 模拟计算运行时长(比如从任务开始到当前的秒数) DURATION=$(( $(date +%s) - $(date -d "$START_TIME" +%s) )) # 调用AWS CLI插入DynamoDB aws dynamodb put-item \ --table-name your_runtime_table \ --item '{ "job_id": {"S": "'"$CI_JOB_ID"'"}, "start_time": {"S": "'"$START_TIME"'"}, "duration": {"N": "'"$DURATION"'"} }'
这里的关键细节:
- 所有脚本内容紧跟在
|后面,保持和script:一致的缩进层级 - JSON里的变量用
'"$VAR"'写法:先闭合JSON的单引号,插入shell变量,再重新打开单引号,彻底避免YAML和shell的引号冲突
方案2:用Here-Document单独构造JSON变量
如果需要先把JSON存到变量里再操作,一定要把整个脚本放在|块里,防止YAML把Here-Document的内容当成键值对解析:
record_runtime: script: - | # 计算时间参数 START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") DURATION=$(( $(date +%s) - $(date -d "$START_TIME" +%s) )) # 用Here-Document构造JSON变量 read -r -d '' ITEM_JSON <<EOF { "job_id": {"S": "$CI_JOB_ID"}, "start_time": {"S": "$START_TIME"}, "duration": {"N": "$DURATION"} } EOF # 执行插入 aws dynamodb put-item --table-name your_runtime_table --item "$ITEM_JSON"
方案3:写入临时JSON文件再读取(适合复杂结构)
如果JSON字段特别多、结构复杂,直接写入临时文件是最稳妥的方式,完全避开引号和转义问题:
record_runtime: script: - | START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") DURATION=$(( $(date +%s) - $(date -d "$START_TIME" +%s) )) # 把JSON写入临时文件 cat > runtime_item.json <<EOF { "job_id": {"S": "$CI_JOB_ID"}, "start_time": {"S": "$START_TIME"}, "duration": {"N": "$DURATION"}, "project_name": {"S": "$CI_PROJECT_NAME"} } EOF # 让AWS CLI读取文件内容执行插入 aws dynamodb put-item --table-name your_runtime_table --cli-input-json file://runtime_item.json # 可选:清理临时文件 rm runtime_item.json
常见避坑提示
- 缩进绝对统一:所有
script下的命令必须和script:保持相同的缩进(比如全用2空格或4空格,别混着来) - 别直接用双引号包裹JSON:YAML会解析双引号里的冒号和大括号,容易触发语法错误,优先用单引号或块标量
- 特殊字符转义:如果变量里有空格、引号这类特殊字符,用
printf "%q" "$VAR"转义后再插入JSON
内容的提问来源于stack exchange,提问作者Bonkers
相关产品推荐
相关产品推荐

