如何在Azure DevOps流水线中向Ruby脚本传递JSON字符串参数?
解决Ruby Rake任务接收JSON参数的引号转义问题
问题根源
你遇到的JSON::ParserError是因为命令行中引号转义错误,导致传递给Ruby的JSON字符串被截断或格式损坏。bash会优先解析外层引号和转义字符,使得实际传入Rake任务的JSON不完整。
解决方案
1. 本地终端调用(推荐用环境变量避免转义)
方法一:通过环境变量传递JSON(最可靠)
先将JSON赋值给环境变量,再执行Rake任务:
export JSON_DATA='{"name": "John", "age": 10, "city": "New York"}' rake test:getConfigs
修改Ruby脚本,从环境变量读取JSON:
require 'json' namespace :test do task :getConfigs do json_string = ENV['JSON_DATA'] configs = JSON.parse(json_string) val1 = configs['name'] val2 = configs['age'] puts "#{val1} is #{val2} years old." end end
方法二:正确转义引号的命令行调用
如果坚持用参数传递,需要用单引号包裹整个Rake任务参数,避免bash解析内部双引号:
rake 'test:getConfigs["{\"name\": \"John\", \"age\": 10, \"city\": \"New York\"}"]'
或者用单引号包裹JSON字符串,外层用双引号:
rake "test:getConfigs['{\"name\": \"John\", \"age\": 10, \"city\": \"New York\"}']"
2. Azure DevOps YAML配置(推荐环境变量方案)
方法一:环境变量传递(最稳定)
修改YAML,将流水线变量注入环境变量后执行Rake:
- script: | export JSON_DATA='$(json_data)' rake test:getConfigs
Ruby脚本同样使用环境变量读取(同本地方法一的脚本)。
方法二:参数传递的正确写法
如果必须用参数,需要确保YAML中的引号嵌套正确,让Azure DevOps和bash都能正确解析变量和JSON:
- script: rake "test:getConfigs['$(json_data)']"
注意:如果你的JSON字符串包含单引号,需要额外转义,但示例JSON中没有,此写法可用。
内容的提问来源于stack exchange,提问作者mads
相关产品推荐
相关产品推荐

