问题 如何在Travis-CI配置文件(YAML)中正确使用curl?


好。这慢慢让我发疯。 我在Travis上为我的一个项目设置了CI。我正在运行一些JUnit测试,我想将测试结果上传到我自己的服务器,因此浏览它们要容易得多。

基本上,我想做的就是这样称呼:

curl -H 'Authorization: Token someToken' -X POST http://my.server.com -F filedata=@file.txt

所以这就是我要做的事情 .travis.yml 文件。

after_script:
 - curl -H 'Authorization: Token someToken' -X POST http://my.server.com -F filedata=@file.txt

问题是,对于上面的行我得到一个如下所示的错误:

$ {:"curl -H '\"Authorization"=>"Token someToken\"' -X POST http://my.server.com -F filedata=@file.txt"}
/home/travis/build.sh: line 45: Token someToken"' -X POST http://my.server.com -F filedata=@file.txt}: No such file or directory

我已经了解到,在YAML冒号中代表了一对键值,我发现人们可以使用引号来逃避冒号。

嗯 - 这是我被卡住的地方。我尝试以多种不同的方式应用这些引用,但不知怎的,每次我再次得到相同的错误。

例如:

curl -H '"Authorization: Token someToken"'
curl -H "\"Authorization: Token someToken\""
curl -H "'Authorization: Token someToken'"
curl -H '"Authorization": Token someToken'

我觉得自己很愚蠢,而且我知道解决这个问题可能是一件简单的事情,但是我已经感觉到了“逃避引号而逃避引用”的事情,如果有人能指出我正确的方向,我会真的感激。

当我试图跟随他们解决我的问题时,我也链接到这些问题:

逃离YAML中的冒号

如何在YAML中转义指示符(即:或 - )


7348
2018-01-08 23:11


起源

你可以做 - "curl -H 'Authorization: Token someToken' -X POST http://my.server.com -F filedata=@file.txt"? - набиячлэвэли
不幸的是,我得到了同样的错误。此外,在Travis日志文件中,看起来像引号被忽略。 - scana
另一个可能不是优选的选项是使用带有该命令的shell脚本(或生成它,如果适用)并运行它。 - набиячлэвэли
可能重复 引用YAML(特拉维斯CI) - JBaruch


答案:


在YAML中,冒号是分隔映射键和值的分隔符。

你现在拥有的:

curl -H 'Authorization: token someToken' "https://api.github.com/repos/:owner/:repo/releases/tags/$TRAVIS_TAG"

是一张带钥匙的地图 curl -H 'Authorization 和价值 token someToken' "https://api.github.com/repos/:owner/:repo/releases/tags/$TRAVIS_TAG"。您可以看到它如何进入构建脚本。

你想要的是一个正确引用的字符串:

after_deploy:
  - "curl -H 'Authorization: token someToken' \"https://api.github.com/repos/:owner/:repo/releases/tags/$TRAVIS_TAG\""

8
2018-06-10 01:40



我看到набиячлэвэлиь早些时候提出过这个建议。怎么会失败? - banzaiman
我在我的.tarvis文件中有以下工作正常:after_success: - echo somejson > buildset.json - "curl -H 'Content-Type: application/json' --request POST --data @buildset.json \"https://hooks.website.com/catch/jhsgdjsag76t76\""  但是当我像下面这样使用它时,它失败了。 after_success: - echo somejson > buildset.json - if [ "$TRAVIS_PULL_REQUEST" != "false" ] ; then "curl -H 'Content-Type: application/json' --request POST --data @buildset.json \"https://hooks.website.com/catch/jhsgdjsag76t76\"" ; fi   这里出了什么问题? @banzaiman - Gaurav N


好的 - 通过创建简单的bash脚本,我设法解决(或破解)这个问题:

#!/bin/bash
curl -H 'Authorization: Token someToken' -X POST http://my.server.com -F filedata=@file.txt

然后我继续调用.travis.yml文件中的脚本:

- ./upload_script.sh

所有学分都转到@набиячлэвэлиь,在评论中建议我这个解决方案。

任何其他 - 更好的 - 解决方案都非常受欢迎。


7
2018-01-11 11:49