如何使用Bash中的GitHub API?

时间:2016-02-16 00:00:24

标签: json bash github github-api

我有一个回购,我正在Bash中写一个'安装脚本'。我的计划是将我想要安装的所有脚本安装在repo根目录下的scripts/目录中,并在最顶层安装一个名为install的脚本。

我的计划是让用户运行这样的东西:

curl -sSL http://github.com/me/repo/raw/master/install | bash

并且安装脚本将下载GitHub上目录中的所有脚本并将它们放在适当的位置。

我的问题,我将如何从Bash做到这一点?例如,GitHub以JSON的形式返回其API响应,那么我将如何解析脚本中的响应内容?有没有办法改变响应格式,所以它可以是Bash-parseable? (如果你为我的特定用例提供一个明确的例子,可以给予奖励。)

感谢。

1 个答案:

答案 0 :(得分:4)

您不应该为此使用Github API。您可以指示用户获取原始文件:

curl -sSL https://raw.githubusercontent.com/me/repo/master/install | bash

这显然是common idiom

另外,我更喜欢使用流程替换:

bash <(curl -sSL https://raw.githubusercontent.com/me/repo/master/install)

如果你想使用它,这会使标准输入不受伤害。

如果我误解了,并且您打算使用API​​来获取脚本列表,那么这将是一个多步骤的过程:

  1. https://api.github.com/repos/user/repo/branches/master属性中获取url的分支树。
  2. 在该树的条目中查找目录(https://api.github.com/repos/user/repo/git/trees/hash) - 查找tree类型的实体,pathscripts
  3. 然后在 树(blob
  4. 中查找https://api.github.com/repos/user/repo/git/trees/hash类型的条目
  5. 获取每个blob,(https://api.github.com/repos/user/repo/git/blobs/hash)然后base64 - 解码content属性(编码也在encoding属性中指定,因此&# 39;要处理的事情。)
  6. 只需在scripts目录中维护脚本列表,使用curl -sSL https://raw.githubusercontent.com/me/repo/master/scripts/list-of-scripts然后curl获取脚本就会轻松得多。然后你可以这样做,例如:

    curl -sSL https://raw.githubusercontent.com/me/repo/master/scripts/list-of-scripts |
      xargs -L1 -i{} curl -sSL https://raw.github.com/me/repo/master/scripts/{}
    

    如果您确实必须使用API​​,最简单的方法是使用the jq tool。在脚本中下载(根据需要更改版本,操作系统和体系结构):

    curl -sSL https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 > jq
    chmod +x jq
    

    现在开始漫长的折磨之旅:

    tree_url=$(curl -sSL https://api.github.com/repos/user/repo/branches/master | 
      ./jq -r '.commit.commit.tree.url')
    script_tree=$(curl -sSL "$tree_url" | 
      ./jq -r '.tree[] | select(.type == "tree" and .path == "scripts") | .url')
    curl -sSL "$script_tree" | 
      ./jq -r '.tree[] | select(.type == "blob") | .url' | 
       xargs curl -sSLO
    

    现在在每个新下载的文件上运行base64 -d(您可以使用循环而不是xargs来简化它。)

    或者,对于最后一步,您可以这样做:

    curl -sSL "$script_tree" | 
      ./jq -r '.tree[] | select(.type == "blob") | .path' |
      xargs -L1 -i{} curl -sSLO https://raw.githubusercontent.com/me/repo/master/scripts/{}