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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:50:01