Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用curl将内容为. gitlab -ci.yml的linting请求发布到gitlab api?

如何使用curl将内容为. gitlab -ci.yml的linting请求发布到gitlab api?
EN

Stack Overflow用户
提问于 2020-07-03 08:44:57
回答 1查看 2.2K关注 0票数 0

尝试为gitlab.com ..gitlab ci.yaml文件向去皮 api发出curl请求,但收到错误的请求响应:{"status":400,"error":"Bad Request"}

代码语言:javascript
运行
AI代码解释
复制
#!/usr/bin/env bash


PAYLOAD=$( cat << JSON 
{ "content":
$(<$PWD/../.gitlab-ci.yml)
JSON
)

echo "Payload is $PAYLOAD"

curl --include --show-error --request POST --header "Content-Type: application/json" --header "Accept: application/json" "https://gitlab.com/api/v4/ci/lint" --data-binary "$PAYLOAD"

有没有人通过bash脚本成功地将..gitlab ci.yml链接起来?还尝试将内容有效负载封装在大括号中,并接收相同的响应。

更新

我认为正在发生的情况是,GitLab CI端点希望将.GitLab文件的内容为POST请求转换为json。请参阅这里

修改脚本,在发送之前使用ruby将yaml转换为json,这适用于simple ..gitlab ci.yml。但是,当我的项目使用yaml文件时,它会出现一个错误:当我使用gitlab网页链接文件时,{"status":"invalid","errors":["(\u003cunknown\u003e): did not find expected ',' or ']' while parsing a flow sequence at line 1 column 221"]}%是有效的。

代码语言:javascript
运行
AI代码解释
复制
{"content": "{ \"stages\": [ \"build\", \"test\", \"pages\", \"release\" ], \"variables\": { \"DOCKER_DRIVER\": \"overlay2\" }, \"services\": [ \"docker:19.03.11-dind\" ], \"build:plugin\": { \"image\": \"docker:19.03.11\", \"stage\": \"build\", \"before_script\": [ \"echo \"$CI_JOB_TOKEN\" | docker login -u gitlab-ci-token --password-stdin \"$CI_REGISTRY\"\" ].....

在上面的json摘录中,列221是\"image\": \"docker:19.03.11\",特别是在结束转义引号处。你认为不正确的转义引号是个问题吗?

代码语言:javascript
运行
AI代码解释
复制
#!/usr/bin/env bash

json=$(ruby -ryaml -rjson -e 'puts JSON.pretty_generate(YAML.load(ARGF))' < .gitlab-ci.yml)

# escape quotes
json_content=$(echo $json | perl -pe 's/(?<!\\)"/\\"/g')


# Add object contect for GitLab linter
json_content='{"content": "'${json_content}'"}'

echo "${json_content}"

curl --include --show-error --request POST \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    "https://gitlab.com/api/v4/ci/lint" \
    --data-binary "$json_content"

第二次更新

使用上面的bash脚本,这个yaml文件:

代码语言:javascript
运行
AI代码解释
复制
stages:
  - test
test:
  stage: test
  script:
    - echo "test"

转换为此json:

代码语言:javascript
运行
AI代码解释
复制
{"content": "{ \"stages\": [ \"test\" ], \"test\": { \"stage\": \"test\", \"script\": [ \"echo \"test\"\" ] } }"}

当它被发送到api时,接收以下json错误响应:

代码语言:javascript
运行
AI代码解释
复制
{"status":"invalid","errors":["(\u003cunknown\u003e): did not find expected ',' or ']' while parsing a flow sequence at line 1 column 62"]}% 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 03:33:17

最后,使用以下脚本使其工作:

代码语言:javascript
运行
AI代码解释
复制
#!/usr/bin/env bash

json=$(ruby -ryaml -rjson -e 'puts(YAML.load(ARGF.read).to_json)' custom_hooks/valid.yml)

# escape quotes
json_content=$(echo $json | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))')
echo $json_content

# Add object contect for GitLab linter
json_content="{\"content\": ${json_content}}"

# Output escaped content to file
echo $json_content > custom_hooks/input.json
echo "Escaped json content written to file input.json"

curl --include --show-error --request POST \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    "https://gitlab.com/api/v4/ci/lint" \
    --data-binary "$json_content"

注:B将调整脚本,从系统args中读取文件,而不是固定的文件位置--定制_hooks/valid.yml。另外,JSON响应需要使用jq或python / ruby命令shell进行解析。包括这个脚本的偶然机会,它将帮助他人。

问题是,最初我将文件的YAML内容直接发送到api:

代码语言:javascript
运行
AI代码解释
复制
{ "content": { <contents of .gitlab-yml> } }

GitLab似乎接受在其API中转换为转义JSON字符串的YAML。因此使用ruby将yaml转换为JSON,然后使用python转义由ruby生成的结果JSON。最后能够使用curl将转义的GitLab字符串发送到JSON以验证.

不确定Ruby是否有相当于python的json.dumps的东西..。但是这个解决方案允许我验证gitlab-ci.下一阶段连接到git预提交钩子/服务器端预接收(如果可能的话!)若要防止无效的..gitlab ci.yml文件破坏CI管道。

新手到ruby...since发布了最初的答案,尝试创建一个可以从预提交钩子中使用的ruby脚本,现在只需要bash和ruby:

代码语言:javascript
运行
AI代码解释
复制
#!/usr/bin/env ruby


require 'json'
require 'net/http'
require 'optparse'
require 'yaml'


=begin
POST to GitLab api for linting ci yaml
Params:
+url+ :: Api url
+yaml+ :: Yaml payload for linting
Returns:
Json validation result from API for HTTP response Success
Aborts with HTTP Message for all other status codes
=end
def call_api(url, yaml)
    uri = URI.parse(url)
    
    req = Net::HTTP::Post.new(uri)
    req.content_type='application/json'
    req['Accept']='application/json'
    req.body = JSON.dump({"content" => yaml.to_json})
    
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    https.verify_mode = OpenSSL::SSL::VERIFY_PEER
    
    response = https.request(req)

    case response
        when Net::HTTPSuccess
            puts "request successful"
            return JSON.parse response.body
        when Net::HTTPUnauthorized
            abort("#{response.message}: invalid token in api request?")
        when Net::HTTPServerError
            abort('error' => "#{response.message}: server error, try again later?")
        when Net::HTTPBadRequest
            puts "Bad request..." + request.body
            abort("#{response.message}: bad api request?")
        when Net::HTTPNotFound
            abort("#{response.message}: api request not found?")
        else
            puts "Failed validation\nJSON payload :: #{request.body}\nHTTP Response: #{response.message}"
            abort("#{response.message}: failed api request?")
    end
end


=begin
Display exit report and raise the appropriate system exit code
Params:
+status+ :: Validation status string.  Legal values are valid or invalid
+errors+ :: String array storing errors if yaml was reported as invalid
Returns:
Exits with 0 when successful
Exits with 1 on validation errors or fails to parse legal status value
=end
def exit_report(status, errors)
    case status
        when "valid"
            puts ".gitlab-ci.yml is valid"
            exit(0)
        when "invalid"
            abort(".gitlab-ci.yml is invalid with errors:\n\n" + errors.join("\n"))
        else 
            abort("A problem was encountered parsing status : " + status)  
    end
end


=begin
Load yaml file from path and return contents
Params:
+path+ :: Absolute or relative path to .gitlab-ci.yml file
=end
def load_yaml(path)
    begin
        YAML.load_file(path)
    rescue Errno::ENOENT
        abort("Failed to load .gitlab-ci.yml")
    end
end

=begin
Parse command line options
Returns:
Hash containing keys: {:yaml_file,:url}
=end
def read_args()
    options = {}
    OptionParser.new do |opt|
        opt.on('-f', '--yaml YAML-PATH', 'Path to .gitlab-ci.yml') { |o| options[:yaml_file] = o }
        opt.on('-l', '--url GitLab url', 'GitLab API url') { |o| options[:url] = o }
    end.parse!

    options
end

=begin
Load yaml to send to GitLab API for linting
Display report of linting retrieved from api
Returns:
Exits with 0 upon success and 1 when errors encountered
=end
def main()
    # try and parse the arguments
    options = read_args()
    unless !options.has_key?(:yaml_file) || !options.has_key?(:url)
         # try and load the yaml from path
        puts "Loading file #{options[:yaml_file]}"
        yaml = load_yaml(options[:yaml_file])

        # make lint request to api
        puts "Making POST request to #{options[:url]}"
        response_data=call_api(options[:url], yaml)

        # display exit report and raise appropriate exit code
        unless !response_data.has_key?("status") || !response_data.has_key?("errors")
            exit_report response_data["status"], response_data["errors"]
        else
            puts "Something went wrong parsing the json response " + response_data
        end
    else
        abort("Missing required arguments yaml_file and url, use -h for usage")
    end
end

# start
main
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62719563

复制
相关文章
微软Windows 10的上下文菜单引入Fluent Design风格
微软正在将Fluent Design扩展到Windows 10的更多部分,本周早些时候发布的最新预览版本也带来了这方面的更多变化。在周五发布的更新版本说明中,微软透露Fluent Design在Windows 10 build 17692中也开始部署,半透明效果现在可用于XAML控件。 Windows 10的系统UI控件杂乱的问题一直是被用户诟病的对象,同一个鼠标右键可以按出五六种菜单的尴尬可能已经开始缓解。 Fluent Design现在可用于上下文菜单、弹出窗口、自动建议对话框和下拉菜单以及时间选择器弹
程序你好
2018/07/20
4370
adobe air是干什么的?
Adobe air 是知名软件公司Adobe旗下的产品之一。 Adobe[1]Integrated Runtime允许你利用现有的web开发技能(包括Flash, Flex, HTML, JavaScript, Ajax)优势,建立和配置跨平台(或跨操作系统)的桌面RIA(InternetApplications)应用。2.7以后的版本不再支持桌面Linux操作系统[2]。 对于用户来说,Adobe AIR 实现的跨平台应用,使其不再受限于不同的操作系统,在桌面上即可体验丰富的互联网应用。并且是比以往更低的资源占用、更快的运行速度和顺畅的动画表现。工具。例如 新浪微博客户端微博 AIR、Google Analytics 分析工具、Twitter 客户端 TweetDeck及众多最新影片介绍工具等。 AIR能使你在熟悉的环境下工作,去利用你觉得的最舒适的工具,并且通过支持Flash, Flex, HTML,JavaScript, 以及 Ajax,去建立接近你需要的尽可能好的体验。 AIR 是 Adobe Integrated Runtime的缩写,它是一个跨操作系统的运行时(Runtime),利用现有的Web开发技术(Flash,Flex,HTML,JavaScript,Ajax)来构建‘富Internet’(我一直觉得这个翻译很可悲,Rich被翻译成富后即拗口又不达意)应用程序并部署为桌面应用程序。 AIR 支持现有的Web技术如Flash,Flex,HTML,JavaScript和AJAX,可以用你最熟练的技术来开发您所见过的最具用户体验的RIA程序。 首先,Adobe air 是Adobe公司旗下的产品之一,如果用户用不到该软件,可以卸载。 其次,Adobe Integrated Runtime允许用户利用现有的web开发技能(包括Flash, Flex, HTML, JavaScript, Ajax)优势,建立和配置跨平台(或跨操作系统)的桌面RIA(InternetApplications)应用。对于用户来说,Adobe AIR实现的跨平台应用,使其不再受限于不同的操作系统,在桌面上即可体验丰富的互联网应用。并且是比以往更低的资源占用、更快的运行速度和顺畅的动画表现工具。例如新浪微博客户端、微博 AIR、Google Analytics 分析工具、Twitter 客户端 TweetDeck及众多最新影片介绍工具等。 通俗来说: Adobe Air就是利用Adobe公司的Flash技术开发的视频播放平台。这个视频播放终端运行平台的主要功能就是可以在网上看视频,跟Flash相同,但是功能更强大。 其实通俗的讲Adobe Air就是一个平台,这个平台提供一些软件接口,想开发软件的人员用这些接口和其他的编程技术可以开发出来一些软件。
iOS程序应用
2023/04/17
1.5K0
adobe air是干什么的?
windows经典菜单
StartIsBack+只支持Win8.1系统,Win8系统请使用StartIsBack。
Windows技术交流
2022/07/27
6500
Android 彩色上下文菜单 Context
本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/106954710 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本链接,尤其是脚本之家、码神岛等平台,谢谢配合。
Designer 小郑
2023/08/01
2130
Android 彩色上下文菜单 Context
设置Sublime Text为Adobe Air的开发编辑器
在上一篇关于Adobe Air的文章中1,介绍了如何设置Air的开发环境,由于是跟Web差不多的开发方式,基本上Web所使用的编辑器都是适用的,像Dreamweaver、aptana studio等,当然还有Sublime Text。
GhostZhang
2022/08/22
4470
send,recv,sendto,recvfrom
int send( SOCKET s, const char FAR *buf, int len, int flags );
全栈程序员站长
2022/07/14
1.6K0
适用于windows && macos(intel/m1 Pro Max) Adobe 2022全家桶集合
相遇的日子总是那么难忘,当它以全新的姿态出现时,都会让人眼前一亮!特别是强大的功能和可编辑性,而且Adobe2022专门为m1 Pro Max芯片进行优化和适配,使得其不再需要转译器转译时,大大增加了硬件资源的利用率!从而加快了创作速度。今天,小编将为有需要的网友收集屏蔽验证,支持长期使用的Adobe2022全家桶软件。同时下载地址选用支持全速下载的阿里云盘。
Khan安全团队
2022/04/02
5.3K0
windows 右键菜单的添加和移除
windows下所有系统及部分软件的配置都在注册表中,注册表相当于是一个windows系统的数据库.我们想要增加或更改一些功能可以通过修改注册表的方法实现.
caoayu
2020/09/23
2.4K0
windows 右键菜单的添加和移除
【说站】python PyQt创建上下文菜单
2、将contextMenuPolicy设置为Qt.ActionsContextMenu,以便在上下文菜单中显示操作小部件。
很酷的站长
2022/11/24
3990
安卓开发_浅谈ContextMenu(上下文菜单)
长下文菜单,即长按view显示一个菜单栏 与OptionMenu的区别 OptionMenu对应的是activity,一个activity只能拥有一个选项菜单 ContextMenu对应的是View,每个View都可以设置上下文菜单 一般情况下ContextMenu常用语ListView或者GridView; 创建和响应上下文菜单过程: 1.在activity的onCreate(...)方法中为一个view注册上下文菜单 2.在onCreateContextMenuInfo(...)中生成上下文菜单。 3.
听着music睡
2018/05/18
1.5K0
sendto & recvfrom 详解
sendto和recvfrom一般用于UDP协议中,但是如果在TCP中connect函数调用后也可以用.
全栈程序员站长
2022/09/15
2.5K0
send()、sendto()和recv()、recvfrom()的使用
udp通讯中的sendto()需要在参数里指定接收方的地址/端口,recvfrom()则在参数中存放接收发送方的地址/端口,与之对应的send()和recv()则不需要如此,但是在调用send()之前,需要为套接字指定接收方的地址/端口(这样该函数才知道要把数据发往哪里),在调用recv()之前,可以为套接字指定发送方的地址/端口,这样该函数就只接收指定的发送方的数据,当然若不指定也可,该函数就可以接收任意的地址的数据。(这些内容前面文章udp通讯中的connect()和bind()函数 有详细讲过)
全栈程序员站长
2022/09/15
1.8K0
send()、sendto()和recv()、recvfrom()的使用
用于 Windows 下的日志跟踪分析工具(Tail for Windows)
在 Linux 下做开发和调试任务的时候,有些情况会动态去跟踪一些日志的变化来调试问题。Linux 下使用 tail -f 就可以达到需求了,但 Windows 下一直没有找到类似的好用工具,在 github 上也有一些开源项目,不是项目相对陈旧界面丑陋,就是功能不完善不能让人专注于分析日志。索性自己做了一个,预览图如下:
我与梦想有个约会
2020/01/05
1.3K0
用于 Windows 下的日志跟踪分析工具(Tail for Windows)
在 Linux 下做开发和调试任务的时候,有些情况会动态去跟踪一些日志的变化来调试问题。Linux 下使用 tail -f 就可以达到需求了,但 Windows 下一直没有找到类似的好用工具,在 github 上也有一些开源项目,不是项目相对陈旧界面丑陋,就是功能不完善不能让人专注于分析日志。索性自己做了一个,预览图如下:
我与梦想有个约会
2018/11/07
7.4K2
在Excel中自定义上下文菜单(下)
在本文开头的VBA示例中,你看到了如何通过使用工作簿的Activate和Deactivate事件调用宏来创建和删除菜单控件,从而来更改单元格上下文菜单。
fanjy
2022/11/16
2.7K0
用于 Windows 下的日志跟踪分析工具(Tail for Windows)
在 Linux 下做开发和调试任务的时候,有些情况会动态去跟踪一些日志的变化来调试问题。Linux 下使用 tail -f 就可以达到需求了,但 Windows 下一直没有找到类似的好用工具,在 github 上也有一些开源项目,不是项目相对陈旧界面丑陋,就是功能不完善不能让人专注于分析日志。索性自己做了一个,预览图如下:
我与梦想有个约会
2018/11/07
1.8K0
Windows开始菜单无响应
之前遇到过Windows开始菜单点击无响应,最近又遇到开始菜单搜索无响应或多次重启才可以使用。 所以我将解决方法记录一下方便自己。
繁华是客
2023/03/03
2.1K0
工作中遇到的小技巧 一(暂停更新)
       如果浏览器的缓存已满,服务速度可能会减慢,您可能无法下载和查看附件。一下是在Internet Explorer中清空浏览器缓存的步骤:
DannyHoo
2022/05/09
7930
工作中遇到的小技巧 一(暂停更新)
【说站】python PyQt事件处理实现上下文菜单
在创建上下文菜单的方法上,我们已经介绍过一种简单的方法。本篇所要带来的方法略有难度,但在控制和调用上比较方便。
很酷的站长
2022/11/24
3840
在Excel中自定义上下文菜单(上)
上下文菜单(也称为快捷菜单)是在一些随用户交互之后出现的菜单,通常是鼠标右键单击操作。在Microsoft Office中,上下文菜单提供了一组在应用程序的当前状态或上下文中可用的有限选项。通常,可用的选择是与选定对象(如单元格或列)相关的操作。
fanjy
2022/11/16
2.9K0
在Excel中自定义上下文菜单(上)

相似问题

Adobe Air -通过上下文菜单粘贴图像

12

Adobe Air for Windows 64位?

42

控制windows Adobe AIR的顺序

10

如果Adobe Air影响Adobe Air或与Adobe Air冲突

22

Adobe air -右键单击树节点时添加上下文菜单

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档