我有一个包含二进制文件的代码库,我需要这些文件。
我可以
git checkout tags/thetagoftherelease
这似乎是正确的标签,但没有下载二进制文件。我应该如何下载已经添加到发布中的二进制文件(发布页面上的绿色框)?
发布页面上的二进制文件图片:
我有一个包含二进制文件的代码库,我需要这些文件。
我可以
git checkout tags/thetagoftherelease
这似乎是正确的标签,但没有下载二进制文件。我应该如何下载已经添加到发布中的二进制文件(发布页面上的绿色框)?
发布页面上的二进制文件图片:
我已经尝试了好几天,试图找到正确的答案,最终我通过curl命令找到了解决方法。这是一个三步骤的过程。
首先,获取最新发布版本的资产列表:
curl -H "Authorization: token YOURGITHUBTOKEN" \
https://api.github.com/repos/NAME/REPO/releases/latest
然后在JSON中查找您想要的资产的URL。例如,它可能如下所示:
"url": "https://api.github.com/repos/NAME/REPO/releases/assets/1275759"
然后您将此传递给另一个curl命令以检索实际的URL,这实际上是指向Amazon S3文件的链接。
curl -H "Authorization: token YOURGITHUBTOKEN" \
-H "Accept:application/octet-stream" \
-i https://api.github.com/repos/NAME/REPO/releases/assets/1275759
URL将会在HTTP响应的"location"字段中,然后使用curl获取文件,如下:
curl "https://github-cloud.s3.amazonaws.com...." -i -o FILENAME
二进制发布资产存在于Git之外,不能使用标准工具进行管理。
但它们应该可以通过GitHub的API获得。
List the repository's release assets:
GET /repos/:owner/:repo/releases/:id/assets
This will send back a JSON document listing the release assets for the repository, e.g.
[
{
"url": "https://api.github.com/repos/octocat/Hello-World/releases/assets/1",
"browser_download_url": "https://github.com/octocat/Hello-World/releases/download/v1.0.0/example.zip",
"id": 1,
"name": "example.zip",
"label": "short description",
"state": "uploaded",
"content_type": "application/zip",
"size": 1024,
"download_count": 42,
"created_at": "2013-02-27T19:35:32Z",
"updated_at": "2013-02-27T19:35:32Z",
"uploader": {
"login": "octocat",
...
}
}
]
Retrieve the assts from the release you want, as defined by its id
from above:
GET /repos/:owner/:repo/releases/assets/:id
If you want to download the asset's binary content, pass a media type of
"application/octet-stream"
. The API will either redirect the client to the location, or stream it directly if possible. API clients should handle both a200
or302
response.
如文档所述,这些请求都是相对于https://api.github.com
的。
这是我在一个脚本中使用的一个单行命令(不需要认证),用于从Github下载最新版本的 doctl
接口,并解压缩它:
curl -sL $(curl -s https://api.github.com/repos/digitalocean/doctl/releases/latest | grep "http.*linux-amd64.tar.gz" | awk '{print $2}' | sed 's|[\"\,]*||g') | tar xzvf -
如果不使用Linux,请将上面的"http.*linux-amd64.tar.gz"
替换为"darwin"、"windows"等和相应架构。
注意:上述方法在从其他GitHub存储库中编程获取二进制文件时应该有效,但我只测试了doctl
。祝好运-
asseturl=$(curl -H "Authorization: token ${token}" https://api.github.com/repos/${repo}/releases/${releaseid}/assets | jq ".[] | select(.name==\"${filename}\") | .url")
curl -L -H "Authorization: token ${token}" -H "Accept:application/octet-stream" $(echo $asseturl | tr -d '"') > ${filename}
$token
是 github 的访问令牌$filename
是资产的文件名$releaseid
是存储二进制文件的发布 IDreleaseid
,则可以使用以下命令通过名称过滤/repos/{owner}/{repo}/releases
:curl -H "Authorization: token ${token}" https://api.github.com/repos/${owner}/${repo}/releases | jq -r ".[] | select(.name == \"${releasename}\") | .assets[] | select(.name == \"${filename}\") | .url"
。 - cyrf对于Ansible,您可以使用此任务列表(与@ted相同的步骤):
- name: Get latest version
uri:
url: "https://api.github.com/repos/{{github_user}}/{{github_repo}}/releases/latest"
return_content: yes
headers:
Authorization: "token {{ vault_github_deploying_token }}"
register: github_response
- set_fact:
binary_asset_url: "{{ github_response.json.assets|json_query(query) }}"
vars:
query: "[?name=='{{your_github_binary_filename}}'].url | [0]"
- name: Get Binary asset's location
uri:
url: "{{ binary_asset_url }}"
return_content: no
follow_redirects: none
status_code: 302
headers:
Authorization: "token {{ vault_github_deploying_token }}"
Accept: "application/octet-stream"
register: assets
- name: Download binary
get_url:
url: "{{ assets.location }}"
dest: "/tmp/{{ your_github_binary_filename }}"
mode: 0755
wget
可以像浏览器一样通过跟随下载链接直接获取它。$URL
。我的惯例是为二进制版本上传一个后缀。#!/bin/bash
#
# You can fetch some binary directly from release on github
#
# We encourage to build your own version from source.
#
GIT_USER=me
GIT_PROJECT=project_name
BASE_URL=https://github.com/$GIT_USER/$GIT_PROJECT/releases/download
RELEASE=v0.6.3-alpha1
BINARY=bin_file_on_release
if [[ -e $BINARY ]]
then
echo "file in the way: '$BINARY' remove it."
exit 1
fi
if [[ $(getconf LONG_BIT) == "64" ]]
then
echo "I'm 64-bits"
URL="$BASE_URL/$RELEASE/$BINARY"
else
echo "I'm 32-bits"
URL="$BASE_URL/$RELEASE/${BINARY}-32bits"
fi
set -e
echo "Fetching from: $URL"
wget -q -O $BINARY "$URL"
file $BINARY
chmod a+x $BINARY