Есть ли ссылка на GitHub для загрузки файла в последней версии репозитория?

Используя функцию GitHub Release, можно указать ссылку для загрузки определенной версии опубликованного программного обеспечения. Тем не менее, каждый раз, когда выполняется релиз, gh-страница также нуждается в обновлении.

Есть ли способ получить ссылку на конкретный файл любой последней версии программного обеспечения?

например, это будет статическая ссылка:

https://github.com/USER/PROJECT/releases/download/v0.0.0/package.zip

Мне хотелось бы что-то типа:

https://github.com/USER/PROJECT/releases/download/latest/package.zip

ПРИМЕЧАНИЕ. Разница между этим вопросом и Последний выпуск GitHubчто этот вопрос специально просит получить доступ к файлу, а не последняя версия GitHub

Ответ 1

Несколько лет спустя, но я просто внедрил простое перенаправление для поддержки https://github.com/USER/PROJECT/releases/latest/download/package.zip. Это должно быть перенаправлено на последний помеченный ресурс package.zip. Надеюсь, это удобно!

Ответ 2

Linux-решение для получения последней ссылки на ссылку для доступа к релизу (работает только в том случае, если релиз имеет только один актив)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4

Ответ 3

Вы можете сделать ajax- запрос, чтобы получить URL-адрес последней загрузки, используя API GitHub Releases. Это также показывает, когда это было выпущено и количество загрузок:

function GetLatestReleaseInfo() {
  $.getJSON("https://api.github.com/repos/ShareX/ShareX/releases/latest").done(function(release) {
    var asset = release.assets[0];
    var downloadCount = 0;
    for (var i = 0; i < release.assets.length; i++) {
      downloadCount += release.assets[i].download_count;
    }
    var oneHour = 60 * 60 * 1000;
    var oneDay = 24 * oneHour;
    var dateDiff = new Date() - new Date(asset.updated_at);
    var timeAgo;
    if (dateDiff < oneDay) {
      timeAgo = (dateDiff / oneHour).toFixed(1) + " hours ago";
    } else {
      timeAgo = (dateDiff / oneDay).toFixed(1) + " days ago";
    }
    var releaseInfo = release.name + " was updated " + timeAgo + " and downloaded " + downloadCount.toLocaleString() + " times.";
    $(".download").attr("href", asset.browser_download_url);
    $(".release-info").text(releaseInfo);
    $(".release-info").fadeIn("slow");
  });
}

GetLatestReleaseInfo();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="download" href="https://github.com/ShareX/ShareX/releases/latest">Download</a>
<p class="release-info"></p>

Ответ 4

В командной строке с помощью curl и jq извлекается первый файл последней версии:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'

Ответ 5

Другое решение для Linux, использующее curl и wget для загрузки одного двоичного файла с последней версии

curl -s -L https://github.com/bosun-monitor/bosun/releases/latest | egrep -o '/bosun-monitor/bosun/releases/download/[0-9]*/scollector-linux-armv6' | wget --base=http://github.com/ -i - -O scollector

Пояснение:

curl -s -L заключается в том, чтобы молча загрузить последнюю версию HTML (после следующей переадресации)

egrep -o '...' использует regex для поиска нужного файла

wget --base=http://github.com/ -i - преобразует относительный путь из конвейера в абсолютный URL

и -O scollector задает желаемое имя файла.

может добавить -N только для загрузки, если файл новее, но S3 давал 403 запретную ошибку.

Ответ 6

Как отмечалось ранее, jq полезен для этого и других API REST.

tl; dr - более подробная информация ниже

Предполагая, что вы хотите релиз MacOS:

URL=$( curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
   | jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url' )
curl -LO "$URL"

Решение для атомных релизов

Обратите внимание, что в каждом репо могут быть разные способы предоставления нужного артефакта, поэтому я продемонстрирую для хорошо себя ведущего, такого как атом.

Получить имена активов опубликованы

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
    | jq -r '.assets[] | .name'

atom-1.15.0-delta.nupkg
atom-1.15.0-full.nupkg
atom-amd64.deb
...

Получить URL загрузки для желаемого ресурса

Ниже atom-mac - мой желаемый актив с помощью jq select(.name=="atom-mac.zip")

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
    | jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url'

https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip

Скачать артефакт

curl -LO "https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip"

JQ Детская площадка

Синтаксис JQ может быть сложным. Вот площадка для экспериментов с jq выше: https://jqplay.org/s/h6_LfoEHLZ

Безопасность

Вы должны принять меры, чтобы обеспечить достоверность загруженного артефакта через sha256sum и gpg, если это вообще возможно.

Ответ 7

Решение, использующее (внутренний) wget для получения содержимого HTML, отфильтруйте его для zip файла (с помощью egrep), а затем загрузите zip файл (с помощью внешнего wget).

wget https://github.com/$(wget https://github.com/<USER>/<PROJECT>/releases/latest -O - | egrep '/.*/.*/.*zip' -o)

Ответ 8

Просто используйте один из URL-адресов ниже, чтобы загрузить последнюю версию: (например, взял URL-адреса из проекта биллинга): https://api.github.com/repos/boxbilling/boxbilling/releases

Загрузите последнюю версию в формате zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Загрузите последнюю версию в виде tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball

Нажмите на один из URL-адресов, чтобы мгновенно загрузить последнюю версию. Как я уже писал эти строки, в настоящее время: boxbilling-boxbilling-4.20-30-g452ad1c [.zip/.tar.gz]

ОБНОВЛЕНИЕ: Нашел другой URL в моих лог файлах (см. пример выше)https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master

Ответ 9

Не возможно в соответствии с поддержкой GitHub на 2018-05-23

Связаться с [email protected] 2018-05-23 с сообщением:

Можете ли вы просто подтвердить, что в настоящее время нет ничего кроме возни с API?

и они ответили:

Спасибо, что обратились. Мы рекомендуем использовать API для получения последней версии, потому что этот подход стабилен, задокументирован и не подлежит изменению в ближайшее время:

https://developer.github.com/v3/repos/releases/#get-the-latest-release

Я также буду отслеживать это по адресу: https://github.com/isaacs/github/issues/658

Решение Python без каких-либо зависимостей

Надежный и портативный:

#!/usr/bin/env python3

import json
import urllib.request

_json = json.loads(urllib.request.urlopen(urllib.request.Request(
    'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases/latest',
     headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

Смотрите также:

Также рассмотрите предварительные выпуски

/latest не видит предварительные выпуски, но это легко сделать, поскольку /releases сначала показывает самый последний:

#!/usr/bin/env python3

import json
import urllib.request

_json = json.loads(urllib.request.urlopen(urllib.request.Request(
    'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases',
     headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json[0]['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

Ответ 10

В ссылка на релизы на странице справки упоминается кнопка "Последний выпуск", но это не дает вам ссылку для загрузки.

https://github.com/reactiveui/ReactiveUI/releases/latest

Для этого вам нужно сначала получить последний тег (как указано в URL-адрес GitHub для последней версии файла загрузки?"):

latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip

Ответ 11

в PHP - перенаправление на последнюю версию загрузки. Просто разместите свое веб-пространство

<?php

/**
 * Download latest release from github release articats
 * License: Public Domain
 */

define('REPO', 'imi-digital/iRobo');

$opts = [
    'http' => [
        'method' => 'GET',
        'header' => [
            'User-Agent: PHP'
        ]
    ]
];

$context = stream_context_create($opts);

$releases = file_get_contents('https://api.github.com/repos/' . REPO . '/releases', false, $context);
$releases = json_decode($releases);

$url = $releases[0]->assets[0]->browser_download_url;

header('Location: ' . $url);

Ответ 12

Если вы хотите использовать только curl, вы можете попробовать с помощью -w '%{url_effective}', который печатает URL-адрес после цепочки перенаправления (за которым следует завиток, если вы вызываете его с помощью -L). Итак, например

curl -sLo /dev/null -w '%{url_effective}' https://github.com/github-tools/github/releases/latest

выводит https://github.com/github-tools/github/releases/tag/v3.1.0.

Ответ 13

Github теперь поддерживает статические ссылки для загрузки отдельных файлов из последней версии: https://help.github.com/en/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip

Ответ 14

Я хочу скачать релизы из файла README.md в описании репозитория. Там я не могу выполнить JavaScript.

Я могу добавить такие ссылки в файл README или на страницы github для всех моих репозиториев:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Загружает последний файл релиза из репозитория.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Это работает, потому что установлен реферер JavaScript, а хранилище для загрузки определяется через document.referrer. Таким образом, ссылка также будет работать для вилок.

Вы можете найти исходный код здесь, разветкить или просто использовать мой репозиторий.

Ответ 15

В случае, если репо использует только теги вместо выпуска - ср. jQuery - решения, основанные на одном URL-адресе, не работают.

Вместо этого вам нужно запросить все теги, отсортировать их и создать URL-адрес загрузки. Я реализовал такое решение для языка Go и jQuery repo: Ссылка на Github.

Возможно, это помогает кому-то.